教材原文:RHCA 官方英文教材(教材第 533~594 页)(OCR 整书版已从本站移除,本页为章节精读) 章节结构:本章=整门课《Advanced Automation: Ansible Best Practices》的综合复习(Comprehensive Review):先逐章过一遍 Ch1~14 技能清单,再按“给定规格从零搭一个新组织 + 全栈部署环境”,分 8 段 Review Lab 完成(review-cr1 / review-cr2 / review-cr3 三档评分脚本)。 关联:DO447 全系列 1~15 章精读至此完成;对照本系列 00-RHCA教材精读-导航与学习法.md 与 RH358 第 12 章(同为 Comprehensive Review)。
- GOAL: Demonstrate skills learned in this course by configuring and operating a new organization in Ansible Tower using a provided specification, Ansible projects, and hosts to be provisioned and managed.(按给定规格(specification)在 Tower 里配置并运维一个新组织,用上课程给的 Ansible 项目与被纳管主机,从而证明课程所学技能)
- OBJECTIVES: Review tasks from Advanced Automation: Ansible Best Practices.(复习“高级自动化:Ansible 最佳实践”课程各任务)
- SECTIONS: Comprehensive Review(单节);LAB 清单 8 个:Writing YAML Inventory Files、Privilege Escalation, Lookups, and Rolling Updates、Restoring Ansible Tower from Backup、Adding Users and Teams、Creating a Custom Dynamic Inventory、Configuring Job Templates、Configuring Workflow Job Templates, Surveys, and Notifications、Testing the Prepared Environment。
| 章 | 复习要点(应熟练掌握) |
|---|
| Ch1 推荐实践 | 开发/维护高效自动化方案的最佳实践;在 Git 仓库中按推荐实践创建管理 playbook |
| Ch2 清单管理 | 写 YAML 格式静态清单(替代旧 INI 风格);每主机/组多个变量文件;用特殊变量覆盖主机/端口/远程用户 |
| Ch3 任务执行 | play/role/task/block 级自动提权;pre_tasks/roles 前与 handlers 后运行、一次通知多 handler;tags 与 start-at-task;callback 插件做性能分析 |
| Ch4 数据转换 | 过滤器格式化/解析/定义变量;lookup 从外部取数;过滤器+lookup 实现复杂数据结构迭代;网络信息过滤器 |
| Ch5 滚动更新 | delegate 到别的 host 并控制 facts 归属;serial 分批、max_fail_percentage 中止、run_once 场景 |
| Ch6 Tower 安装访问 | Tower 架构/用例/安装要求;单机安装;Web UI 导航并用 demo 模板跑通 Job |
| Ch7 用户与团队 | Web UI 建用户(类型)、建团队、分配角色(RBAC) |
| Ch8 清单与凭据 | Web UI 建静态清单;建 machine credential 供 SSH 登录主机 |
| Ch9 项目与作业 | 建 Project(从 Git 拉 playbook);建 Job Template(项目+playbook+清单+凭据)并启动 |
| Ch10 高级工作流 | Fact Cache 加速;Survey 定制启动参数;Workflow Job Template 多作业编排;调度与完成通知 |
| Ch11 API | curl 与 playbook 访问 Tower REST API、与 Web 服务交互 |
| Ch12 高级清单 | 导入外部静态清单/Project 内清单;自定义脚本动态清单;Smart Inventory 过滤器 |
| Ch13 CI/CD | 把 Tower 与 GitLab/GitHub 集成,代码提交即自动部署 playbook |
| Ch14 维护管理 | Tower 组件/日志/服务控制与排障;换 TLS 证书;备份恢复数据库与配置 |
- 目标(OUTCOMES):把普通项目重构为推荐结构;把 Ansible 清单从 INI 转成 YAML。
lab review-cr1 start → clone project-comp-review.git(site.yml 编排 lb/后端 web 服务器,roles 拆 lb/webapp)。- 清单改造:
mv inventory inventory.yml,转 YAML 语法(别忘 hosts: 键与冒号),含两个组:lb_servers(servera)与 web_servers(用范围写法 server[b:c].lab.example.com 代替原组名 mylocal_servers)。 - 引用的 playbook 同步改名:
deploy_apache.yml、deploy_webapp.yml 的 hosts: mylocal_servers → hosts: web_servers。 - webapp role 变量重命名(含 tasks 与 defaults 两处 + 全部引用):
msg → webapp_message、vers → webapp_version;内容行示例 content: "{{ webapp_message }} (version {{ webapp_version }})\n"。 - 验证:
ansible-playbook -i inventory.yml site.yml 无错执行 → git add --all; git commit -m "Refactoring of the review project"; git push → lab review-cr1 grade 直到全过。
- 目标:应用已有 lookup 插件与过滤器解决问题;把提权收敛到真正需要的任务;分批处理主机、失败过多即中止。
- 场景改造(clone
review-cr2.git,site.yml 部署前端 lb + 后端 webapp): - lookup + 模板批量出页面:webapp role 第二个任务改成按
locations.yml 列表为每个 location 生成 HTML——template src: location.html.j2、dest: "/var/www/html/{{ item.name }}.html"、loop: "{{ lookup('file','locations.yml') | from_yaml }}"。 - 精细提权(考点思路):删掉
ansible.cfg 的 [privilege_escalation] 里 become=true(别让所有任务默认提权);只给需要的块加 become: true——apache 的 tasks block、firewall 的 task 与唯一 handler、haproxy 的两个 handler 与 tasks block、webapp 的 tasks block(注意 block 层级缩进)。 - lookup + lineinfile 记录部署日志(考点):deploy_webapp.yml 加
pre_tasks(lineinfile path: /tmp/times.txt create: yes line: "{{ lookup('pipe', 'date') }}: Deploying version {{ webapp_version }} to {{ inventory_hostname }}" delegate_to: localhost)与 post_tasks(内容同构,字符串换 Deployment complete)——文件与任务落在控制机(workstation)的 /tmp/times.txt。 - 分批滚动 + 立即中止(考点):
serial: [1, 100%](第一批 1 台,成功才更新其余)+ max_fail_percentage: 0(任一台失败立即停整个 play)。
- 验证:
ansible-playbook site.yml;curl -s http://servera.lab.example.com/Sydney.html 出现办公室信息;tail -6 /tmp/times.txt 看到 “Deploying version v1.0 to serverb…”/“Deployment complete …” 成对记录。 - commit/push 后
lab review-cr2 grade(评分脚本检查远端仓库内容)→ lab review-cr2 finish。
- 背景 IMPORTANT:本段会清空课程前面所有 Tower 配置,从空环境开始后续 Review。
lab review-cr3 start → ssh root@tower → 进 /root/ansible-tower-setup-bundle-3.5.0-1.el8。wget http://materials.example.com/classroom/ansible/tower-backup-latest.tar.gz(下载到安装目录)→ ./setup.sh -r 恢复。- 验证:admin/redhat 登录,应只有 Demo Job Template 一个作业模板(配置已回滚到备份点)。
- 规格:Default 组织建两个 Normal User——
anny(Anny Mage / anny@lab.example.com)与 robert(Robert Farnham / robert@lab.example.com),密码均 redhat123;建 Team Devops(描述 Devops Team);把 anny、robert 加为 Members。 - Web UI 路径:Users → + 填表(USER TYPE=Normal User)→ SAVE;Teams → +(NAME Devops / ORGANIZATION Default)→ 进团队 → USERS → + 勾选 anny、robert → SAVE。
- 评价:Tower 界面核对;总评分脚本(最后统一跑)会检查。
- 规格与步骤:Inventories → Inventory Scripts → +:NAME
ldap-freeipa.py、描述 Dynamic Inventory for IPA Server、把 materials 提供的脚本内容粘进 CUSTOM SCRIPT 字段。 - 新建 Inventory
Dynamic Inventory(Default;描述 Dynamic Inventory from IPA server)→ SOURCES → +:SOURCE=Custom Script、CUSTOM INVENTORY SCRIPT=ldap-freeipa.py、UPDATE OPTIONS 勾 OVERWRITE。 - 同步(点双箭头,云图标转绿静止)→ GROUPS 出现 4 组:development / ipaservers / production / testing,每组含主机。
- 建 machine Credential
Devops(描述 Devops Credential;USERNAME devops / PASSWORD redhat;PRIVILEGE ESCALATION METHOD sudo、USERNAME root、PASSWORD redhat)→ PERMISSIONS 给 Devops 团队 Admin 角色(anny/robert 因此拥有该凭据的 Admin)。
- SCM 凭据
student-git(Source Control / username git / 私钥=workstation 上 ~/.ssh/lab_rsa 内容)。 - Project
My Full-Stack Project(描述 Full Stack Project;SCM TYPE Git;SCM URL ssh://git.lab.example.com/var/opt/gitlab/git-data/repositories/git/full-stack-setup.git;SCM CREDENTIAL student-git)→ SAVE 即自动触发 SCM update(图标白→红×→绿✓,状态页像普通 playbook 作业)。 - 三个 Job Template(均 JOB TYPE Run / INVENTORY Dynamic Inventory / PROJECT My Full-Stack Project / CREDENTIAL Devops): | NAME | PLAYBOOK | 描述 | | --- | --- | --- | | Set up Databases | database-setup.yml | Set up all databases | | Set up Web servers | webserver-setup.yml | Set up all web servers | | Set up Load Balancer | lb-setup.yml | Set up all load balancers |
- 权限:给 Devops 团队 Admin 角色于 Project 与三个 Job Template(各对象 PERMISSIONS → + → TEAMS 勾 Devops → Admin → SAVE)。
- Workflow Job Template
Full Stack Deployment(Default 组织;描述 Deploy the Full Stack;EXTRA VARIABLES:environment_name: "Development")。 - WORKFLOW VISUALIZER 编排(考点:节点 + On Success 连线):
- START → INVENTORY SYNC:Dynamic Inventory 的 Custom Script 源(蓝线=总是执行);
- 其成功(绿线,下同)→ PROJECT SYNC:My Full-Stack Project;
- 成功 → Set up Databases;
- 成功 → Set up Web servers;
- 成功 → Set up Load Balancer(JOBS 面板选模板,RUN 区选 On Success)。
- 给 Devops 团队该 Workflow 的 Admin 角色。
- Survey(+ADD SURVEY):PROMPT
What environment are you deploying?;ANSWER VARIABLE NAME environment_name;ANSWER TYPE Text;MIN LENGTH 1 / MAX LENGTH 40;DEFAULT ANSWER Development;REQUIRED Enabled;保存前确认编辑器顶部开关 ON。 - Email Notification Template
Notify on Job Success and Failure(Default;TYPE Email;HOST localhost;RECIPIENT LIST student@localhost;SENDER EMAIL system@lab.example.com;PORT 25)。 - 到 Workflow 模板 NOTIFICATIONS 页,把 SUCCESS 与 FAILURE 两个开关都拨 ON。
- 前提:前面 Review 全部完成(备份恢复→用户团队→动态清单→凭据→模板→工作流)。
- 以 robert 登录 Tower → Templates → Full Stack Deployment → 火箭图标启动(会弹 Survey,用默认 Development)→ 作业链顺序执行。
- 验证①(邮件通知):tower 上
tail -f /var/mail/student 收到 Workflow job summary——node #6 动态清单作业、#7 Project sync(My Full-Stack Project)、#8 Set up Databases、#9 Set up Web servers、#10 Set up Load Balancer 均 successful。 - 验证②(应用/负载均衡):浏览器开 servera/d/e/f 四个站点,页面底部都有 Deployment Version: Development(Survey 变量生效);反复刷新 http://serverb.lab.example.com,负载均衡在四台 web 服务器间轮询。
- 收尾评分:workstation 上
lab review-cr3 grade(按输出修错重跑直至成功)——本评分脚本统一评定 Review 3~8 的全部配置。
| 命令/关键字 | 用途 |
|---|
lab review-cr1 start/grade | Review 1:项目重构 + INI→YAML 清单 |
mv inventory inventory.yml | 清单改名(YAML 化第一步) |
ansible-playbook -i inventory.yml site.yml | 本地验证重构后 playbook |
git commit -m "Refactoring of the review project" / push | 提交重构(评分看远端) |
lab review-cr2 start/grade/finish | Review 2:lookup/提权/滚动 |
lookup('file','locations.yml') | from_yaml | 读 YAML 文件做 loop 数据源 |
loop: + {{ item.name }} | 模板批量生成多个文件 |
serial: [1, 100%] + max_fail_percentage: 0 | 先 1 台、成功后全量;任一台失败即停 |
pre_tasks/post_tasks + delegate_to: localhost | 部署开始/结束记录(控制机) |
lookup('pipe', 'date') + lineinfile | 取时间戳写 /tmp/times.txt |
lab review-cr3 start | Review 3~8 的资源准备脚本 |
wget http://materials.example.com/.../tower-backup-latest.tar.gz | 下载恢复用备份 |
./setup.sh -r | 从备份恢复 Tower(回到只有 Demo 模板) |
| Web UI:Users/Teams/Inventory Scripts/SOURCES/OVERWRITE/Credentials | Review 4/5 建用户团队、动态清单、凭据 |
ssh://git.lab.example.com/var/opt/gitlab/.../full-stack-setup.git | Review 6 SCM URL(ssh 方式拉项目) |
| Web UI:WORKFLOW VISUALIZER / On Success / ADD SURVEY / NOTIFICATIONS | Review 7 工作流编排、调查、通知开关 |
curl -s http://servera.../Sydney.html(等) | 内容验证 |
tail -f /var/mail/student | 收工作流完成邮件 |
lab review-cr3 grade | 总评分(Review 3~8 一次过) |
| 英文 | 中文速记 |
|---|
| comprehensive review | 课程综合复习(验证全书技能) |
| specification | 规格说明(Tower 配置要求文档) |
| refactor / recommended structure | 重构 / 推荐的项目与清单结构 |
| YAML inventory(hosts: 键) | 推荐的新式清单格式 |
| host pattern(大小写敏感) | play hosts 声明匹配组/主机 |
| fine-grained privilege escalation | 只给需要的任务开提权(block/task/handler) |
| lookup plugin(file/pipe) | 从文件/命令取数据填充变量 |
| from_yaml filter | 把 YAML 文本解析成可迭代结构 |
| serial / max_fail_percentage | 分批执行 / 失败上限(0=立即停) |
| pre_tasks / post_tasks | play 主任务前/后执行的任务 |
| lineinfile | 追加/保证某行存在(日志文件) |
| delegate_to: localhost | 把任务放到控制机执行 |
| SCM update / status icon | Project 自动拉取(白/红/绿图标) |
| Inventory Scripts(Custom Script) | 自定义动态清单脚本入口 |
| OVERWRITE(update option) | 同步时覆盖已有组/主机 |
| Workflow VISUALIZER / On Success | 工作流画布 / 成功才继续的连线 |
| Survey(environment_name) | 启动时向用户提问的变量收集 |
| Notification Template(Email) | 邮件通知模板(SUCCESS/FAILURE 开关) |
| Demo Job Template | 备份恢复成功的标志(只剩它) |
- 本章 GOAL 的核心考核方式是什么?(给规格 → 在 Tower 搭“新组织 + 全栈部署”)
- INI→YAML 清单改造容易漏什么?(hosts: 键与冒号;组内主机写法 server[b:c] 含义是什么?)
- “精细提权”的默认动作与逐点动作分别是什么?为什么推荐只在 block/task/handler 加 become?
- 用一行 YAML 写“读 locations.yml 后 from_yaml 再 loop 生成页面”;模板 dest 为什么用
{{ item.name }}.html? - pre_tasks/post_tasks 的 lineinfile 日志为什么必须 delegate_to localhost?/tmp/times.txt 落在哪台机器?
serial: [1, 100%] 与 max_fail_percentage: 0 分别控制什么?想“任一台失败立即停”怎么配?- Review 3 恢复备份后,用什么作为“恢复成功”的标志?为什么后续 Review 都基于空环境?
- 自定义动态清单源在 Tower 的哪两个入口配置(脚本本身 + 清单源)?同步后出现哪 4 个组?
- 工作流链条的五步是什么?每步之间连线的触发条件(On Success)表达什么语义?
- Survey 的变量名 environment_name 如何一路作用到网页 “Deployment Version: Development”?邮件通知模板的四个关键字段是什么?
- DO447 教材文字层到此完结(Ch1~15);配合 RH358(1~12 章)即完成 RHCA 两本英语教材精读闭环。建议回到
00-RHCA教材精读-导航与学习法.md,把两门课章节地图按“已完结”收尾,再按个人目标补 CL260/RH436/RH442(OCR 后)。