考试真正在问什么
一句话总结
RHCE 真正考查的不是 Ansible 语法,而是能否把 RHEL 配置成目标状态。因此,失分点主要集中在系统层面。
为什么重点不是语法而是系统
RHCE(EX294)看起来像 Ansible 考试,但它真正考查的是能否让 RHEL 系统达到所需状态。因此,容易失分的地方不在语法,而主要在系统层面。
started 与 enabled
state: started # 지금 돌고 있는가
enabled: true # 재부팅 후에도 뜨는가
二者描述的是不同状态。只写 started,评分当下能够通过;但重启后服务就不再运行,而重启往往发生在凌晨。
firewalld 的两个世界
firewalld 分别管理当前生效的规则(runtime)和写入文件的规则(permanent)。
| 设置内容 | 结果 | 症状 |
|---|---|---|
仅 permanent |
已写入文件,但当前没有开放 | “明明配置了,为什么还是不通?” |
仅 immediate |
当前已开放,但重启后消失 | “昨天明明还能用。” |
| 两者都设置 | 完整状态 |
SELinux 会悄无声息地阻止访问
SELinux 拦截操作时,在应用程序看来只是普通错误,比如 connection refused 或 403。文件权限又完全正常,因此更容易令人困惑。
此外,如果 SELinux 布尔值漏掉 persistent: true,它只会在当前生效,重启后便恢复原状。恢复后出现的症状与最初完全相同,于是人们会以为问题已修复,却再次遇到同一故障。
文件上下文分为两步。sefcontext 只登记规则;要把规则应用到现有文件,还必须另行执行 restorecon。
幂等性不是信念,而是数字
“我写得很幂等”只是一种信念,而“第二次运行时 changed 为 0”才是事实。只有后者有意义。
破坏幂等性的原因几乎总是以下两种。
- 无条件执行
command/shell——每次都会显示 changed。应使用creates:或changed_when:添加条件。 - 每次都会变化的模板——如果加入时间或随机数,内容就会不断改变。处理程序因而每次都重启服务,导致明明什么都没变,每次发布却仍会中断服务。
考试中容易浪费时间的环节
RHCE 考试失败,往往不是因为不会,而是因为时间不够。因此,预先确定操作流程与掌握知识同样重要。
首先检查清单和连接。 无论 playbook 写得多好,无法连接目标就只能得 0 分。先用 ansible all -m ping 确认所有目标都有响应,同时检查能否提升权限。这 1 分钟可以避免之后因“为什么不行”而浪费 20 分钟。
提前确定去哪里查文档。 模块选项名称不靠死记,而应通过 ansible-doc 查找。但查找也会耗费时间,所以应熟悉常用模块(package、service、copy、template、lineinfile、user、firewalld、seboolean),只查询其余内容。
完成一道题后立即验证。 如果最后集中检查,就得重新查找每道题错在哪里。操作服务后应当场检查到 systemctl is-enabled,配置防火墙后应当场查看 firewall-cmd --list-all。
遇到阻碍就先跳过。 纠缠一道题的时间里,可能已经错过两道本可以完成的题。跳过时记录尚未处理的内容,剩余时间再回来解决。
最后,务必预留时间,在重启后检查状态。 这是发现本模块反复强调的持久性问题的唯一方法。如果没有时间重启,至少也要浏览 systemctl is-enabled 和 firewalld 的 permanent 列表。实际工作同样如此:“现在可以工作”和“重启后仍可工作”是两种不同状态,而它们之间的差异总会在最糟糕的时刻暴露。
实际工作中真正重要的事项
使用改变状态的模块时,始终同时写明是否持久化。 为 state: started 配上 enabled: true,为 firewalld 同时设置 permanent 与 immediate,为 SELinux 布尔值设置 persistent: true。遗漏后,当前能够通过,重启后却会消失,而重启通常发生在凌晨。
只能通过第二次运行时 changed 为 0 来证明幂等性。 破坏幂等性的原因几乎总是无条件执行的 command/shell 和每次变化的模板。后者尤其糟糕——处理程序每次都会重启服务,明明什么都没变,每次发布却仍会中断。
SELinux 拦截操作时,看起来像应用程序错误。 它可能表现为 connection refused 或 403,而文件权限完全正常,因此往往最耗费排障时间。还要记住,sefcontext 只登记规则;要把规则应用到现有文件,必须另行执行 restorecon。
下一个实验将在 AlmaLinux 9 VM 中进行。SELinux 处于 Enforcing 状态,firewalld 也正在运行,所以如果遗漏上述设置,操作会真正被阻止。