剧本内部的执行顺序
一个剧本(play)里的执行顺序是:先运行前置任务,用于检查与准备;接着按声明顺序执行引用的角色;然后执行主任务列表;最后运行后置任务。被任务通知的处理器不会立刻执行,而是等任务列表执行完后统一触发,同一处理器即使被通知多次也只运行一次。理解这一点很重要:依赖「改完配置立刻重启」的写法需要显式触发处理器,否则重启会推迟到整个任务列表结束。
基本信息
| 剧本组成 | 作用主机、变量、前置任务、角色、任务、后置任务 |
|---|---|
| 执行顺序 | 前置任务、角色、任务、后置任务、处理器 |
| 处理器行为 | 被通知后延迟执行,同一处理器只运行一次 |
| 主机之间 | 按策略与批次并行推进 |
结构组织要点
- 前置任务做检查:把环境与依赖校验放在前置任务里,失败即停避免后续动作执行。
- 角色承担标准做法:安装、配置、服务管理封装成角色,剧本只做编排。
- 处理器管重启:配置变更通知处理器,避免每个任务都写重启。
- 变量就近声明:剧本级变量用于流程参数,环境差异仍放变量目录。
- 批次与失败控制:按服务重要性设置批次、失败比例与错误中断策略。
- 后置任务做验证:把校验、清理与通知放在后置任务中,形成完整闭环。
剧本骨架
剧本骨架
- hosts: role_web # 作用范围来自清单分组
serial: 2 # 每批两台,控制影响面
max_fail_percentage: 0 # 任意一台失败即停止后续批次
pre_tasks: # 第一步:前置检查
- name: 校验磁盘空间
ansible.builtin.assert:
that: ansible_facts.mounts | selectattr('mount','eq','/') | map(attribute='size_available') | first > 2147483648
roles:
- role: nginx # 第二步:标准做法
tasks:
- name: 下发站点配置
ansible.builtin.template:
src: site.conf.j2
dest: /etc/nginx/conf.d/site.conf
notify: reload nginx # 触发处理器,末尾统一执行
post_tasks: # 最后一步:后置校验
- name: 校验端口监听
ansible.builtin.wait_for:
port: 80
timeout: 30
handlers:
- name: reload nginx
ansible.builtin.service:
name: nginx
state: reloaded各段职责
| 段落 | 作用 | 典型内容 |
|---|---|---|
| 前置任务 | 执行前检查与准备 | 空间检查、依赖连通性、事实采集 |
| 角色 | 标准做法 | 安装、配置、服务管理 |
| 主任务 | 本剧情的具体动作 | 模板下发、用户与权限设置 |
| 后置任务 | 校验与收尾 | 健康检查、通知、清理 |
| 处理器 | 变更后统一触发 | 重载或重启服务 |
| 变量与批次 | 控制参数与影响面 | 剧本变量、批次、失败比例 |
处理器延迟执行是常见误解来源:写下发配置后立刻重启的直觉并不成立,重启会等到任务列表结束;若确实需要立即生效,应在该位置显式触发处理器。
同一主机上的任务是顺序执行的,主机之间才并行。因此把「先全部升级再统一重启」写成一个任务列表时,实际是每台主机各自升级并重启,而非整体两阶段执行。