题目描述
创建一个名为 /home/greg/ansible/hwreport.yml
的 playbook, 它将在所有受管节点上生成含有以下信息的输出文件 /root/hwreport.txt
:
- 清单主机名称;
- 以
MB
表示的总内存大小; BIOS
版本;- 磁盘设备
vda
的大小; - 磁盘设备
vdb
的大小; - 输出文件中的每一行含有一个
key=value
对。
您的 playbook 应当:
- 从
http://materials/hwreport.empty
下载文件,并将它保存为/root/hwreport.txt
; - 使用正确的值改为
/root/hwreport.txt
; - 如果硬件项不存在,相关的值应设为
NONE
.
详细解析
本题需要下载文件,因此需要用到 get_url
模块,由于还需要替换 hwreport.txt
文件中的内容,因此还需要用到 replace
模块。此外,由于题目要求不存在的硬件项对应的值需要设置为 NONE
, 因此,我们还需要用到 when
关键字。
需要特别注意的是,本题的 playbook 中涉及许多 Ansible 主机变量,我们需要准确记住这些变量的写法。
我们可以在做题之前,先找一个与题目无关的目录,用 wget
命令将题目中给出来的 hwreport.empty
文件下载下来,之后,使用 cat
命令查看一下其中的内容,这样我们就可以对之后需要替换哪些部分有一个了解。
在编写本文时,我所使用的考试模拟环境中,hwreport.empty
文件中的内容如下:
# Hardware report HOST=inventoryhostname MEMORY=memory_in_MB BIOS=BIOS_version DISK_SIZE_VDA=disk_vda_size DISK_SIZE_VDB=disk_vdb_size
接着,根据题目要求创建并编辑如下 playbook:
vim /home/greg/ansible/hwreport.yml
本题中的 playbook 全文如下:
--- - name: hosts: all tasks: - name: get_url: url: http://materials/hwreport.empty dest: /root/hwreport.txt - name: replace: path: /root/hwreport.txt regexp: "inventoryhostname" replace: "{{ ansible_hostname }}" - name: replace: path: /root/hwreport.txt regexp: "memory_in_MB" replace: "{{ ansible_memory_mb }}" - name: replace: path: /root/hwreport.txt regexp: "BIOS_version" replace: "{{ ansible_bios_version }}" - name: replace: path: /root/hwreport.txt regexp: "disk_vda_size" replace: "{{ ansible_devices.vda.size }}" when: "'vda' in ansible_devices" - name: replace: path: /root/hwreport.txt regexp: "disk_vda_size" replace: "NONE" when: "'vda' not in ansible_devices" - name: replace: path: /root/hwreport.txt regexp: "disk_vdb_size" replace: "ansible_devices.vdb.size" when: "'vdb' in ansible_devices" - name: replace: path: /root/hwreport.txt regexp: "disk_vdb_size" replace: "NODE" when: "'vdb' not in ansible_devices"
运行上面的 playbook:
ansible-playbook /home/greg/ansible/hwreport.yml
测试 playbook 的执行结果:
ansible all -m command -a "cat /root/hwreport.txt"