红帽RHCE考试下午-RHCE(RH294)
RH294任务概览
- 考试时间4个小时,6台虚拟机,15道题
- 原来通过脚本或者集群做的题现在都需要使用playbook实现
- 考试时大概有6台虚拟服务器,都已经做好了互相的免密
- 做题在ansible控制节点workstation做,但是需要去其他虚拟服务器进行验证
- 考试时需要将6台虚拟服务器在考试环境全部开启,物理机界面点击左侧按钮启动
- 考试时Ansible所有playbook都放在普通用户目录中且都以普通用户执行
- 注意:考试时一定注意要求将playbook放在指定用户的家目录中,用指定的用户登录做题!
- 注意:考试的判分方式通过普通用户远程执行指定目录下的playbook或者脚本,如果使用root做题,则没有权限就是零分
12. 利用playbook生成所有清单主机指定硬件信息报告
- 创建一个名为 /home/student/ansible/hwreport.yml 的 playbook,
- 它将在所有受管节点上生成含有以下信息的输出文件 /root/hwreport.txt:
任务要求
- 输出文件 /root/hwreport.txt
- hostname: inventoryhostname
- mem: memory_in_MB
- bios: BIOS_version
- vda: disk_vda_size
- 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
- 先用get_url模块进行下载
- 再用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 }}"