红帽 RHCE8 认证考试:生成主机文件

题目描述

  • 将一个初始模板文件从 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 模块则可以借助 srcdest 参数实现将带有配置参数的模板文件传递到目标受控端主机上的目的。

本题的做题逻辑就是在下载得到的 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