RHCE-B12. 利用playbook生成所有清单主机指定硬件信息报告

红帽RHCE考试下午-RHCE(RH294)

RH294任务概览

  • 考试时间4个小时,6台虚拟机,15道题
  • 原来通过脚本或者集群做的题现在都需要使用playbook实现
  • 考试时大概有6台虚拟服务器,都已经做好了互相的免密
  • 做题在ansible控制节点workstation做,但是需要去其他虚拟服务器进行验证
  • 考试时需要将6台虚拟服务器在考试环境全部开启,物理机界面点击左侧按钮启动
  • 考试时Ansible所有playbook都放在普通用户目录中且都以普通用户执行
  1. 注意:考试时一定注意要求将playbook放在指定用户的家目录中,用指定的用户登录做题!
  2. 注意:考试的判分方式通过普通用户远程执行指定目录下的playbook或者脚本,如果使用root做题,则没有权限就是零分

12. 利用playbook生成所有清单主机指定硬件信息报告

  • 创建一个名为 /home/student/ansible/hwreport.yml 的 playbook,
  • 它将在所有受管节点上生成含有以下信息的输出文件 /root/hwreport.txt:

任务要求

  • 输出文件 /root/hwreport.txt
  1. hostname: inventoryhostname
  2. mem: memory_in_MB
  3. bios: BIOS_version
  4. vda: disk_vda_size
  5. vdb: disk_vdb_size
  • 输出文件中的每一行含有一个 key=value 对。
  • playbook 应当从 http://content.example.com/fifiles/hwreport.empty 下载文件,并将它保存为/root/hwreport.txt
  • 使用正确的值修改 /root/hwreport.txt
  • 如果硬件项不存在,相关的值应设为NONE

注意:

准备个工作

  • 考试期间不需要做
  • ##这个 hwreport.empty 文件我们没有可以自己定义一个
hostname: inventoryhostname 
mem: memory_in_MB
biso: BIOS_version 
asize: disk_vda_size 
bsize: disk_vdb_size
  • 也可以通过playbook创建,就当练习了
vim hwreport_empty.yml
---
- name: Create empty file  
   hosts: dev  
       tasks:          
           - name: Create file            
              copy:                    
                  content: "hostname: inventoryhostname\nmem: memory_in_MB\nbiso: BIOS_version\nasize: disk_vda_size\nbsize: disk_vdb_size\n"
                  dest: /webdev/hwreport.empty
                  setype: httpd_sys_content_t
  • 要求将这个模板文件下载到各个主机上面去,并且模板中内容中的值要显示各个主机中的不同相关内容

完成步骤

  • 考试的时候先试试能不能下载
    wget http://content.example.com/fifiles/hwreport.empty
  • 写playbook
  1. 先用get_url模块进行下载
  2. 再用replace模块将下载到的文件进行内容的替换
    注意:通过ansible servera -m debug -a 'msg="{{ hostvars}}"'显示主机inventoryhostname信息查找对应变量名
    注意:通过ansible servera -m setup >setup.info"'显示主机硬件信息信息查找对应变量名
    注意:通过 if 条件判断,is是一个测试关键词,相当于判断是否存在,defined是ansible里的测试符号
[student@workstation ansible]$ vim hwreport.yml
---
- name: Get hwreport info 
  hosts: all
  tasks:
    - name: Create report file 
      get_url:
        url: http://content.example.com/files/hwreport.empty 
        dest: /root/hwreport.txt
    - name: Get inventory_hostname 
      replace:
        path: /root/hwreport.txt 
        regexp: 'inventoryhostname'
        replace: '{{ inventory_hostname }}'
    - name: Get memory total size 
      replace:
        path: /root/hwreport.txt 
        regexp: 'memory_in_MB'
        replace: "{{ ansible_memtotal_mb | string}}" ## 内存大小是个数值,替换成字符串进行输出
    - name: Get bios version 
      replace:
        path: /root/hwreport.txt 
        regexp: 'BIOS_version'
        replace: "{{ ansible_bios_version }}"
    - name: Get disk vda size 
      replace:
        path: /root/hwreport.txt 
        regexp: 'disk_vda_size'
        replace: "{{ ansible_devices.vda.size if ansible_devices.vda is defined else 'NONE' }}" ## 对变量是否存在进行条件判断
    - name: Get disk vdb size 
      replace:
      path: /root/hwreport.txt 
      regexp: 'disk_vdb_size'
      replace: "{{ ansible_devices.vdb.size if ansible_devices.vdb is defined else 'NONE' }}"
