# 作者@@老马

整理时间：2023-12

# RHCE9 考试

请查阅以下重要配置信息，以了解考试环境相关的信息。

考试时间4小时。

请注意，考试过程中不能与其他考生交流，您也不得连接到其他考生的主机，测验系统及其网络会受到监控，不当使用可导致成绩判为零分。

请执行下方列出的任务。在开始操作前，您不妨先通读整个列表。这些项目将使用一个分数来评分，这些任务的总分为 300 分，您必须达到 210 分或以上才能获得认证。

## 重要配置信息

在考试期间，除了您就坐位置的台式机之外，还将使用多个虚拟系统。您不具有台式机系统的 root 访问权，但具有对虚拟系统的完整 root 访问权。

### 系统信息

在本考试期间，您将操作下列虚拟系统：

系统 | IP地址 | 角色
--- | --- | ---
bastion.lab.example.com | 172.25.250.254 | Ansible control node
workstation.lab.example.com | 172.25.250.9 | Ansible managed node
servera.lab.example.com | 172.25.250.10 | Ansible managed node
serverb.lab.example.com | 172.25.250.11 | Ansible managed node
serverc.lab.example.com | 172.25.250.12 | Ansible managed node
serverd.lab.example.com | 172.25.250.13 | Ansible managed node

这些系统的 IP 地址采用静态设置。请勿更改这些设置。主机名称解析已配置为解析上方列出的完全限定主机名，同时也解析主机短名称。

### 帐户信息

- 所有系统的 `root` 密码是 `redhat`。请勿更改 `root` 密码。
- 除非另有指定，否则这将是用于访问其他系统和服务的密码。
- 除非另有指定，否则此密码也应用于您创建的所有帐户或者任何需要设置密码的服务。
- 为方便起见，所有系统上已预装了 SSH 密钥，允许在不输入密码的前提下通过 SSH 进行访问。请勿对系统上的 SSH 配置文件进行任何修改。
- Ansible 控制节点上已创建了用户帐户 `devops`。此帐户预装了 SSH 密钥，允许在 Ansible 控制节点和各个 Ansible 受管节点之间进行 SSH 登录。请勿对系统上的 SSH 配置文件进行任何修改。

### 其他信息

- 一些考试项目可能需要修改 Ansible 主机清单。您要负责确保所有以前的清单组和项目保留下来，与任何其他更改共存。您还要有确保清单中所有默认的组和主机保留您进行的任何更改。

- 考试系统上的防火墙默认为不启用，SELinux 则处于强制模式。

- 如果需要安装其他软件，您的物理系统和 Ansible 控制节点可能已设置为指向 content 上的下述存储库：

  - http://content.example.com/rhel9.0/x86_64/dvd/BaseOS
  - http://content.example.com/rhel9.0/x86_64/dvd/AppStream

- 一些项目需要额外的文件，这些文件已在以下位置提供：http://materials.example.com/laoma/

- 产品文档可从以下位置找到：http://materilas.example.com/docs/

- 容器镜像仓库信息：`utility.lab.example.com`

  - 账号：`admin`
  - 密码：`redhat`

- 其他资源也进行了配置，供您在考试期间使用。关于这些资源的具体信息将在需要这些资源的项目中提供。

### 重要评测信息

除非另有指定，否则您的所有工作（包括 Ansible playbook、配置文件和主机清单等）应当保存在控制节点上的目录 /home/devops/ansible 中，并且应当归 `devops` 用户所有。所有 Ansible 相关的命令应当由 `devops` 用户从 Ansible 控制节点上的这个目录运行。

请注意，在评分之前，您的 Ansible 受管节点系统将重置为考试开始时的初始状态，您编写的 Ansible playbook 将通过以 `devops` 用户身份从控制节点上的目录 `/home/devops/ansible` 目录运行来应用。在 playbook 运行后，系统会对您的受管节点进行评估，以判断它们是否按照规定进行了配置。

### 虚拟系统管理

考试期间，您可以随时关闭或重新引导虚拟机系统。您可以从虚拟系统本身进行这项操作，也可以从物理系统控制虚拟系统。要从物理系统访问或控制考试系统，单击桌面上VM控制台图标。这会显示一个表格，包含每个虚拟机系统的对应按钮，单击特定虚拟机系统的按钮将弹出一个菜单，包含用来控制该系统的选项：

- 启动节点VM：如果指定的虚拟系统未在运行，该选项将启动指定系统。如果系统已经在运行-则该选项无任何作用。

- 重新引导节点VM：正常关闭考试虚拟系统，然后重启。

- 关闭节点VM：正常关闭指定虚拟系统。

