资讯详情

RHCE9 Ansible6.3考点精讲:Playbook与Roles实战指南

📅 2026/9/20 1:12:01 | 华诺云谱 👁 阅读
RHCE9 Ansible6.3考点精讲:Playbook与Roles实战指南
简介这份PDF学习资料面向RHCE9认证备考者与自动化运维工程师围绕Ansible 6.3展开实战讲解旨在帮助企业批量完成系统配置、程序部署与命令执行降低重复运维成本。资料从Ansible核心概念出发解析Inventory主机清单、Modules模块、Playbooks剧本三大组件并完整演示安装EPEL源、yum安装Ansible、配置/etc/ansible/hosts及免密SSH等基础操作。内容紧扣RHCE9考点覆盖ping、yum、shell常用模块以及通过Playbook批量管理多台主机的实际编排方法其中还包含主机组定义、自定义用户名密码与端口、ssh连接排错等进阶场景适合从零开始系统学习或考前强化。整份资源为单个PDF文档包体大小约3.55MB便于在电脑或手机上按章节查阅。截至目前已有883人学习使用对想快速掌握Ansible自动化核心操作、提升运维效率的读者具有较强参考价值。1. RHCE9 的 ansible6.3 考点从手写脚本到声明式自动化运维RHCE9 认证EX294和早年间 RHCE 最大的区别是考试彻底抛弃了 shell 脚本批量操作的考法所有实操题都要求用 ansible 完成。考试里你面对一台控制节点和多台受管节点题目以文字需求给出比如在所有节点创建用户 alice 并加入 wheel 组把 nginx 配置为开机自启且放行 8080 端口你需要把这些需求写成可重复执行的 playbook 或 ad-hoc 命令。ansible6.3 是这套体系里最常见的版本形态它基于 ansible-core 2.13模块集合完整既能覆盖 RHCE9 全部考点也是生产环境里大量 ansible 自动化运维项目默认附带的稳定版本。下面从控制节点搭建讲到 inventory、playbook、roles再落到考前排错清单每章都有可直接落地的命令和参数。适合正在备考 RHCE9 的考生也适合想把手工脚本运维迁到 ansible 自动化运维项目里的工程师Python 不是必须但懂 YAML 会明显加速上手。2. RHEL9 控制节点搭建与 ansible6.3 安装2.1 分清 ansible 6.3 和 ansible-core安装源怎么选安装之前先解释一个经常把人绕晕的版本关系。ansible6.3.0是社区发行版的版本号它把核心执行引擎ansible-core 2.13和一批经过兼容性测试的 collection 打包在一起发布RHEL9 AppStream 仓库里默认提供的是ansible-core不带额外的 collection 集合。对 RHCE9 考试来说绝大多数考点只涉及ansible.builtin和ansible.posix两个 collection所以两种安装方式都能应付考试。我的建议是练习环境直接用 pip 装完整版 ansible 6.3理由有三个一是ansible-doc里可查的模块数量多遇到陌生模块可以现场查用法二是做 RHCE9 模拟题时有些综合场景会用到community.general里的模块完整版开箱即用三是生产环境的 ansible 自动化运维项目里团队通常会在 requirements.yml 里锁定 collection 版本从完整版开始练习更贴近真实工作流。想确认当前环境的 collection 列表用这条命令ansible-galaxy collection list输出按路径分组/usr/lib/python3.9/site-packages/ansible_collections下是系统级~/.ansible/collections下是用户级。RHCE9 考试环境默认把 collection 装在系统路径练习时如果遇到模块找不到优先检查ansible.cfg里的collections_path是否包含了用户级目录。提示RHEL9 的 AppStream 也提供ansible-core直接sudo dnf install ansible-core就能装。考试要求范围内两者等价但团队项目里建议统一用完整版 ansible减少成员之间的环境差异。2.2 虚拟环境最小安装与版本核对在 RHEL9 上装 ansible 6.3最常见的做法是先建一个 Python 虚拟环境避免污染系统自带 python3。尤其是当系统 python 被 dnf 或 GNOME 的包依赖锁定时直接在系统级 pip install 容易触发 externally-managed-environment 报错。命令如下sudo dnf install -y python3-pip python3 -m venv ~/ansible-env source ~/ansible-env/bin/activate pip install --upgrade pip pip install ansible6.3.0python3 -m venv创建独立解释器目录source激活后所有 python 相关的安装都落在~/ansible-env里删掉目录即完全卸载不影响系统。装完先核对版本ansible --version ansible-doc -l 2/dev/null | wc -lansible --version输出有三行必须看ansible [core 2.13.x]是核心引擎版本python version 3.9.x是解释器路径jinja version是模板引擎版本。如果executable location指向/bin/ansible而不是 venv 路径说明激活没生效后续命令会用到错误版本。第二条ansible-doc -l统计当前可用模块与插件总数完整版 ansible 6.3 通常超过 3000 行如果只有几百行多半是 pip 安装时网络中断用pip install --force-reinstall ansible6.3.0重装即可。2.3 inventory 与 ansible.cfg先把连接行为定下来RHCE9 上机题会明确给出 inventory 文件路径考的就是按题目约束写清单。YAML 格式比 INI 更适合表达层级和变量下面的写法可以直接用于练习# inventory/hosts.yml all: children: webservers: hosts: web1: ansible_host: 192.168.10.21 web2: ansible_host: 192.168.10.22 vars: httpd_port: 8080 dbservers: hosts: db1: ansible_host: 192.168.10.31all.children声明了两个组hosts下的节点名只是清单里的逻辑标识实际连接地址由ansible_host指定。vars放在组层级表示组内所有节点共享变量playbook 里直接{{ httpd_port }}即可取到 8080。清单之外的连接参数写进项目根目录的ansible.cfg不用动/etc/ansible[defaults] inventory inventory/hosts.yml remote_user devops become true become_method sudo host_key_checking false timeout 10 interpreter_python /usr/bin/python3remote_user是 SSH 登录用户become true让所有任务默认提权host_key_checking false跳过首次连接的主机指纹确认避免批量节点里的交互卡顿。interpreter_python指定托管节点上的 Python 路径这是 RHEL9 上最容易踩的坑托管节点如果同时存在多个 Python 版本ansible 会发警告并可能探测到错误解释器显式指定后执行更稳定。2.4 托管节点准备与 ad-hoc 连通性验证配置写完后先验证连通性不要急着写 playbook。托管节点侧需要满足两个条件有 SSH 服务且控制节点能登录有 python3 解释器。RHCE9 考试环境这两项已配好练习环境可以用 cloud-init 或直接虚拟机快照准备。常用 ad-hoc 命令如下场景ad-hoc 命令说明连通性探测ansible all -m ping检测 SSH 登录与 Python 可用性采集系统 factsansible all -m setup获取主机全部基础信息批量安装包ansible all -m dnf -a namevim statepresent幂等安装软件包批量启服务ansible all -m service -a namehttpd statestarted enabledtrue启动并设置开机自启实际执行时仍然从最小的探测开始ansible webservers -m ping -o ansible dbservers -m command -a hostnamectl -o ansible all -m setup -a filteransible_default_ipv4 -o第一条的ping模块不是 ICMP ping它验证 SSH 通道和 Python 解释器返回pong即链路通。第二条用command模块执行hostnamectl验证远程执行和提权是否正常。第三条用setup抓取 factsfilter参数只返回默认网卡 IPv4验证 facts 采集链路。如果报unreachable按顺序排查 SSH 端口和用户名、become提权密码、托管节点 SELinux 是否拦截了公钥写入这三个原因占了连接失败案例的九成。3. ansible6.3 的 Playbook 核心语法与模块选型3.1 最小可用 playbook装包、改配置、起服务的三段式RHCE9 实操题很大比例可以归纳为装包、改配置、起服务三段式。早几年 python 运维自动化的做法是写脚本连服务器批量执行ansible 把这个过程收敛成声明式模块同样的动作换个节点就能复用。把这个三段式写成 play就是一个几乎所有题目都能套用的骨架--- - name: Deploy nginx on webservers hosts: webservers become: true vars: nginx_port: 8080 tasks: - name: Install nginx ansible.builtin.dnf: name: nginx state: present - name: Deploy custom index page ansible.builtin.template: src: templates/index.html.j2 dest: /usr/share/nginx/html/index.html owner: root group: root mode: 0644 - name: Start and enable nginx ansible.builtin.service: name: nginx state: started enabled: truehosts限定执行范围become: true声明需要 root 权限。dnf模块的state: present等价于dnf install且幂等——包已安装就跳过。template用 Jinja2 模板渲染文件mode: 0644必须加引号否则 YAML 会把 0644 解析成十进制 420权限直接错乱。service的enabled: true对应systemctl enable题目描述里重启后仍需生效就在考这个参数。运行命令ansible-playbook deploy_nginx.yml -v-v输出每个任务的执行结果changed表示状态发生变化ok表示已符合预期。RHCE9 判分看最终系统状态而非任务输出所以 playbook 重复执行不会扣分这正是幂等设计的价值。模块选型上记住一条原则场景首选模块兜底方案软件包管理ansible.builtin.dnfcommand: dnf -y install服务管理ansible.builtin.servicecommand: systemctl start文件复制ansible.builtin.copycommand: cp模板渲染ansible.builtin.templatecopy加预渲染文件用户管理ansible.builtin.usercommand: useradd能用专用模块解决的场景别用command或shell这两个模块不幂等且不吃 RHCE9 的重复执行判分逻辑。3.2 变量优先级与 facts送分点也是失分点题目里的不同组给不同配置靠的就是变量体系。变量的注入方式很多优先级从高到低大致是命令行-e参数、play 内vars、组变量、host_vars、facts。这个顺序不需要死记但必须记住一个结论命令行-e永远覆盖 playbook 内的同名变量。调试场景下先用-e覆盖最快确认值正确后再写回文件。# group_vars/webservers.yml nginx_port: 8080 nginx_worker_processes: 4组变量文件放进inventory/同级或group_vars/目录会被自动加载无需显式 include。facts 也可以在 playbook 里直接引用- name: Show managed node details ansible.builtin.debug: msg: {{ ansible_facts[distribution] }} {{ ansible_facts[distribution_version] }}ansible_facts是 ansible-core 2.13 时代的推荐完整路径旧的{{ ansible_distribution }}写法仍然兼容但新代码建议用前者。引用不存在的变量时 playbook 直接失败并提示is undefined排查技巧是把该节点加入--limit单独跑一次setup确认 facts 里到底有没有这个键。3.3 when 与 loop把重复任务收敛成一条 task批量场景最常见的错误写法是复制粘贴多条 task 然后改名字。正确做法是用loop加when组合- name: Install common packages ansible.builtin.dnf: name: {{ item }} state: present loop: - vim-enhanced - lsof - git when: ansible_facts[os_family] RedHatitem是 loop 在每次迭代中的当前元素这里逐个安装列表里的包。when判断os_family只有 RedHat 系才执行避免以后托管节点混入 Debian 时误装 rpm 包。条件也可以来自上一个任务的返回值- name: Check root partition usage ansible.builtin.shell: df -h / | tail -1 register: df_result - name: Fail if usage above 90 percent ansible.builtin.fail: msg: Root usage too high: {{ df_result.stdout }} when: df_result.stdout.split()[4] | int 90register把命令输出存进df_resultstdout.split()[4]取第五列使用率百分比| int转成整数再和 90 比较。这里必须用shell而不是command因为df输出需要管道处理。注意shell和command都不幂等能用专用模块解决的尽量别依赖它俩。3.4 handlers 与 notify服务变更的精确触发配置文件改了服务重启配置文件没改服务不动这个逻辑在 ansible 里由notify和handlers实现- name: Update nginx config ansible.builtin.template: src: templates/nginx.conf.j2 dest: /etc/nginx/nginx.conf notify: restart nginx handlers: - name: restart nginx ansible.builtin.service: name: nginx state: restarted当template任务返回changedansible 会在当前 play 所有任务结束后的 handlers 阶段执行restart nginx文件内容无变化时notify 虽然触发但 handler 不执行。两个 RHCE9 常见失分点一是 handler 定义必须和 tasks 同级写在 tasks 内部会直接语法报错二是多个任务 notify 同一个 handler 时整个 play 只执行一次。如果确需每次变更都重启就把service写进任务本身而不是走 handler。4. ansible Roles、Vault 与 RHCE9 综合题组织4.1 用 ansible-galaxy 初始化角色目录当自动化运维项目从单文件 playbook 长到十几页角色化是必然选择。RHCE9 的进阶题通常要求把配置逻辑拆成角色比如创建 apache 角色完成 httpd 安装和虚拟主机配置。初始化命令cd ~/rhce9-lab ansible-galaxy init roles/apache tree roles/apacheinit生成标准目录骨架tree查看结构。生成后tasks/main.yml里只有---所有任务写进这个文件ansible 调用角色时自动加载。--force参数用于覆盖已存在目录练习时反复生成同名角色经常用到。4.2 角色目录职责表与 defaults/vars 加载顺序角色能跑通的根本在于目录约定。下表是关键目录的职责目录加载时机典型内容tasks/main.ymlplay 执行到 role 时安装、复制、服务启动handlers/main.ymltasks 触发 notify 后服务重启、防火墙重载defaults/main.ymlplay 开始前角色默认参数优先级最低vars/main.ymlplay 开始前角色固定变量覆盖 defaultstemplates/被 tasks 引用.j2 模板文件files/被 tasks 引用静态文件meta/main.yml依赖解析角色依赖声明加载顺序上defaults 先于 vars 被加载play 里的变量会覆盖 defaults 但被 vars 覆盖。由此引出一条角色铁律允许外部定制的参数放 defaults内部固定值放 vars。考试里如果题目要求端口可配置就把端口变量写进 defaults/main.yml才能被-e参数成功覆盖。playbook 里调用角色- name: Apply apache role hosts: webservers become: true pre_tasks: - name: Ensure backup directory exists ansible.builtin.file: path: /var/backups state: directory roles: - apachepre_tasks在角色任务之前执行适合准备目录或做前置检查。roles列表按顺序执行多个角色时每个角色的 tasks 全部完成后才轮到下一个。4.3 Ansible Vault 加密考试里出现频率最高的安全项RHCE9 必考 Vault场景是用 ansible-vault 加密变量文件并让 playbook 在运行时读取密文。基础命令ansible-vault create secrets.yml ansible-vault encrypt group_vars/all.yml ansible-vault view secrets.ymlcreate直接新建并加密文件encrypt对已有明文文件加密view输入密码查看密文内容。加密后的文件在 git 里是密文这正是它的意义——密钥文件不进版本库密码通过 vault password file 或环境变量提供。运行加密 playbook 的方式ansible-playbook site.yml --ask-vault-pass echo mysecret ~/.vault_pass chmod 600 ~/.vault_pass ansible-playbook site.yml --vault-password-file ~/.vault_pass生产环境用第二种密码文件权限必须 600 且加入.gitignore考试用--ask-vault-pass交互输入即可。注意不要在ansible.cfg里写明文密码判分环境的审计日志会记录命令行内容。4.4 多角色综合 playbook 的组织顺序一个 RHCE9 综合题往往同时配置多组节点。site.yml 的标准组织方式--- - name: Configure all web nodes hosts: webservers become: true roles: - common - apache - name: Configure all database nodes hosts: dbservers become: true roles: - common - postgres两个 play 共享common角色common 负责通用初始化——时间同步、仓库配置、安全基线。它在两个 play 里各执行一次幂等保证不会产生副作用。组织顺序上通用角色放前面、业务角色放后面同 play 内按列表顺序执行。这个写法对应 ansible 自动化运维项目的入口文件标准多人协作时各自维护角色目录site.yml 保持稳定基本不需要改。5. RHCE9 上机前必过的 ansible 排查与提速清单5.1 四步检查法syntax-check、check、diff、verbose上机模拟题写完 playbook 不要直接全量跑。按固定顺序做四步检查能覆盖考试里最高频的三类错误——YAML 缩进错误、模板变量未定义、目标节点连不上ansible-playbook site.yml --syntax-check ansible-playbook site.yml --check --diff ansible-playbook site.yml --check --diff --limit web1 -vv--syntax-check只做 YAML 解析和参数校验不连接托管节点秒出结果。--check是干跑模块只报告如果执行会改什么而不真正改动系统--diff配合它显示文件级差异模板渲染错误在这一步就会暴露。--limit web1把范围缩到单节点-vv输出完整模块参数与返回结果快速定位出错环节。注意--check对command和shell模块不生效这两个模块在 check 模式下永远返回 skipped所以含 shell 任务时不要迷信干跑结果。5.2 提速配置pipelining、fact caching、并发数考试机器配置一般不高三五十条任务串行跑很耗时。以下配置能明显缩短执行时间[defaults] forks 20 [ssh_connection] pipelining True ssh_args -o ControlMasterauto -o ControlPersist120sforks 20让 ansible 同时操作最多 20 台节点默认只有 5。pipelining True让 ansible 不再为每条任务往托管节点传临时脚本改走 SSH 管道直接执行是单项收益最高的提速。ControlPersist复用 SSH 连接配合 pipelining 效果叠加。facts 重采集也很耗时长 play 加上缓存[defaults] fact_caching jsonfile fact_caching_connection /home/student/.cache/ansible fact_caching_timeout 3600首次运行仍会全量采集 facts 写入 jsonfile3600 秒内再次运行直接读缓存跳过 setup 阶段。前提是 play 里没有依赖实时 facts 的任务比如磁盘使用率检查这类动态数据开缓存会把旧值读到判断条件里。5.3 收尾技巧用 ad-hoc 复查目标状态playbook 跑完以后用 ad-hoc 复查关键状态比重新读一遍 playbook 更能发现问题。不管未来 ai agent harness 这类自动化运维形态怎么演进ansible 的声明式任务和 inventory 文件始终是它消费的结构化输入而验证手段依然是这几条ansible webservers -a systemctl is-active nginx ansible webservers -a ss -tlnp | grep 8080 ansible all -m user -a namealice statepresent --check第一条确认服务活性第二条确认端口监听第三条用 check 模式复查用户是否存在。把输出和题目要求逐条比对比如任务成功但服务没起来这种场景多半是 SELinux 上下文问题直接 ad-hoc 跑restorecon -Rv /etc/nginx修复不用回头改 playbook。临交卷前再跑一次ansible all -m ping -o确认所有托管节点仍在线这条命令本身就是最后的健康检查。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。