本章主线:前两章建立了引擎的心智图,本章把五件武器逐个过手——清单、模块、剧本、变量引擎、插件,最后用一整节把贯穿全书的幂等性讲到底。这是全书最厚的一章,也是日后翻回来查最多的一章:每一节都按"概念骨架 → 动手示例 → 易错清单"组织,方便当参考用。
为什么把五个组件放在一章而不是拆成五章?因为它们不是并列关系,而是一台机器的五个咬合部位:清单回答"对谁做",模块回答"用什么做",剧本回答"按什么顺序做",变量引擎回答"参数从哪来",插件回答"哪一环想换零件"。分开讲会丢掉咬合感,而咬合感正是从"会抄示例"到"会写剧本"的分界线。
3.1 从清单开始——它最简单,却是变量体系的载体,INI 与 YAML 两种格式、组嵌套、分环境布局都会过一遍。3.2 走进模块库:按用途给常用模块分类,讲模块参数的通用写法与文档查阅方式,你将学会不背模块、用 ansible-doc 现查现用的方法。3.3 是章内重心:剧本的结构解剖,从单 play 到多 play、任务级关键字(条件、循环、委托、变更标记)、handlers 的配合写法。3.4 啃最硬的骨头:变量优先级的完整阶梯与模板引擎,Jinja2 表达式、过滤器、事实变量的组合是剧本表现力的来源,也是事故的来源。3.5 概览插件体系:连接、策略、回调、过滤、查找、清单插件各自挂在生命线的哪一站,以及什么信号出现时该去写自定义插件而不是继续堆 YAML。3.6 收束到幂等性:哪些模块天然幂等、哪些写法会破坏幂等、shell 类任务如何自己补齐幂等判断——这一节同时是 7.3 节故障实录的理论前置。
本章知识点按组件分列,均可自测。清单组件:写出含组嵌套、主机变量、组变量的 INI 与 YAML 清单各一份,说出清单目录布局下 group_vars 与 host_vars 的加载规则(3.1)。模块组件:说出模块的统一形态与 changed 判定逻辑,用 ansible-doc 三步查到一个陌生模块的用法,讲清 command、shell、raw 的差异与补幂等的两个开关(3.2)。剧本组件:写出带 pre_tasks、tasks、post_tasks、handlers 与 serial 的滚动发布骨架,说清 when、loop、delegate_to、run_once 的语义(3.3)。变量组件:背出精简版优先级阶梯的两端,写出 default、dict2items、ternary 三个过滤器的使用场景,按四病因法排查一个"变量不生效"问题(3.4)。插件组件:说出七类插件挂在生命线的哪个位置,判断什么信号出现该写自定义插件(3.5)。幂等组件:解释三层幂等模型,用"探测-执行-标记"三段式把一个脚本包装成幂等任务(3.6)。
六章体量决定了大多数人无法一次记全,这正常也无妨。建议的节奏:3.1 与 3.2 当天过手;3.3 与 3.6 是必须精读的两节,前者决定你能否独立写剧本,后者决定你的剧本能否进生产;3.4 允许先记"两端"(额外变量最高、角色默认最低)后回头补全;3.5 可以初读一遍建立索引,等遇到具体需求再回来查。所有节都按"概念骨架 → 动手示例 → 易错清单"组织,就是为了让它们日后能当参考手册用——教材的价值在第一次读通,手册的价值在第一百次查对,本章目标是两者兼顾。
本章所有示例延续"星尘在线"项目语境:一台控制机加两三台实验机,模块示例以 Linux 主机为主,Windows 与网络设备的差异在相应位置点到为止。读完本章,你应当能独立编写一份带模板、变量、handlers、条件与循环的多 play 剧本,并且能对"这个任务为什么每次都 changed"给出至少三种可能的解释。