- 关闭节点VM电源：立即关闭指定虚拟系统。

- 控制台：这将打开一个窗口，用于连接到指定虚拟系统的控制台。请注意，如果将焦点移动到此窗口，控制台将抓住您的鼠标。要恢复鼠标，同时键入 `Ctrl+Alt`。

- 重建节点VM：将当前 VM 还原为原始状态。系统将弹出一个单独的窗口，要求您确认操作。

  警告！！！ 您在 VM 上完成的所有操作都将丢失。仅当系统无法使用时才应使用这个功能。在使用这个功能之前，确保关闭 VM。

## 考试小技巧

1. 仔细检查鼠标和键盘，特别是鼠标右键和中间。
2. 尽可能使用 `tab` 键补全。
3. 考试过程中用到的名称、路径等字符串，使用复制粘贴。
4. 保持终端清洁，每做完一个题目，执行 `clear` 命令或使用快捷键 `CTRL+L` 清屏。
5. 根据需要，打开多个终端，例如查看帮助。

## 练习环境准备

将文件 prepare_rhce9.sh、rhce9-exam294.zip 上传到foundation0上root用户家目录，然后执行以下命令：

    ​x1[root@foundation0 ~]# chmod +x /root/prepare_rhce9.sh2[root@foundation0 ~]# /root/prepare_rhce9.sh3Reset all VMs:4  Wait for classroom running ..................................... DONE5  Wait for bastion running ....................................... DONE6  Wait for workstation running ................................... DONE7  Wait for utility running ....................................... DONE8  Wait for servera running ....................................... DONE9  Wait for serverb running ....................................... DONE10  Wait for serverc running ....................................... DONE11  Wait for serverd running ....................................... DONE12Prepare foundation ............................................... DONE13Setup bastion .................................................... DONE14Setup servera .................................................... DONE15Setup serverb .................................................... DONE16
    17-----------------------------------------------------------------------18         按 Super 键，搜索 EXAM，打开试题，按回车键开始答题19-----------------------------------------------------------------------

脚本执行完成后开始做题。

## 练习题

### 1. 安装和配置 Ansible

按照下方所述，在控制节点 bastion.lab.example.com 上安装和配置 Ansible：

- 安装所需的软件包

- 创建名为 `inventory` 的静态清单文件，以满足以下要求：

  - `workstation` 是 `balancers` 主机组的成员
  - `servera` 是 `dev` 主机组的成员
  - `serverb` 是 `test` 主机组的成员
  - `serverc` 和 `serverd` 是 `prod` 主机组的成员
  - `prod` 组是 `webservers` 主机组的成员

- 创建名为 `ansible.cfg` 的配置文件，以满足以下要求：

  - 主机清单文件为 `inventory`
  - `playbook` 中使用的角色位置为 `roles`
  - `playbook` 中使用的内容集位置为 `mycollections`

### 2. 配置您的系统以使用默认存储库

作为系统管理员，您需要在受管节点上安装软件。

请按照下方所述，创建一个名为 `yum_repo.yml` 的 playbook，在各个受管节点上安装 yum 存储库：

- 存储库1：

  - 存储库的名称为：EX294_BASE
  - 描述为：EX294 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：

  - 存储库的名称为：EX294_STREAM
  - 描述为：EX294 stream software
  - 基础URL为：http://content.example.com/rhel9.0/x86_64/dvd/AppStream
  - GPG签名检查为启用状态
  - GPG密钥URL为：http://content.example.com/rhel9.0/x86_64/dvd/RPM-GPG-KEY-redhat-release
  - 存储库状态为：启用状态

### 3. 配置 conllection

站点 http://materials.example.com/laoma 中存放多个角色，将下面3个角色安装到 `mycollections` 目录：

- ansible-posix-1.4.0.tar.gz
- community-general-4.3.0.tar.gz
- redhat-rhel_system_roles-1.16.2.tar.gz

### 4. 安装软件包

创建一个名为 `packages.yml` 的 playbook:

- 将 `php` 和 `mariadb` 软件包安装到 `dev`、`test` 和 `prod` 主机组中的主机上
- 将 `RPM Development Tools` 软件包组安装到 `dev` 主机组中的主机上
- 将 `dev` 主机组中主机上的所有软件包更新为最新版本

### 5-1. 使用 RHEL 系统角色-timesync

安装 RHEL 系统角色软件包，并创建名称为 `timesync.yml` 的 playbook，符合以下条件：

- 在所有受管节点上运行
- 使用 `timesync` 角色
- 配置该角色，以使用当前有效的NTP提供商
- 配置该角色，以使用时间服务器172.25.254.254
- 配置该角色，以启用iburst参数

