首页/系统与基础设施/自动化运维速查/处理器触发机制与执行时机
Ansible 核心70 条

处理器触发机制与执行时机

处理器只在被通知且任务确实变更时执行,默认在 play 的普通任务全部结束后统一运行;通知名不匹配不会报错,play 中途失败可能导致它根本没机会执行。

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

先标记后执行

处理器是一类特殊任务:只有被通知、且被通知的那个任务本次确实产生了变更,它才会执行,默认在所有普通任务跑完之后统一执行一次。这套“先标记、后执行”的机制让重复重启被自动合并,也带来了两个高频困惑:处理器结果为什么总出现在最后、通知了为什么没有执行。把触发条件说清楚,多数疑问就能自己解释。

基本信息

触发方式任务在发生变更时按名字通知处理器
默认时机每个 play 的普通任务全部结束之后
生效条件有通知,且通知它的任务状态为已变更
打破时机用显式的元任务强制触发,或调整 play 结构

典型使用场景

  • 改完配置后重载服务:避免每个改配置的任务都触发一次重载
  • 多个任务改同一份配置:合并成一次重载,缩短服务中断窗口
  • 需要立刻生效的场景:用强制触发方式执行,而不是等末尾
  • 调试“通知了却没跑”:先确认任务是否真的产生了变更
  • 多项服务按顺序重载:靠处理器的声明顺序排列

通知与强制触发

通知与强制触发
- name: 改配置  # 只有状态为已变更时才通知
  ansible.builtin.template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
  notify: reload nginx

- name: 需要立刻执行时强制触发  # 否则等到 play 末尾
  ansible.builtin.meta: flush_handlers

# handlers 段(写在同一 play 内)
# - name: reload nginx
#     ansible.builtin.service:
#       name: nginx
#       state: reloaded

执行与否对照

情形是否执行原因
任务有变更并通知执行通知与变更两个条件都满足
任务无变更不执行没有变更就不会触发
通知名不匹配不报错也不执行找不到对应处理器
play 中途失败可能不执行默认在普通任务之后阶段运行
处理器的输出集中在末尾出现,不代表它在末尾才被决定:通知在任务执行时就已经登记,只是统一放到阶段末尾运行。看输出顺序时别被位置误导。
用强制触发打破默认顺序后,后面再发生的变更会再触发一次,服务可能被重载两次。确认影响范围后再使用,尤其是重启类动作。

失败与时机的关系

默认时机在普通任务之后,所以 play 中途失败时处理器可能根本没有机会运行,结果是配置改了但服务没重载,机器处在中间状态。对顺序敏感的变更,可以把不可预演或可能失败的任务放在重载之前,并在关键步骤后强制触发一次,缩小不一致窗口。

易错点

  • 通知名与处理器名不一致,既不报错也不执行,配置改了服务却没重载
  • 任务实际没有产生变更仍期望处理器执行,条件不满足自然不会跑
  • play 中途失败导致处理器未运行,配置与服务状态不一致
  • 强制触发之后又出现新的变更,服务被重载或重启两次
  • 多处声明同名处理器,执行顺序与预期不符且难以排查

数据来源与参考

  • Ansible 官方文档 Handlers
  • Ansible 官方文档 ansible.builtin.meta(flush_handlers)
  • Ansible 官方文档 Playbook 执行流程说明

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

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