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

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

在大数据运维环境下,对主机名要求比较严格,所以对大数据节点的主机名要进行统一规划,然后集中设置,如果本地没有建立DNS解析服务器,还需要对每个节点添加本地解析,也就是将每个节点的ip和主机名的对应关系添加到/etc/hosts文件中。要解决这两个问题,只需要两个playbook脚本即可自动完成。

要批量更改每个节点的主机名,首先需要修改ansible中/etc/ansible/hosts文件内容,添加如下配置:

[hostall]
213.229   hostname=namenodemaster
213.230   hostname=slave001
213.231   hostname=slave002

这里定义了一个名为hostall的主机组,组中有三台主机,每个主机IP后面跟了一个hostname变量,变量后面就是定义好的主机名,而这个变量可以在playbook脚本中直接引用。

接下来就可以编写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脚本,内容如下:

- 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应用案例

我们的程序安装在/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中进行引用了。

最后,再回到上面这个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

如果执行成功,会有绿色、浅黄色输出提示,如果执行失败,可以看红色输出内容,判断检查问题。

2、主机自动建立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

3、自动化安装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和环境变量就都配置好了。

文章版权声明

 1 原创文章作者:汇维网,如若转载,请注明出处: http://www.52hwl.com/1915.html

 2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈

 3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)

 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别

发表评论

登录后才能评论