> 提示：考试时，4-1 和4-2 只考其中1题

### 5-2. 使用 RHEL 系统角色-selinux

安装RHEL系统角色软件包，并创建名称为 `selinux.yml` 的 playbook，符合以下条件：

- 在所有受管节点上运行
- 使用 `selinux` 角色
- `selinux` 策略为 `targeted`
- `selinux` 模式为 `enforcing`

> 提示：考试时，4-1 和4-2 只考其中1题

### 6. 使用 Ansible Galaxy 安装角色

使用 Ansible Galaxy 和要求文件 `roles/requirements.yml`。

从以下 URL 下载角色并安装到 `roles` 目录：

- 来源：http://materials.example.com/laoma/haproxy.tar，角色名称为： `balancer`
- 来源：http://materials.example.com/laoma/phpinfo.tar，角色名称为： `phpinfo`

### 7. 创建和使用角色

根据下列要求，在 `roles` 中创建名为 `apache` 的角色：

- `httpd` 软件包已安装，设为在系统启动时启用并启动
- 防火墙已启用并正在运行，并使用允许访问 `Web` 服务器的规则
- 模板文件 `index.html.j2` 用于创建文件 `/var/www/html/index.html` 具有以下输出内容：Welcome to HOSTNAME on IPADDRESS 。`HOSTNAME` 是受管节点的完全限定域名，`IPADDRESS` 则是受管节点的IP地址。

按照下方所述，创建一个名为 `newrole.yml` 的 playbook，使用此角色在 `webservers` 主机组上运行。

### 8. 从 Ansible Galaxy 使用角色

根据下列要求，创建一个名为 `roles.yml` 的 playbook：

