RH134-RH294实验环境搭建:Ansible控制节点与虚拟机集群实践
发布时间:2026/10/15 10:37:32 锦皓数字建站

简介资源为红帽系统认证备考的环境说明文档面向准备RHCSA与RHCE考试、需要在本地搭建RHEL 8.0实验环境的学员与讲师。文档详细梳理了RH134与RH294两套官方模拟培训环境的硬件需求、主机角色、账号密码、常用管理命令以及考试评分流程可帮助学习者快速理解并运行虚拟机平台避免在环境配置上浪费时间。资源为PDF格式共1个文件压缩包大小398KB内容紧凑、便于按章节查阅。目前已有289人学习下载属于轻量但高价值的备考辅助材料。借助其中的说明读者可以掌握foundation、workstation、servera/serb等主机间的协作方式了解RH294中初始化、RHCSA、RHCE三个快照的用途并通过exam-setup与exam-grade命令熟悉模拟考试的完整操作从而更有针对性地完成认证冲刺。1. RH134-RH294环境说明先弄清这套环境在解决什么如果你正准备学 RH134 系统管理或 RH294 自动化运维又或者你需要在团队里搭一套能反复折腾的 Linux 实验台那你大概率会碰到同一个坎环境比知识点更难伺候。RH134-RH294 环境说明这份材料要解决的正是让学员把精力花在敲命令上而不是花在重装系统上。它的核心思路是拆出三个角色一个控制节点负责下发任务一组受管节点负责被折腾再加一个本地仓库让所有机器装包不依赖外网。适合谁备考 RHCSA/RHCE 的、在公司搭内部培训环境的、想用 Ansible 批量管机器又不敢拿生产试手的人。下面我按自己搭这套环境的完整路径把架构、初始化命令、验收动作和踩过的坑一次说透。2. 架构与选型为什么 RH134-RH294 环境必须拆成控制端和受管端2.1 控制节点、受管节点与服务节点的分工边界很多第一次接触 RH134-RH294 环境说明的人会问我就练个 Linux一台虚拟机不够吗答案是练 RH134 勉强够练 RH294 一定不够。RH294 的核心是 Ansible而 Ansible 的用法天生就是一台管多台你至少需要一台控制节点来敲 ansible 命令还需要至少两台受管节点来观察批量执行的差异。如果只有一台机器playbook 里的 hosts 指向 localhost你永远体会不到同一份配置推给 10 台机器的威力也看不出来幂等性到底解决了什么问题。控制节点我的建议是单独装一台 RHEL 9 系虚拟机内存给 4GB磁盘 40GB。它要跑 Ansible、要当 HTTP 仓库服务器、可能还要兼任 DNS资源给少了后面dnf装包会慢到让你怀疑人生。受管节点内存 2GB、磁盘 25GB 起步就够了它们只是用来被配置、被重启、被改坏不需要跑重型服务。服务节点我一般不会单独开一台虚机而是把本地仓库和 DNS 直接放在控制节点上省一台机器的资源也少一条需要维护的网络依赖。系统版本一定要统一。我在某个实验室的模拟项目X里见过一台 RHEL 8 一台 RHEL 9 混着用firewalld的服务名、dnf的模块行为全不一样一个httpd的 SELinux 布尔值在两套系统上的默认值都不同排错排到怀疑人生。RH134-RH294 环境说明我见过的最稳妥做法就是全用同一个版本的小版本比如统一到 RHEL 9.2 或 9.4不要混。2.2 存储、内存与网络参数这些数字不是随便给的存储参数我按踩坑经验给一个最低参考表新手照着设不会后悔参数项控制节点每台受管节点说明内存4096 MB2048 MB低于这个值 dnf 装包和 ansible 并行任务容易 OOMvCPU21控制节点跑 httpdansible 时 2 核更稳系统盘40 GB25 GB太小的话 dnf 缓存会把 /var 撑爆数据盘20 GB存 ISO 和 repo不需要也可以不单独分直接在根分区下划目录网络模式NAT 虚拟网络NAT 虚拟网络不要用桥接理由见下文快照装完系统打一个 clean 快照装完系统打一个 clean 快照这是你练坏之后的后悔药网络这块我吃过亏多说两句。最初我把虚拟机都配成桥接模式好处是能从办公网直接 SSH 过去坏处是一来占用局域网 IP二来虚拟网络里的 DHCP、DNS 行为跟真实链路混在一起学员改/etc/resolv.conf改错了还会影响同网段其他机器。后来我全部改成 NAT 的 default 虚拟网络所有虚机在 192.168.122.0/24 网段内自己玩对外只有一个 NAT 出口装系统用。这样 DNS 和 DHCP 都可以在虚拟网络里自定义练hostnamectl、改 resolv 也不怕伤到别人。快照策略是这套环境能不能经得起折腾的关键。我一般是在系统装完、仓库配好、SSH 免密打通之后立刻打一个名为 clean 的快照。之后不管学员练什么练挂了就virsh snapshot-revert回到 clean整个过程不超过 30 秒。没有快照的环境练到fstab改错重启进不去系统时唯一的出路就是重装一晚上全废了。这个习惯我从第一次翻车之后就再没丢过。3. 从零初始化 RH134-RH294 环境最小可运行部署3.1 用 virt-install 快速拉起虚拟机集群在 KVM 宿主机上我一般直接用virt-install命令行拉起虚机比在 virt-manager 里点鼠标快得多也方便以后写脚本批量创建。下面这条命令创建一台受管节点ISO 放在宿主机本地路径virt-install \ --name managed1 \ --memory 2048 \ --vcpus 2 \ --disk path/var/lib/libvirt/images/managed1.qcow2,size25 \ --cdrom /data/iso/rhel9.iso \ --network networkdefault \ --os-variant rhel9.0 \ --noautoconsole关键参数说明--network networkdefault表示接到 libvirt 自带的 NAT 虚拟网络上IP 由虚拟网络的 DHCP 自动分配--noautoconsole是让安装过程在后台跑不占用当前终端。装完第一台之后不要急着配仓库先把这台机器做成一个通用模板用克隆的方式生成 managed2 和 managed3这样三台机器的 root 密码、SSH 主机密钥、网卡配置都一致后面免密配置会省很多事。克隆命令virt-clone \ --original managed1 \ --name managed2 \ --file /var/lib/libvirt/images/managed2.qcow23.2 配置本地仓库与 DNS让所有受管节点离线装包受管节点全部起来之后第一步是解决装包问题。企业内网实验环境一般访问不了外部订阅源所以我把 RHEL ISO 里的 BaseOS 和 AppStream 目录通过控制节点上的 httpd 共享出去受管节点把仓库地址指向控制节点。仓库配置写成这样# /etc/yum.repos.d/local.repo [BaseOS] nameRHEL9 BaseOS baseurlhttp://192.168.122.10/repo/BaseOS enabled1 gpgcheck0 [AppStream] nameRHEL9 AppStream baseurlhttp://192.168.122.10/repo/AppStream enabled1 gpgcheck0逻辑说明gpgcheck0在实验环境里是为了省去导入签名生产环境绝不能这么干。baseurl里的 IP 就是控制节点的 IP我建议这里写静态 IP不要写主机名避免 DNS 没配好时 dnf 解析失败。把 ISO 挂载后通过 httpd 的别名暴露出来控制节点上执行mount -o loop rhel9.iso /mnt然后建软链接到/var/www/html/repo一条ln -s /mnt/BaseOS /var/www/html/repo/BaseOS就够。DNS 服务我没有用 bind太重了。实验环境里我用dnsmasq就行装好之后把它指向控制节点受管节点的/etc/resolv.conf里 nameserver 写成控制节点 IP。注意dnsmasq启动前要确保宿主机虚拟网络的 DHCP 没有占用 53 端口如果有冲突就把虚拟网络的 DHCP 关掉只保留 DNS 功能。3.3 Ansible 控制端初始化和 SSH 免密接入控制节点上的 Ansible 我直接用 dnf 装RHEL 9 自带的ansible-core够用不需要额外装 Ansible 全集。装完包之后最影响体验的是host_key_checking这个参数默认值是 True意味着第一次 SSH 连接时手工确认指纹批量跑 ansible 时一旦有一台没确认过指纹任务就会卡在确认提示上。我把 ansible.cfg 的开头几行写成这样# /etc/ansible/ansible.cfg [defaults] inventory /etc/ansible/hosts remote_user root host_key_checking False stdout_callback yaml参数说明remote_user root在实验环境里图省事直接用 root生产上必须换专用账号stdout_callback yaml让 playbook 输出按 yaml 格式对齐显示看 changed 和 ok 的对比比默认格式清楚得多。免密配置用ssh-copy-id一把梭ssh-keygen -t ed25519 ssh-copy-id root192.168.122.11 ssh-copy-id root192.168.122.12我见过有人在这步踩坑多次克隆后受管节点的 SSH 主机指纹变了ansible 报错说不匹配。解决方法是先在控制节点执行ssh-keygen -R ip清掉旧指纹再重新ssh-copy-id。如果是批量初始化直接在克隆前先把受管节点的/etc/ssh/ssh_host_*删掉让系统首次启动时重新生成这样每台机器的指纹都不同能少很多麻烦。4. 验证环境是否达标RH134-RH294 环境能跑这些动作就算合格4.1 用 ad-hoc 命令批量收集受管节点信息环境搭完不能直接说好了我要跑几个验收动作确认它真的能用。第一个动作是用 ad-hoc 命令确认控制节点能批量操作所有受管节点。这一步的核心是验证三件事SSH 免密通、远程用户是 root、Python 解释器能被 ansible 找到。ansible managed -i /etc/ansible/hosts -m ping ansible managed -i /etc/ansible/hosts -m gather_facts -a gather_subset!all,!min逻辑说明第一条如果返回 pong说明 SSH 链路没问题。第二条是收集系统事实gather_subset!all,!min表示跳过全部和最小子集只抓硬件和系统基础信息速度更快。如果第二条报错提到 Python 解释器找不到多半是受管节点上缺/usr/bin/python3RHEL 9 一般不会但如果是裁剪过的模板可能就要手动装。清单文件/etc/ansible/hosts我一般这样组织把控制节点和受管节点分到不同组[control] 192.168.122.10 [managed] 192.168.122.11 192.168.122.12 192.168.122.134.2 用一条 playbook 验证安装、防火墙与幂等性第二个验收动作是跑一个真实 playbook内容就是装 httpd、放行防火墙端口、启动服务。这个 playbook 模拟的是 RH134 练习里最典型的系统管理操作也是 RH294 里 Ansible 最常用的模块组合。写出来是这样--- - name: 环境验收部署并启动 httpd hosts: managed gather_facts: false tasks: - name: 安装 httpd dnf: name: httpd state: present - name: 放行 http 服务 firewalld: service: http state: enabled permanent: true immediate: true - name: 启动并设置开机自启 service: name: httpd state: started enabled: true关键说明permanent: true和immediate: true必须同时出现前者写进防火墙的永久配置后者让当前运行时立刻生效。缺一个都会出现这条规则当时好用重启后又没了的现象。跑完第一遍应该看到这三个任务都是 ok 或者 changed然后立刻再跑一遍如果结果显示全部为 ok说明幂等性成立。我再补充一个验证点在受管节点上手动去systemctl stop httpd再从控制节点跑一次 playbook看它能不能把服务拉起来。这一步验证的是 Ansible 的状态收敛能力也是 RH294 考试里经常暗含的考察方式。如果拉不回来检查受管节点上的 SELinux 是否拦了 httpd 的网络端口执行getenforce看一眼状态实验环境可以临时setenforce 0排查但别把关闭 SELinux 当长久方案。5. RH134-RH294 环境搭建避坑清单现象、原因与解决5.1 克隆后受管节点网络不通IP 变成 169.254.x.x现象用virt-clone克隆出来的机器能开机但ip addr看到网卡 IP 是 169.254.x.x 开头的 link-local 地址DHCP 没分配成功。原因克隆时把原机器的网卡 MAC 地址也复制了虚拟网络的 DHCP 认为原机器还在线新机器拿着同一个 MAC 去请求就被忽略。另外 RHEL 9 用 NetworkManager 的 connection 配置存了原机器的 MAC 绑定新机器网卡名都变了也关联不上。解决在 KVM 宿主机上直接执行virsh edit managed2把mac标签里的地址删掉让 libvirt 重启时自动生成新 MAC。进系统之后用nmcli connection delete删掉旧连接再nmcli connection up eth0重新获取一次 DHCP。5.2 dnf 装包报 404仓库地址和 HTTP 目录对不上现象受管节点执行dnf install时报 404但浏览器访问http://ip/repo/BaseOS能看到目录列表。原因这是典型的路径拼接问题。我用mount -o loop挂载 ISO 到/mnt然后建软链接到/var/www/html/repo但 httpd 的 DocumentRoot 默认不允许软链接跨目录访问或者 SELinux 的httpd_t域没有读取/mnt下内容的权限。解决先用curl在受管节点上直接请求一个 rpm 包的完整路径确认 404 出现在目录层还是文件层。如果是软链接问题在 Apache 配置里给Directory /var/www/html/repo加Options FollowSymLinks如果是 SELinux执行setsebool -P httpd_use_fusefs 1或者更简单粗暴一点把 ISO 解压到/var/www/html下不建软链接从根上避开跨目录读的权限问题。5.3 Ansible 任务卡住不动像死了一样现象执行任何 playbook 都在某个任务上长时间无输出CtrlC 才能中断日志提示 SSH 超时或 host key 确认。原因这个我太熟了血泪经验——第一台机器建好之后我没清 SSH 指纹就克隆克隆出的机器和原机器指纹一模一样控制节点 SSH 一连接就报警不匹配Ansible 默认遇到指纹变更会挂起等待人工输入。另一个常见原因是 ansible.cfg 里host_key_checking没设置成 False首次连接时交互式确认把自动化流程卡住了。解决控制节点上全局执行ssh-keygen -R ip清掉每个受管节点的旧指纹然后重新ssh-copy-id。更好的做法是在克隆模板前删除/etc/ssh/ssh_host_*让每台克隆机首次启动时自己生成新指纹从根源上杜绝指纹重复。5.4 控制节点内存不够ansible 并行任务把系统拖垮现象对着三台受管节点跑 playbook 时控制节点响应变慢SSH 输入命令都卡free -h看到 swap 占用飙升。原因我最初图省事给控制节点只分了 2GB 内存Ansible 默认forks5意思是最多同时管理五台受管节点。每台受管节点的 SSH 连接、Python 模块执行、结果回传都要在控制节点上维持进程2GB 根本不够用内核直接开始 swap 换页。解决给控制节点升到 4GB 以上。如果内存确实紧在 ansible.cfg 里把forks调成 1 或 2牺牲并行度换稳定性。受管节点内存可以低到 1GB但控制节点千万别吝啬。5.5 快照回滚后 SSH 密钥失效控制节点拒绝连接现象受管节点练坏了我用virsh snapshot-revert回滚到 clean 快照然后从控制节点 SSH 过去提示公钥不匹配连认证都到不了。原因clean 快照创建时受管节点的 SSH 主机密钥是当时那对回滚之后机器恢复到快照时刻的状态但控制节点的 known_hosts 里记录的是 clone 之后新产生的密钥两边对不上SSH 直接拒绝连接。解决这不是环境坏了是 known_hosts 过期了。在控制节点执行ssh-keygen -R ip清掉旧密钥再重新ssh-keyscan ip ~/.ssh/known_hosts或者干脆在 ansible.cfg 里保持host_key_checking False实验环境图省事可以这么干。6. 把 RH134-RH294 环境做成可复用的重置脚本6.1 快照 重置脚本练坏了 30 秒满血复活环境搭好只是第一步能不能长期用取决于你愿不愿意维护它。我最推荐的方案是装好即快照练坏即回滚回滚完自动重推密钥。把这套逻辑写成一个脚本放在 KVM 宿主机上学员每次练完或者练砸了跑一下就行#!/bin/bash # 环境重置脚本回滚所有受管节点到 clean 快照 VMSmanaged1 managed2 managed3 for vm in $VMS; do virsh snapshot-revert $vm clean virsh start $vm 2/dev/null || virsh start $vm --force-boot done # 等待所有节点网络就绪 for vm in $VMS; do until ping -c1 $vm.local /dev/null 21; do sleep 3 done ssh-keygen -R $vm.local 2/dev/null done # 用预先写好的临时密码推公钥 for vm in $VMS; do sshpass -p temp-pass-123 ssh-copy-id root$vm.local done echo 重置完成可以在控制节点执行 ansible all -m ping 验证脚本逻辑说明snapshot-revert clean把虚拟机磁盘状态整体拉回快照时刻比删掉重建快得多也不占额外存储ssh-keygen -R清掉旧指纹防止 known_hosts 报错打断后续命令sshpass配合临时密码推公钥只适合实验环境生产里应该在模板阶段就把公钥写进受管节点的authorized_keys。6.2 模板化的价值不在于省安装时间而在于统一基线用过这套环境之后我最深的体会是模板化的价值不在于少装几次系统而在于每一次练习都在同样的基线上开始不会出现A 同学的环境里 httpd 已经开着B 同学的环境里 SELinux 被关掉了这种不可复现的差异。我把这个思路反过来用在生产环境的测试区里预先打好一个标准镜像新成员接入测试环境时不再给他一台虚拟机自己折腾而是从模板直接克隆半小时内就能开始跑自动化验证。最后一个习惯建议任何一次环境关键配置改动完成后立刻打一个新快照命名用带日期的标签这样想回退到哪个状态都找得到。我之前有次改完仓库配置忘了打快照第二天发现 httpd 服务因为日志撑爆磁盘起不来了只能一步步往回排查折腾了两个小时才定位到是日志轮转没配。那之后我就把改完就打快照当成铁律再没在环境维护上浪费过时间。希望帮到你。本文还有配套的精品资源点击获取
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。