大数据运维环境下ansible-playbook应用案例

一、批量更改主机名并生成本地解析

在大数据运维环境下,对主机名要求比较严格,因此对大数据节点的主机名要进行统一规划,而后集中设置,若是本地没有创建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的默认目录结构,以下图所示:
大数据运维环境下ansible-playbook应用案例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

若是执行成功,会有绿色、浅黄色输出提示,若是执行失败,能够看红色输出内容,判断检查问题。

二、主机自动创建ssh信任

大数据环境下,为了安装、配置和维护的方便,通常会设置管理机(安装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程序拷贝到远程主机的过程,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自动化运维工具的使用。

相关文章
相关标签/搜索