- playbook 中包含一个 play，该 play 在 `balancers` 主机组中的主机上运行并将使用 `balancer` 角色。此角色配置一项服务，以在 `webservers` 主机组中的主机之间平衡 `Web` 服务器请求的负载。

  - 浏览到 `balancers` 主机组中的主机（例如 http://workstation.lab.example.com）将生成以下输出：`Welcom to serverc.lab.example.com on 172.25.250.12`
  - 重新加载浏览器将从另一 Web服务器生成输出：`Welcom to serverd.lab.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，会生成以下输出：

      xxxxxxxxxx11Hello PHP World from serverc.lab.example.com

  同样，浏览到 http://serverd.lab.example.com/hello.php，会生成以下输出：

      xxxxxxxxxx11Hello PHP World from serverd.lab.example.com

  另外还有 PHP 配置的各种详细信息，如安装的 PHP 版本等。

### 9-1. 创建和使用逻辑卷

创建一个名为 `lv.yml` 的 playbook，它将在所有受管节点上运行以执行下列任务：

- 在 `research` 卷组中创建逻辑卷

- 逻辑卷名称为 `data`

- 逻辑卷大小为 `6000 MiB`

- 使用 `ext4` 文件系统格式化逻辑卷

- 如果无法创建请求的逻辑卷大小，应显示错误信息：

      xxxxxxxxxx11Could not create logical volume of that size

  并将使用大小改为 `800 MiB`。

- 如果卷组 `research` 不存在，应显示错误信息：

      xxxxxxxxxx11Volume group does not exist

- 不要以任何方式挂载逻辑卷

> 提示：考试时，9-1和9-2只考其中1题

### 9-2. 创建和使用分区

创建一个名为 `partition.yml` 的 playbook，它将在所有受管节点上运行以执行下列任务：

- 在设备 `vdb` 中创建主分区，`id` 为 `1`，大小是 `1500 MiB`

- 使用 `ext4` 文件系统格式化

- 仅在 `dev` 主机组中节点，挂载在 `/data`

- 如果无法创建请求的分区大小，应显示错误信息：

      xxxxxxxxxx11Could not create partition of that size

  并将使用大小改为 `800 MiB`。

- 如果设备 `vdd` 不存在，应显示错误信息：

      xxxxxxxxxx11Disk does not exist

> 提示：考试时，9-1和9-2只考其中1题

### 10. 生成主机文件

下载初始模板文件 http://materials.example.com/laoma/hosts.j2 到 `/home/devops/ansible`。完成该模板，以便用它生成以下文件，针对每个清单主机包含一行内容，其格式与 `/etc/hosts` 相同。

创建名为 `hosts.yml` 的 playbook，它将使用此模板在 `dev` 主机组中的主机上生成文件 `/etc/myhosts`。

该 playbook 运行后，`dev` 主机组中主机上的文件 `/etc/myhosts` 应针对每个受管主机包含一行内容：

    xxxxxxxxxx81127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 2::1 localhost localhost.localdomain localhost6 localhost6.localdomain63
    4172.25.250.9 workstation.lab.example.com workstation 5172.25.250.10 servera.lab.example.com servera 6172.25.250.11 serverb.lab.example.com serverb 7172.25.250.12 serverc.lab.example.com serverc 8172.25.250.13 serverd.lab.example.com serverd

> 注：清单主机名称的显示顺序不重要。

### 11. 修改文件内容

按照下方所述，创建一个名为 `issue.yml` 的 playbook：

- 该 playbook 将在所有清单主机上运行。

- 该 playbook 会将 `/etc/issue` 的内容替换为下方所示的一行文本：

  - 在 `dev` 主机组中的主机上，这行文本显示为：`Development`
  - 在 `test` 主机组中的主机上，这行文本显示为：`Test`
  - 在 `prod` 主机组中的主机上，这行文本显示为：`Production`

### 12. 创建Web内容目录

按照下方所述，创建一个名为 `webcontent.yml` 的 playbook：

- 该 playbook 在 `dev` 主机组中的受管节点上运行。

- 创建符合下列要求的目录 `/webdev`：

  - 所有者为 `webdev` 组

  - 具有常规权限：

        xxxxxxxxxx11owner=read+write+execute，group=read+write+execute，other=read+execute

  - 具有特殊权限：设置组ID

  - 用符号链接将 `/var/www/html/webdev` 链接到 `/webdev`

  - 创建文件 `/webdev/index.html`，其中包含如下所示的单行文件：`Development`

  - 在 `dev` 主机组中主机上浏览此目录（例如 http://servera.lab.example.com/webdev/）将生成以下输出：`Development`

### 13. 生成硬件报告

创建一个名为 `hwreport.yml` 的 playbook：

- 在所有受管节点上生成含有以下信息的输出文件 `/root/hwreport.txt`：

  - 清单主机名称
  - 以 `MB` 表示的总内存大小
  - `BIOS` 版本
  - 磁盘设备 `vda` 的大小
  - 磁盘设备 `vdb` 的大小

- 输出文件中的每一行都是 `key=value` 对。

- 您的 playbook应当从 http://materials.example.com/laoma/hwreport.empty 下载文件，并将它保存为 `/root/hwreport.txt`

- 使用正确的值更改 `/root/hwreport.txt`。

- 如果硬件项不存在，相关的值应设为 `NONE`

### 14. 创建密码库

按照下方所述，创建一个 Ansible Vault 文件来存储用户密码：

- Vault 文件名称为 `locker.yml`

- Vault 文件中含有两个变量：

  - `pw_developer` 值为 `Imadev`
  - `pw_manager` 值为 `Imamgr`

- 用于加密和解密该库的密码为：`laoma`

- 密码存储在文件 `secret.txt` 中

### 15. 创建用户帐户

从 http://materials.example.com/laoma/user_list.yml 下载要创建的用户的列表，并将它保存到 `/home/devops/ansible` 目录。

在本次考试中使用在其他位置创建的密码库 `locker.yml`。创建名为 `users.yml` 的 playbook，从而按以下所述创建用户帐户：

- 职位描述为 `developer` 的用户应当：

  - 在 `dev` 和 `test` 主机组中的受管节点上创建
  - 从 `pw_developer` 变量分配密码
  - 是补充组 `devops` 的成员
  - 设置用户 `UID`
  - 设置密码最大有效期

- 职位描述为 `manager` 的用户应当：

  - 在 `prod` 主机组中的受管节点上创建
  - 从 `pw_manager` 变量分配密码
  - 是补充组 `opsmgr` 的成员
  - 设置用户 `UID`
  - 设置密码最大有效期

- 密码采用 `SHA512` 哈希格式。

您的 playbook 应能够在本次考试中使用在其他位置创建的库密码文件 `secret.txt` 正常运行。

### 16. 更新 Ansible 库的密钥

按照下方所述，更新现有Ansible库的密钥：

- 从 http://materials.example.com/laoma/salaries.yml 下载Ansible库到/home/devops/ansible目录
- 当前的库密码为 `laoma`
- 新的库密码为 `redhat`
- 库使用新密码保持加密状态

### 17. 配置 cron 作业

创建一个名为 `cron.yml` 的 playbook，它将在所有受管节点上运行，配置一个计划任务：

- 运行身份 `devops`
- 运行时间间隔 2 分钟
- 运行命令：`logger "EX294 in progress"`

## 检查成绩

提示：

- 考试时，不提供评分脚本检查错误。
- 评分脚本，针对 4-1 和 9-1
- 使用 root 执行 grade 命令。

    11[root@foundation0 ~]# grade