题目描述
- 将一个初始模板文件从
http://materials/hosts.j2
下载到/home/greg/ansible
; - 完成该模板,以便用它生成以下文件:针对每个清单主机包含一行内容,其格式与
/etc/hosts
相同; - 创建名为
/home/greg/ansible/hosts.yml
的 playbook ,它将使用此模板在dev
主机组中的主机上生成文件/etc/myhosts
; - 该 playbook 运行后,
dev
主机组中主机上的文件/etc/myhosts
应针对每个受管主机包含一行内容:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.25.250.9 node1.lab.example.com node1 172.25.250.10 node2.lab.example.com node2 172.25.250.11 node3.lab.example.com node3 172.25.250.12 node4.lab.example.com node4 172.25.250.13 node5.lab.example.com node5
注:清单主机名称的显示顺序不重要。
详细解析
在本题中,我们需要用到 Jinjia2 模版文件(文件后缀名为 .j2
)以及 template
模块。其中 Jinjia2 模板文件可以实现动态表达式和动态变量的引用,而 template
模块则可以借助 src
和 dest
参数实现将带有配置参数的模板文件传递到目标受控端主机上的目的。
本题的做题逻辑就是在下载得到的 hosts.j2
配置文件中添加题目要求的动态参数,之后编写一个 playbook, 将 hosts.j2
文件传递到目标主机组中的目标文件上。
按照要求,首先进入到 /home/greg/ansible
目录下,之后,使用 wget
命令下载 http://materials/hosts.j2
:
wget http://materials/hosts.j2
之后,打开下载得到的 hosts.j2
, 可以看到如下默认存在的内容:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
接着,按照题目要求,在上面默认存在的内容下方,添加如下内容:
{% for i in groups.all %} {{ hostvars[i].ansible_enp1s0.ipv4.address }} {{ hostvars[i].ansible_fqdn }} {{ hostvars[i].ansible_hostname }} {% endfor %}
[1].
groups.all
为受控端主机的清单;[2].
hostvars
为主机变量;[3].
enp1s0
是受控端主机的网卡名称,我们可以通过ping
受控端主机的方式先确定受控端主机对外使用的IP
地址,然后使用ssh
登录到受控端主机上,使用ip a
命令查看与该IP
地址对应的网卡的名称并复制下来使用。
之后,按照题目要求,创建并编辑如下 playbook:
vim /home/greg/ansible/hosts.yml
在该 playbook 中调用 template
模块,写入如下内容:
--- - name: hosts: all - name: hosts: dev tasks: - name: template: src: hosts.j2 dest: /etc/myhosts
[1]. 由于我们需要在
hosts.j2
文件中调用受控端的所有主机变量而不仅仅是dev
主机组中的主机变量,因此,我们需要在 playbook 的前面使用如下配置先调用出所有主机,否则运行该 playbook 的时候会报错:
– name:
hosts: all
运行 playbook:
ansible-playbook /home/greg/ansible/hosts.yml
playbook 运行完毕之后,可以使用 ansible dev -m command -a "cat /etc/myhosts"
命令查看 dev
主机组上的 /etc/myhosts
文件中是否包含题目所要求的内容。如果命令执行完毕之后返回的结果类似下面这样,则表明本题已经成功完成:
[greg@control ansible]$ ansible dev -m command -a "cat /etc/myhosts" node1 | CHANGED | rc=0 >> 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.25.250.9 node1.lab.example.com node1 172.25.250.10 node2.lab.example.com node2 172.25.250.13 node5.lab.example.com node5 172.25.250.11 node3.lab.example.com node3 172.25.250.12 node4.lab.example.com node4