RHCE 考试笔记
考试速查笔记
- 查找模块
1 | ansible-doc -l | grep <关键字> |
- 模块说明
1 | ansible-doc -s <模块名> |
- 导航器预演剧本
(--check)
一定要保证执行剧本时位于ansible.cfg同目录下。
1 | ansible-navigator run -C <playbook.yml> |
- 保存事实变量为文件方便查阅
1 | ansible servera -m setup > facts |
- 查找软件包安装的
roles位置
1 | yum search roles |
- 修改容器镜像仓库配置文件
1 | vim /etc/containers/registries.conf # 无需重启 |
第 1 题:安装和配置 Ansible
题目
按照下方所述,在控制节点 workstation.lab.example.com 上安装和配置 Ansible:
- 安装所需的软件包
- 创建名为
/home/devops/ansible/inventory的静态清单文件, 以满足以下需求:servera是dev主机组的成员serverb是test主机组的成员serverc和serverd是prod主机组的成员bastion是balancers主机组的成员prod组是webservers主机组的成员
- 创建名为
/home/devops/ansible/ansible.cfg的配置文件, 以满足以下要求:- 主机清单文件为
/home/devops/ansible/inventory - playbook 中使用的角色的位置包括
/home/devops/ansible/roles - playbook 中使用的集合的位置包括
/home/devops/ansible/mycollections
- 主机清单文件为
笔记 ansible.cfg
1 | # 安装必须软件,复制配置文件 |
inventory示例
1 | [dev] |
ansible.cfg示例,可通过ansible-config init > /tmp/ansible.cfg生成完整示例
1 | [defaults] |
第 2 题:创建受管节点存储库
题目
请按照下方所述, 创建一个名为/home/devops/ansible/yum_repo.yml的playbook, 该剧本在各个受管
节点上安装yum存储库:
- 存储库1:
- 存储库的名称为
rh294_BASE - 描述为
rh294 base software - 基础 URL 为
http://content.example.com/rhel9.0/x86_64/dvd/BaseOS - GPG 签名检查为启用状态
- GPG 密钥 URL 为
http://content.example.com/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhat-release - 存储库为开启状态
- 存储库的名称为
- 存储库2:
- 存储库的名称为
rh294_STREAM - 描述为
rh294 stream software - 基础 URL 为
http://content.example.com/rhel9.0/x86_64/dvd/AppStream - 签名检查为启用状态
- GPG 密钥 URL 为
http://content.example.com/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhat-release - 存储库为开启状态
- 存储库的名称为
笔记:模块yum_repository
1 | # yum_repo.yml |
验证:
1 | ansible all -m shell -a 'yum clean all && yum makecache' |
第 3 题:安装软件包
题目
创建一个名为 /home/devops/ansible/packages.yml 的 playbook:
- 将
php和mariadb软件包安装到dev、test和prod主机组中的主机上 - 将
Development Tools软件包组安装到dev主机组中的主机上 - 将
dev主机组中主机上的所有软件包更新为最新版本
笔记:模块 yum
1 | # packages.yml |
"{{ var }}"jinja2 引用变量时要用双引号括起来。
第 4 题:使用 Timesync RHEL 系统角色
题目
安装 RHEL 系统角色软件包,并创建符合以下条件的 playbook /home/devops/ansible/timesync.yml:
- 在所有受管节点上运行
- 使用
timesync角色 - 配置该角色,以使用当前有效的 NTP 提供
- 配置该角色,以使用时间服务器
classroom.example.com
笔记:角色 timesync
timesync.yml示例
1 | - name: 使用 timesync 角色 |
- 可以直接复制角色的
README的示例。- 考试使用的角色都来自
rhel-system-roles软件包,位于/usr/share/ansible/roles/
第 5 题:使用 SELINUX RHEL 系统角色
题目
安装 RHEL 角色,并使用 seLinux 角色,要求在所有节点运行,将 SELINUX 设置为强制模式
笔记:角色 selinux
1 | - name: 使用 selinux 角色 |
第 6 题:使用 Ansible Galaxy 安装角色
题目
使用 Ansible Galaxy 和要求文件 /home/devops/ansible/roles/requirements.yml,从以下 URL 下载
角色并安装到 /home/devops/ansible/roles:
- http://classroom.example.com/content/haproxy.tar.gz 此角色的名称应当为
balancer - http://classroom.example.com/content/phpinfo.tar.gz 此角色的名称应当为
phpinfo
笔记:命令 ansible-galaxy role install
编辑依赖列表
1 | - name: balancer |
1 | # 默认安装到当前目录 ansible.cfg 指定的位置,保险起见加上 -p 指定安装位置 |
第 7 题:安装集合
题目
将 http://content.example.com/ 以下集合,下载到 /home/devops/ansible/mycollections 目录下,并
面向用户 devops
ansible-posix-1.5.1.tar.gzcommunity-general-6.3.0.tar.gz
笔记:命令 ansible-galaxy collection install
1 | # 默认安装到当前目录 ansible.cfg 指定的位置,保险起见加上 -p 指定安装位置 |
第 8 题:创建和使用角色
题目
根据下列要求,在 /home/devops/ansible/roles 中创建名为 apache 的角色:
httpd软件包已安装,设为在系统启动时启用- 防火墙已启用并正在运行,并使用允许访问 Web 服务器的规则
- 模板文件
index.html.j2已存在,用于创建具有以下输出的文件/var/www/html/index.html:Welcome to HOSTNAME on IPADDRESS- 其中,
HOSTNAME是受管节点的完全限定域名,IPADDRESS则是受管节点的 IP 地址。
- 按照下方所述,创建一个使用此角色的 playbook
/home/devops/ansible/newrole.yml:- 该 playbook 在
webservers主机组中的主机上运行
- 该 playbook 在
笔记:命令 ansible-galaxy role init
- 在
roles目录下初始化一个 role
1 | ansible-galaxy role init apache --init-path /home/devops/ansible/roles |
- 编辑模板文件
roles/apache/templates/index.html.j2
1 | Welcome to {{ ansible_hostname }} on {{ ansible_default_ipv4.address }} |
事实变量提前使用
setup模块重定向到文件查阅。
- 编辑任务
roles/apache/tasks/main.yml
1 | - name: 安装 httpd |
第 9 题:从 Ansible Galaxy 使用角色
题目
根据下列要求,创建一个名为 /home/devops/ansible/roles.yml 的 playbook:
- playbook 中包含一个 play,该 play 在
balancers主机组中的主机上运行并将使用balancer角色。- 此角色配置一项服务,以在 webservers 主机组中的主机之间平衡 Web 服务器请求的负载。
- 浏览到
balancers主机组中的主机(例如http://bastion.lab.example.com/)将生成以下输出:Welcome to serverc.example.com on 172.25.250.12
- 重新加载浏览器将从另一 Web 服务器生成输出:
Welcome to serverd.example.com on 172.25.250.13
- playbook 中包含一个 play,该 play 在
webservers主机组中的主机上运行并将使用phpinfo角色。- 通过 URL /hello.php 浏览到 webservers 主机组中的主机将生成以下输出:
- Hello PHP World from FQDN
- 其中,FQDN是主机的完全限定名称。
- 例如,浏览到
http://serverc.lab.example.com/hello.php会生成以下输出:Hello PHP World from serverc.lab.example.com- 另外还有 PHP 配置的各种详细信息,如安装的PHP 版本等。
- 同样,浏览到
http://serverd.lab.example.com/hello.php会生成以下输出:Hello PHP World from serverd.lab.example.com- 另外还有 PHP 配置的各种详细信息,如安装的PHP 版本等。
- 通过 URL /hello.php 浏览到 webservers 主机组中的主机将生成以下输出:
笔记:使用角色
roles.yml示例
1 | - hosts: webservers # 用于采集事实变量 |
第 10 题:创建和使用逻辑卷
题目
创建一个名为 /home/devops/ansible/lv.yml 的 playbook,它将在所有受管节点上运行以执行下列任务
- 创建符合以下要求的逻辑卷:
- 逻辑卷创建在
research卷组中 - 逻辑卷名称为
data - 逻辑卷大小为
600MiB
- 逻辑卷创建在
- 使用
ext4文件系统格式化逻辑卷 - 如果无法创建请求的逻辑卷大小,应显示错误消息
Could not create logical volume of that size,并且应改为使用大小400MiB。
- 如果卷组
research不存在 ,应显示错误消息Volume group does not exist
- 不要以任何方式挂载逻辑卷。
笔记:模块 lvol filesystem
lv.yml示例
1 | - hosts: all |
第 11 题:创建分区(难点)
题目
创建一个名为 /home/devops/ansible/parted.yml 的 playbook,它将在 dev 主机组上运行下列任务
- 如果磁盘
/dev/vdd存在,则创建1500m分区 - 如果无法创建请求的分区大小,应显示错误消息
Could not create partition of that size,并且应改为使用大小800m。
- 如果磁盘/dev/vdd不存在 ,应显示错误消息
disk /dev/vdd does not exist
- 如果磁盘
/dev/vdb存在,则创建1500m分区 - 如果无法创建请求的分区大小,应显示错误消息
笔记:模块 parted filesystem mount
parted.yml示例
1 | - hosts: dev |
- 分区默认从
1MiB开始,所以要在n+1MiB结束- 务必在被控节点使用
lsblk检查结果
第 12 题:生成主机文件(难点)
题目
- 编写模板文件
/home/devops/ansible/hosts.j2,针对每个清单主机包含一行内容,其格式与/etc/hosts相同。 - 创建名为
/home/devops/ansible/hosts.yml的playbook,它将使用此模板在dev主机组中的主机上生成文件/etc/myhosts。 - 该 playbook 运行后,
dev主机组中主机上的文件/etc/myhosts应针对每个受管主机包含一行内容。
笔记: 魔法变量
hosts.j2示例
1 | 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 |
hosts.yml示例
1 | - hosts: all # 收集事实变量 |
groups魔法变量,含主机清单中所有主机的列表,其中groups.all是all分组下的所有主机的列表;host自定义变量,在groups.all中遍历(servera,serverb等);hostvars魔法变量,含主机清单中所有主机的变量,hostvars[host]则是每次循环按顺序变成主机列表中某台主机的变量(hostvars[servera],hostvars[serverb]等);ansible_default_ipv4.addressansible_fqdnansible_hostname事实变量,可通过setup模块单独收集。
第 13 题:修改文件内容
题目
按照下方所述,创建一个名为 /home/devops/ansible/issue.yml 的 playbook:
- 该 playbook 将在所有清单主机上运行
- 该 playbook 会将
/etc/issue的内容替换为下方所示的一行文本:- 在
dev主机组中的主机上,这行文本显示为:Development - 在
test主机组中的主机上,这行文本显示为:Test - 在
prod主机组中的主机上,这行文本显示为:Production
- 在
笔记:模块 copy 魔法变量 group_names
issue.yml示例
1 | - hosts: all |
第 14 题:创建 Web 内容目录
题目
按照下方所述,创建一个名为 /home/devops/ansible/webcontent.yml 的 playbook:
- 该 playbook 在
dev主机组中的受管节点上运行 - 创建符合下列要求的目录
/webdev:- 拥有组为
devops组 - 具有常规权限:
owner=read+write+execute,group=read+write+execute,other=read+execute - 具有特殊权限:
set group ID
- 拥有组为
- 用符号链接将 /var/www/html/webdev 链接到 /webdev
- 创建文件 /webdev/index.html,其中包含如下所示的单行文本:Development
- 在 dev 主机组中主机上浏览此目录(例如 http://servera.lab.example.com/webdev/ )将生成以下输出:
Development
笔记:模块 file
webcontent.yml示例
1 | - hosts: dev |
第 15 题:生成硬件报告
题目
创建一个名为 /home/devops/ansible/hwreport.yml 的 playbook,它将在所有受管节点上生成含有以下信息的输出文件 /root/hwreport.txt:
- 清单主机名称
- 以 MB 表示的总内存大小
- BIOS 版本
- 磁盘设备
vda的大小 - 磁盘设备
vdb的大小 - 输出文件中的每一行含有一个
key=value对。
您的 playbook 应当:
- 从
http://172.25.254.254/content/hwreport.empty下载文件,并将它保存为/root/hwreport.txt - 使用正确的值修改
/root/hwreport.txt - 如果硬件项不存在,相关的值应设为
NONE
笔记:模块 get_url replace
hwreport.yml示例
1 | - hosts: all |
大部分是事实变量,通过
setup模块单独收集后查询。
第 16 题:创建密码库
题目
按照下方所述,创建一个 Ansible 库来存储用户密码:
- 库名称为
/home/devops/ansible/locker.yml - 库中含有两个变量,名称如下:
pw_developer,值为Imadevpw_manager,值为Imamgr
- 用于加密和解密该库的密码为
fgydsxsxsbxs - 密码存储在文件
/home/devops/ansible/secret.txt中
笔记:命令 ansible-vault encrypt
locker.yml示例
1 | pw_developer: Imadev |
- 加密文件
1 | ansible-vault encrypt locker.yml |
- 保存密码
1 | echo fgydsxsxsbxs > secret.txt |
第 17 题:创建用户账户(难点)
题目
- 从
http://172.25.254.254/content/user_list.yml下载要创建的用户的列表,并将它保存到/home/devops/ansible,用户密码来自于/home/devops/ansible/locker.yml文件。 - 创建名为
/home/devops/ansible/users.yml的 playbook,从而按以下所述创建用户帐户:- 职位描述为
developer的用户应当:- 在
dev和test主机组中的受管节点上创建 - 从
pw_developer变量分配密码 - 是附加组
devops的成员
- 在
- 职位描述为
manager的用户应当:- 在
prod主机组中的受管节点上创建 - 从
pw_manager变量分配密码 - 是附加组
opsmgr的成员
- 在
- 职位描述为
- 密码应采用 SHA512 哈希格式。
- 您的 playbook 应能够在本次考试中使用在其他位置创建的库密码文件
/home/devops/ansible/secret.txt正常运行。
笔记:模块 user group
- 下载文件
1 | wget http://172.25.254.254/content/user_list.yml |
users.yml示例
1 | - hosts: dev, test |
- jinja2 对密码进行哈希的语法是
{{ password | password_hash('sha512') }}ansible-navigator run指定密码文件的方法是--vault-password-file
在
user_list.yml这个例子中
1
2
3
4
5
6
7
8
9
10 users:
- name: bob
job: developer
uid: 1101
- name: sally
job: manager
uid: 1102
- name: fred
job: developer
uid: 1103
users对应的变量值是一个列表,列表中每个元素是一个字典,loop对列表里的所有元素进行遍历,item在每一轮循环拿一个元素(在这里是字典),item.name引用字典中name键值对应的变量值。
第 18 题:更新 Ansible 库的密钥
题目
按照下方所述,更新现有 Ansible 库的密钥:
- 从
http://172.25.254.254/content/salaries.yml下载 Ansible 库到/home/devops/ansible - 当前的库密码为
insecure4sure - 新的库密码为
bbe2de98389b - 库使用新密码保持加密状态
笔记:命令 ansible-vault rekey
1 | wget http://172.25.254.254/content/salaries.yml |
第 19 题:创建计划任务
题目
为 natasha 创建一个计划任务,要求每隔 2 分钟执行一次 echo hello,playbook 文件名为 cron.yml,该 playbook 在 dev 主机组上运行。
笔记:模块 cron
cron.yml示例
1 | - hosts: dev |