跳转至

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 认证完全可期。