在大数据运维环境下,对主机名要求比较严格,因此对大数据节点的主机名要进行统一规划,而后集中设置,若是本地没有创建DNS解析服务器,还须要对每一个节点添加本地解析,也就是将每一个节点的ip和主机名的对应关系添加到/etc/hosts文件中。要解决这两个问题,只须要两个playbook脚本便可自动完成。html
要批量更改每一个节点的主机名,首先须要修改ansible中/etc/ansible/hosts文件内容,添加以下配置:node
[hostall] 213.229 hostname=namenodemaster 213.230 hostname=slave001 213.231 hostname=slave002
这里定义了一个名为hostall的主机组,组中有三台主机,每一个主机IP后面跟了一个hostname变量,变量后面就是定义好的主机名,而这个变量能够在playbook脚本中直接引用。shell
接下来就能够编写playbook脚本了,内容以下:服务器
- hosts: hostall remote_user: root tasks: - name: change name shell: "echo {{hostname}} > /etc/hostname" - name: shell: hostname {{hostname}}
这个脚本中,变量{{hostname}}以及值就是在/etc/ansible/hosts文件中定义的“hostname=namenodemaster”这部份内容。经过使用shell模块,实现将定义好的主机名添加到每一个远程主机的/etc/hostname文件中(限于RHEL/Centos7/8系统),而后执行hostname命令使其生效。运维
每一个主机名修改完毕后,还须要构建一个本地解析文件(IP和主机名对应的文件),而后传到每一个远程主机上,要实现这个功能,能够编写以下playbook脚本,内容以下:ssh
- hosts: hostall remote_user: root roles: - roles tasks: - name: add localhost local_action: shell echo "127.0.0.1 localhost" > {{AnsibleDir}}/roles/templates/hosts.j2 run_once: true - set_fact: ipaddress={{hostvars[inventory_hostname].ansible_default_ipv4.address}} - set_fact: hostname={{hostvars[inventory_hostname].ansible_facts.hostname}} - name: add host record local_action: shell echo {{ipaddress}} {{hostname}} >> {{AnsibleDir}}/roles/templates/hosts.j2 - name: copy hosts.j2 to allhost template: src={{AnsibleDir}}/roles/templates/hosts.j2 dest=/etc/hosts
这个playbook中,使用了角色中的变量,因此要了解下咱们这个ansible的默认目录结构,以下图所示:ide
咱们的程序安装在/etc/ansible命令下,在这个目录中有三个子目录,分别是files 、templates 和roles,files目录主要是存放一些要拷贝的远程主机的程序文件,templates 目录下存放的是一些配置好的模板文件,这些模板文件会统一拷贝到远程主机中,最后,还有一个roles目录,此目录下咱们建立了一个main.yml文件,用来定义角色变量,main.yml中变量定义方式以下:工具
server1_hostname: 172.16.213.229 server2_hostname: 172.16.213.230 server3_hostname: 172.16.213.231 AnsibleDir: /etc/ansible BigdataDir: /opt/bigdata hadoopconfigfile: /etc/hadoop
其中,每行内容中冒号前面的就是变量名,后面的内容是变量的值,定义变量后,就能够在playbook中进行引用了。oop
最后,再回到上面这个playbook文件中,因为要使用角色变量,因此引入了roles关键字,接下来,在tasks任务中,首先使用了local_action模块,在管理机上生成了一个模板文件hosts.j2,注意这里面的变量{{AnsibleDir}}就是在main.yml中定义好的,run_once表示这个本地shell仅仅执行一次,接着经过set_fact定义了两个变量ipaddress和hostname,这两个变量都从ansible内置变量中获取具体的值,而后将获取到的ipaddress和hostname值写入管理机上的hosts.j2文件中,最后一个操做步骤是经过template模块,将hosts.j2模板文件拷贝到远程主机的/etc/目录下并重命名为hosts文件。学习
将此脚本放到/etc/ansible目录下,并命名为hosts.yml,而后执行以下命令:
[root@server239 ansible]# ansible-playbook hosts.yml
若是执行成功,会有绿色、浅黄色输出提示,若是执行失败,能够看红色输出内容,判断检查问题。
大数据环境下,为了安装、配置和维护的方便,通常会设置管理机(安装ansible的机器)和每一个集群节点之间的无密码登陆(单向信任),而无密码登陆最简单的方式是经过设置ssh公私钥认证机制,下面playbook脚本能够完成管理机到远程主机组hostall的无密码登陆,脚本内容以下:
- hosts: hostall gather_facts: no roles: - roles tasks: - name: close ssh yes/no check lineinfile: path=/etc/ssh/ssh_config regexp='(.*)StrictHostKeyChecking(.*)' line="StrictHostKeyChecking no" - name: delete /root/.ssh/ file: path=/root/.ssh/ state=absent - name: create .ssh directory file: dest=/root/.ssh mode=0600 state=directory - name: generating local public/private rsa key pair local_action: shell ssh-keygen -t rsa -b 2048 -N '' -f /root/.ssh/id_rsa - name: view id_rsa.pub local_action: shell cat /root/.ssh/id_rsa.pub register: sshinfo - set_fact: sshpub={{sshinfo.stdout}} - name: add sshkey local_action: shell echo {{sshpub}} > {{AnsibleDir}}/roles/templates/authorized_keys.j2 - name: copy authorized_keys.j2 to all hosts template: src={{AnsibleDir}}/roles/templates/authorized_keys.j2 dest=/root/.ssh/authorized_keys mode=0600 tags: - copy sshkey
这个playbook稍微复杂一些,它仍然用到了角色变量,因此此脚本要放在/etc/ansible目录下,脚本一开始经过lineinfile模块对远程主机上的sshd配置文件ssh_config进行文件内容替换,这个替换是关闭ssh第一次登录时给出的“yes/no”提示,接着在远程主机上删除/root/.ssh目录,并从新建立此目录,这个操做的目的是确保远程主机/root/.ssh目录是干净的、权限正确的。而后经过local_action模块在管理机上生成一对公私钥,同时将生成的公钥文件内容做为变量sshinfo的值,并经过set_fact模块从新定义一个变量sshpub,此变量引用sshinfo变量的stdout输出,也就是最终的公钥值,紧接着,将变量sshpub的内容写入管理机authorized_keys.j2模板文件中,最后,使用template模块将authorized_keys.j2模板文件拷贝到每一个远程主机的/root/.ssh目录下,并重命名为authorized_keys,同时给文件授于属主读、写权限。
将此脚本放到/etc/ansible目录下,并命名为ssh.yml,而后执行以下命令:
[root@server239 ansible]# ansible-playbook ssh.yml
自动化安装JDK是大数据运维中最多见的一个场景,JDK通常咱们下载二进制版本解压便可使用,因此安装JDK的过程就是把下载好的JDK程序拷贝到远程主机的过程,JDK安装完成后,还要添加JAVA_HOME到系统环境变量中,以让系统识别安装的JDK,下面的这个playbook文件就是自动化安装JDK的整个过程,内容以下:
- hosts: hostall remote_user: root roles: - roles tasks: - name: mkdir jdk directory file: path={{BigdataDir}} state=directory mode=0755 - name: copy and unzip jdk unarchive: src={{AnsibleDir}}/roles/files/jdk.tar.gz dest={{BigdataDir}} - name: set env lineinfile: dest=/etc/profile line="{{item.value}}" state=present with_items: - {value: "export JAVA_HOME={{BigdataDir}}/jdk"} - {value: "export PATH=$JAVA_HOME/bin:$PATH"} - name: chmod bin file: dest={{BigdataDir}}/jdk/bin mode=0755 recurse=yes - name: enforce env shell: source /etc/profile
此脚本中的BigdataDir、AnsibleDir都是角色变量,前面已经定义过具体的路径了,其中,jdk.tar.gz位于管理机上,脚本最后经过item.value这个变量将JDK环境变量写入到了/etc/profile文件的最后,这个变量的定义和引用方式须要引发你们注意。
将此脚本放到/etc/ansible目录下,并命名为jdk.yml,而后执行以下命令:
[root@server239 ansible]# ansible-playbook jdk.yml
脚本执行成功的话,那么jdk和环境变量就都配置好了。
https://edu.51cto.com/course/23377.html ,Ansible与Ansible-playbook应用实战视频课程,帮助一次性掌握Ansible自动化运维工具的使用。