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的默认目录结构,如下图所示:
我们的程序安装在/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 原创文章作者:汇维网,如若转载,请注明出处: https://www.52hwl.com/1915.html
2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈
3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)
4 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别