33. RHCE 学习计划
本章为备考 RHCE(Red Hat Certified Engineer,EX294)提供系统化的 8–12 周学习路径,以 RHEL 9 为实验环境,按照 Red Hat 官方考试目标分阶段推进,每阶段配有明确的实践任务和验证标准。
33.1 学习环境准备
实验环境配置:
| 节点 | 主机名 | IP | 角色 |
|---|---|---|---|
| 控制节点 | linuxdc |
192.168.1.100 |
Ansible 控制机,本教程主节点 |
| 受控节点 | linuxdc2 |
192.168.1.101 |
Ansible 目标主机 |
# 验证实验环境就绪(以 ops 用户登录后 sudo -i)
hostnamectl
ip addr show ens33 | grep 192.168.1.100
systemctl is-active sshd chronyd firewalld
getenforce # 应返回 Enforcing
ansible all -m ping
学习原则:
- 所有配置通过命令行完成,禁止依赖图形界面
- 每项任务完成后立即验证,养成"操作—验证"的闭环习惯
- 遇到 SELinux 拒绝或防火墙问题时,优先查日志再处理,不要盲目关闭安全机制
- 每周至少完成一次无资料模拟考试(3 小时限时)
33.2 分阶段学习计划
阶段一:基础环境与访问控制(第 1–2 周)
学习目标: 搭建稳定实验环境,掌握用户权限管理和 SELinux 基础操作
核心任务:
# 任务 1:用户与权限管理
useradd -m -G wheel ops
passwd ops
chage -M 90 -W 14 ops
chage -l ops
# visudo 配置 sudo 免密(可选)
visudo -f /etc/sudoers.d/ops
# ops ALL=(ALL) NOPASSWD: ALL
# 任务 2:SSH 安全配置三步联动
vim /etc/ssh/sshd_config
# Port 2222
# PermitRootLogin no
# PasswordAuthentication no
semanage port -a -t ssh_port_t -p tcp 2222
firewall-cmd --permanent --add-port=2222/tcp
firewall-cmd --reload
sshd -t && systemctl restart sshd
# 任务 3:SELinux 管理
getenforce
setsebool -P httpd_can_network_connect on
getsebool httpd_can_network_connect
restorecon -Rv /var/www/html/
# 任务 4:防火墙基础配置
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
firewall-cmd --list-all
验证标准:
getenforce # 返回 Enforcing
id ops # 包含 wheel 组
ss -tuln | grep :2222 # SSH 在 2222 端口监听
firewall-cmd --list-all | grep http # http 服务已开放
阶段二:存储与网络服务(第 3–4 周)
学习目标: 掌握 LVM 存储管理、NFS 文件共享和内核参数调优
核心任务:
# 任务 1:完整 LVM 创建与永久挂载
pvcreate /dev/sdb1
vgcreate datavg /dev/sdb1
lvcreate -L 10G -n datalv datavg
mkfs.xfs /dev/datavg/datalv
mkdir -p /mnt/data
mount /dev/datavg/datalv /mnt/data
echo '/dev/datavg/datalv /mnt/data xfs defaults 0 0' >> /etc/fstab
mount -a
df -hT /mnt/data
# 任务 2:LVM 在线扩容(两步必须都执行)
lvextend -L +5G /dev/datavg/datalv
xfs_growfs /mnt/data
df -hT /mnt/data # 验证容量已增加
# 任务 3:NFS 服务配置
dnf install -y nfs-utils
systemctl enable --now nfs-server
mkdir -p /data/nfs_share
chown nobody:nobody /data/nfs_share
echo '/data/nfs_share 192.168.1.0/24(rw,sync,no_subtree_check)' >> /etc/exports
exportfs -arv
setsebool -P nfs_export_all_rw on
firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=mountd
firewall-cmd --permanent --add-service=rpc-bind
firewall-cmd --reload
showmount -e localhost
# 任务 4:sysctl 内核参数持久化
tee /etc/sysctl.d/99-rhce.conf << 'EOF'
net.ipv4.ip_forward = 1
vm.swappiness = 10
EOF
sysctl --system
sysctl net.ipv4.ip_forward vm.swappiness
验证标准:
pvs && vgs && lvs
df -hT /mnt/data # 容量已扩展至 15G
showmount -e localhost # 显示 NFS 导出列表
sysctl vm.swappiness # 返回 10
阶段三:核心服务与容器(第 5–6 周)
学习目标: 部署 Web 服务、管理 systemd 自定义服务和 Podman 容器
核心任务:
# 任务 1:Apache 虚拟主机配置
dnf install -y httpd
mkdir -p /var/www/site1/html
echo '<h1>Site1 - linuxdc</h1>' > /var/www/site1/html/index.html
semanage fcontext -a -t httpd_sys_content_t '/var/www/site1(/.*)?'
restorecon -Rv /var/www/site1/
tee /etc/httpd/conf.d/site1.conf << 'EOF'
<VirtualHost *:80>
ServerName site1.linuxdc.local
DocumentRoot /var/www/site1/html
<Directory /var/www/site1/html>
Require all granted
</Directory>
ErrorLog /var/log/httpd/site1-error.log
CustomLog /var/log/httpd/site1-access.log combined
</VirtualHost>
EOF
apachectl configtest
systemctl enable --now httpd
echo "192.168.1.100 site1.linuxdc.local" >> /etc/hosts
curl http://site1.linuxdc.local
# 任务 2:自定义 systemd 服务
tee /etc/systemd/system/healthcheck.service << 'EOF'
[Unit]
Description=Daily Health Check Service
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/linuxdc-health.sh
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now healthcheck
systemctl status healthcheck
# 任务 3:Podman 容器 + systemd 开机自启
podman run -d --name web01 \
-p 8080:8080 \
-v /var/www/site1/html:/var/www/html:Z \
registry.access.redhat.com/ubi9/httpd-24
podman generate systemd --name web01 --files --new
cp container-web01.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable --now container-web01
curl http://localhost:8080
验证标准:
curl http://site1.linuxdc.local # 返回 Site1 内容
systemctl is-active healthcheck # active
podman ps # web01 运行中
systemctl is-active container-web01 # active
阶段四:Ansible 自动化(第 7–8 周)
学习目标: 掌握 Ansible Playbook 编写,实现生产级自动化配置管理
核心任务:
# 任务 1:配置 Ansible 控制环境
dnf install -y ansible-core
tee /etc/ansible/hosts << 'EOF'
[webservers]
192.168.1.101 ansible_user=ops ansible_ssh_private_key_file=~/.ssh/id_ed25519 ansible_port=2222
[all:vars]
ansible_python_interpreter=/usr/bin/python3
EOF
ansible all -m ping
任务 2:Playbook — 部署 Web 服务
tee ~/deploy-web.yml << 'EOF'
---
- name: 部署 Apache Web 服务
hosts: webservers
become: yes
tasks:
- name: 安装 httpd
dnf:
name: httpd
state: present
- name: 启动并开机自启
systemd:
name: httpd
state: started
enabled: yes
- name: 防火墙放行 HTTP
firewalld:
service: http
permanent: yes
state: enabled
immediate: yes
EOF
ansible-playbook ~/deploy-web.yml --syntax-check
ansible-playbook ~/deploy-web.yml
任务 3:Playbook — 用户管理
tee ~/manage-users.yml << 'EOF'
---
- name: 用户管理
hosts: all
become: yes
tasks:
- name: 创建运维用户
user:
name: ops
groups: wheel
append: yes
state: present
- name: 配置 SSH 公钥认证
authorized_key:
user: ops
key: "{{ lookup('file', '~/.ssh/id_ed25519.pub') }}"
state: present
EOF
ansible-playbook ~/manage-users.yml
ansible all -m command -a "id ops" # 验证
任务 4:Playbook — SELinux 与 LVM 存储
tee ~/storage-selinux.yml << 'EOF'
---
- name: 存储配置与 SELinux 管理
hosts: all
become: yes
tasks:
- name: 创建 LVM 卷组
lvg:
vg: ansible_vg
pvs: /dev/sdc1
- name: 创建逻辑卷(5G)
lvol:
vg: ansible_vg
lv: ansible_lv
size: 5g
- name: 格式化为 XFS
filesystem:
fstype: xfs
dev: /dev/ansible_vg/ansible_lv
- name: 永久挂载
mount:
path: /mnt/ansible_data
src: /dev/ansible_vg/ansible_lv
fstype: xfs
state: mounted
- name: 启用 httpd 网络连接布尔值
seboolean:
name: httpd_can_network_connect
state: yes
persistent: yes
EOF
ansible-playbook ~/storage-selinux.yml
ansible all -m command -a "df -hT /mnt/ansible_data" # 验证
任务 5:vault 加密敏感变量
mkdir -p ~/vault
ansible-vault create ~/vault/secrets.yml
# 编辑内容:
# db_password: "Secure@2025!"
# api_token: "tok-xxxxxxxxxxxxxxxx"
# 执行含加密变量的 Playbook
ansible-playbook ~/site.yml --ask-vault-pass
验证标准:
ansible all -m ping # 全部 pong
ansible-playbook ~/deploy-web.yml --check # 无 changed(幂等性验证)
curl http://192.168.1.101 # 返回 Apache 默认页
ansible all -m command -a "id ops" # ops 用户存在
阶段五:综合演练(第 9–12 周)
每日练习(30–60 分钟):
每日随机抽取 2–3 个任务组合练习,例如:
# 组合示例 A:用户 + SELinux + 防火墙
# 1. 创建用户 testops,加入 wheel 组,设置 60 天密码策略
# 2. 为 Apache 设置非标准端口 8080,同步 SELinux 和防火墙
# 3. 验证所有配置生效
# 组合示例 B:LVM + Ansible 自动化
# 1. 手动创建 LVM 逻辑卷并挂载
# 2. 编写 Ansible Playbook 在受控节点重现相同配置
# 3. 验证 Playbook 幂等性(第二次执行 changed=0)
# 组合示例 C:容器 + systemd
# 1. 运行 httpd 容器,配置持久卷
# 2. 生成 systemd 服务文件,配置开机自启
# 3. 重启系统验证容器自动启动
每周模拟考试(3 小时,不参考资料):
# 考后复盘步骤
journalctl -b --no-pager | grep -i error # 检查操作过程中的系统错误
ansible all -m command -a "systemctl status httpd" # 验证部署结果持久化
ansible-playbook ~/site.yml --check # 验证 Playbook 幂等性
33.3 推荐学习资源
官方权威资料(优先):
- RHCE 考试目标(EX294):
https://www.redhat.com/en/services/training/ex294-red-hat-certified-engineer-rhce-exam - RHEL 9 官方文档:
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9 - Ansible 官方文档:
https://docs.ansible.com/ - Ansible 模块索引:
https://docs.ansible.com/ansible/latest/collections/index.html
实践环境:
- Red Hat Developer 免费订阅(
https://developers.redhat.com),可合法使用 RHEL 9 - VMware Workstation + 两台 RHEL 9 VM(本教程标准实验环境)
33.4 自测问题
Q1:如何在 30 秒内验证 Ansible 能否连接所有受管主机?
ansible all -m ping
# 所有主机返回绿色 "pong" 表示连通正常
# 若某主机返回 UNREACHABLE,立即检查 SSH 配置和网络连通性
Q2:Playbook 执行完成后如何验证其幂等性?
立即再次执行相同 Playbook,观察输出摘要(PLAY RECAP)中的 changed 计数。若第二次执行 changed=0,说明 Playbook 具备幂等性,每次执行结果一致,不会产生额外副作用。若第二次仍有 changed,需排查使用了 command/shell 模块或缺少状态判断条件的任务。
Q3:考试时发现某个任务不会做,应如何处理?
立即在草稿纸上标注任务编号,跳过该任务,继续完成其余确定能得分的任务。完成所有确定任务后,再回头处理跳过的任务。考试时间有限(通常 3–4 小时),在单个任务上超过 20 分钟是严重的时间浪费,应果断跳过、优先保分。最后留 15 分钟检查所有已完成任务的验证结果。
33.5 章节总结
本章提供了 RHCE(EX294)8–12 周系统化学习路径:明确的环境准备标准、五个递进学习阶段(基础访问控制 → 存储网络 → 核心服务容器 → Ansible 自动化 → 综合演练),每阶段配有可直接执行的操作任务和量化验证命令。坚持"先操作再验证"的习惯,每周完成限时模拟考试,在 8–12 周内系统掌握所有考点,RHCE 认证完全可期。