首页/系统与基础设施/自动化运维速查/Playbook 的剧本结构与执行顺序
Ansible 核心70 条

Playbook 的剧本结构与执行顺序

Playbook 由若干剧本组成,每个剧本声明作用主机、变量与任务序列,执行顺序为前置任务、角色、主任务、后置任务,最后统一运行被触发的处理器;主机之间的任务并行推进,同一主机的任务顺序执行。理解这一顺序是避免「配置还没下发就重启服务」这类问题的前提。

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‌​‌‌‌‌​​‌​‌‌​​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌​‌​‌‌​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌‌​​‌​​‌‌‌​‌​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌‌​‌​‌​‌‌‌​​‌​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​‌​‌​‌‌‌‌​​​​‌‌​​‌​‌​‌‌​​​‌‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌​‌​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​​​‌‌​​‌​‌​‌‌‌​​‌​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

剧本内部的执行顺序

一个剧本(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

各段职责

段落作用典型内容
前置任务执行前检查与准备空间检查、依赖连通性、事实采集
角色标准做法安装、配置、服务管理
主任务本剧情的具体动作模板下发、用户与权限设置
后置任务校验与收尾健康检查、通知、清理
处理器变更后统一触发重载或重启服务
变量与批次控制参数与影响面剧本变量、批次、失败比例
处理器延迟执行是常见误解来源:写下发配置后立刻重启的直觉并不成立,重启会等到任务列表结束;若确实需要立即生效,应在该位置显式触发处理器。
同一主机上的任务是顺序执行的,主机之间才并行。因此把「先全部升级再统一重启」写成一个任务列表时,实际是每台主机各自升级并重启,而非整体两阶段执行。

易错点

  • 误以为处理器会立即执行:配置下发成功但重启推迟到剧本末尾,期间服务仍在使用旧配置
  • 把所有动作塞进一个剧本:前置检查、变更与验证混在一起,失败时无法判断中断位置
  • 缺少前置检查:环境不满足时仍进入变更阶段,失败留在半成品状态
  • 批次与失败策略默认:一台失败不影响其他主机继续执行,错误状态在集群中扩散

数据来源与参考

  • Ansible 官方文档:Playbook 结构与执行顺序
  • Ansible 官方文档:handlers 与 flush_handlers 说明
  • Ansible 官方文档:strategy、serial 与批次执行

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/automation/playbook-structure-execution-order.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‌​‌‌‌‌​​‌​‌‌​​​‌​​‌‌​‌‌‌‌​‌‌​‌‌‌‌​‌‌​‌​‌‌​​‌​‌‌​‌​‌‌‌​​‌‌​‌‌‌​‌​​​‌‌‌​​‌​​‌‌‌​‌​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌‌​‌​‌​‌‌‌​​‌​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​‌​‌​‌‌‌‌​​​​‌‌​​‌​‌​‌‌​​​‌‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌​‌​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​​​‌‌​​‌​‌​‌‌‌​​‌​​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​