[student@workstation ansible]$ ansible-playbook hwreport.yml
  • 验证
    for i in server{a..d} bastion;do ssh@$i "cat /root/hwreport.txt";done
    ansible all -m shell -a "cat /root/hwreport.txt"

  • 有时间的话再挨个登陆上去测试一下子

#验证
[root@bastion ~]# cat /root/hwreport.txt
hostname: bastion
mem: 821
bios: 1.11.1-4.module+el8.1.0+4066+0f1aadab 
vda: 10.00 GB
vdb: NONE 
[root@serverb ~]# cat hwreport.txt 
hostname: serverb
mem: 821
bios: 1.11.1-4.module+el8.1.0+4066+0f1aadab 
vda: 10.00 GB
vdb: 5.00 GB

考察的知识点

ansible get_url模块

  • 功能: 用于将文件从http、https或ftp下载到被管理机节点上
url: 下载文件的URL,支持HTTP,HTTPS或FTP协议
dest: 下载到目标路径(绝对路径),如果目标是一个目录,就用服务器上面文件的名称,如果目标设置了名称就用目标设置的名称
owner: 指定属主
group: 指定属组
mode: 指定权限
force: 如果yes,dest不是目录,将每次下载文件,如果内容改变,替换文件。如果否,则只有在目标不存在时才会下载该文件
checksum: 对目标文件在下载后计算摘要,以确保其完整性
##示例: checksum="sha256:D98291AC[...]B6DC7B97",
checksum="sha256:http://example.com/path/sha256sum.txt"
url_username: 用于HTTP基本认证的用户名。 对于允许空密码的站点,此参数可以不使用`url_password'
url_password: 用于HTTP基本认证的密码。 如果未指定`url_username'参数,则不会使用`url_password'参数
validate_certs: 如果“no”,SSL证书将不会被验证。 适用于自签名证书在私有网站上使用
timeout: URL请求的超时时间,秒为单位

ansible replace模块

  • 该模块有点类似于sed命令,主要也是基于正则进行匹配和替换,可以灵活的修改文件中的内容
• path:必须参数,指定要修改的文件,2.3版本之前,这个参数叫dest、destfile、name;现在这三个名称是path参数的别名
• regexp:必须参数,查找的内容,指定一个正则表达式,可以是python正则
• replace:替换后的内容,替换regexp参数匹配到的字符串,
• owner:结果文件或目录的所属用户名,相当于chown命令修改
• group:结果文件或目录的所属组名,相当于chown命令修改
• mode:结果文件或目录的权限,与chmod命令不一致的是,replace模块的mode参数需要添加前导零,以便ansible的YAML解析器知道它是八进制;1.8版本后可以设置为符号模式(u+rwx或u=rw),2.6版本后可以是特殊字符串(preserve),当设置为’preserve’时,文件将被赋予与源文件相同的权限。
• others:可以指定file模块的所有参数
• encoding:用于读取和写入文件的字符编码
• before:如果指定,则仅替换/删除此匹配之前的内容,可以和after参数结合使用
• after:如果指定,则仅替换/删除此匹配之后的内容,可以和before参数结合使用
• attributes:结果文件或目录的特殊属性,相当chattr,默认使用=运算符,指定文件或目录的某项属性
• backup:修改源文件前创建一个包含时间戳信息的备份文件

Ansible Setup 模块

  • 功能: setup 模块来收集主机的系统信息,这些 facts 信息可以直接以变量的形式使用
ansible all -m setup > setup.info
ansible all -m setup -a "filter=ansible_nodename"
ansible all -m setup -a "filter=ansible_hostname"
ansible all -m setup -a "filter=ansible_domain"
ansible all -m setup -a "filter=ansible_memtotal_mb"
ansible all -m setup -a "filter=ansible_memory_mb"
ansible all -m setup -a "filter=ansible_memfree_mb"
ansible all -m setup -a "filter=ansible_os_family"
ansible all -m setup -a "filter=ansible_distribution_major_version"
ansible all -m setup -a "filter=ansible_distribution_version"
ansible all -m setup -a "filter=ansible_processor_vcpus"
ansible all -m setup -a "filter=ansible_all_ipv4_addresses"
ansible all -m setup -a "filter=ansible_architecture"
ansible all -m setup -a "filter=ansible_uptime_seconds"
ansible all -m setup -a "filter=ansible_processor*"
ansible all -m setup -a 'filter=ansible_env'

Ansible 变量引用

  • Ansible 使用 “{{ var }}” 来引用变量. 如果一个值以 “{” 开头, YAML 将认为它是一个字典, 所以我们必须像这样引用它
    foo: "{{ variable }}"
上一篇:5W1H分析法和5W2H分析法


下一篇:ansible设置环境变量不生效的问题:ansible etcd -m shell -a "export ETCDCTL_API=3"