Ansible中触发Restart Service handler时如何忽略Reload Service handler?
解决Ansible中Handler互斥执行的问题
我有两个Handler,分别对应setup标签(负责重启服务)和update标签(负责重载服务),代码如下:
- name: Restart Service become: yes systemd: name: some.service state: restarted enabled: yes - name: Reload Service become: yes systemd: name: some.service state: reloaded enabled: yes
部分play/role任务同时包含setup和update标签,需求是:当Restart Service Handler被调用时,不执行Reload Service Handler。
解决方案:利用meta: clear_handlers清除待执行的Handler
可以通过给Restart Service Handler添加通知任务,调用meta: clear_handlers清空所有待执行的Handler队列,确保重启服务触发后,重载服务的Handler不会被执行。
修改后的Handlers配置如下:
- name: Restart Service become: yes systemd: name: some.service state: restarted enabled: yes notify: Clear pending handlers - name: Clear pending handlers meta: clear_handlers - name: Reload Service become: yes systemd: name: some.service state: reloaded enabled: yes
原理说明:
- 当
Restart Service被触发执行后,会触发Clear pending handlers任务,直接清空Ansible的待执行Handler队列。 - 若仅
Reload Service被触发,由于没有触发清空操作,重载服务任务会正常执行。 - 对于同时包含
setup和update标签的任务,只要Restart Service被触发,后续的Reload Service会被从队列中清除,不会执行。
内容的提问来源于stack exchange,提问作者Slez-E
相关产品推荐
相关产品推荐

