获取 Ansible 正在进行的通知列表
Get Ansible ongoing notify list
我正在寻找一种方法来获取包含由剧本触发的当前处理程序通知的列表(可能是一个可靠的系统变量)。
换句话说,在角色的某个时刻,我想向任务添加一个 "when" 条件,以测试 "restart notification" 是否尚未发送
-> 当重启不在通知列表中时执行此任务
有什么想法吗?
非常感谢!
退一步说,您处于需要以这种方式重新开始某事的情况似乎很奇怪。如果您没有进行任何更改,为什么要重新启动它?如果您已经 进行了更改,为什么不在进行更改的任何任务上注册通知?
无论如何,对于您想做的事情,最简单的解决方案似乎就是发出通知:
- debug:
msg: ensure that handler myhandler is notified
changed_when: "force_change|default('false')|bool"
notify: myhandler
这将为 myhandler
注册一个通知,并且之前的任务是否已注册通知并不重要:在任何一种情况下,myhandler
处理程序将在剧终。
我终于找到了一个解决方案,完全可以接受,使用事实。
我使用一个处理程序来设置事实,并使用另一个处理程序来执行重启。我将它们都与同一通知的监听参数相关联。
此外,仅当该事实未定义或设置为 false 时,重新加载处理程序才执行重新加载。
- name: Register restart Logstash
set_fact:
restart_notified: true
listen: "Restart Logstash"
- name: Restart Logstash service
systemd:
name: logstash
daemon_reload: true
state: restarted
listen: "Restart Logstash"
- name: Reload Logstash
systemd:
name: logstash
daemon_reload: true
state: reloaded
when: restart_notified is not defined or not restart_notified
然后我在需要的地方使用,Restart Logstash
或 Reload Logstash
,并且只执行一个,重新启动或重新加载,但永远不会两者都执行。
类似的解决方案,用寄存器代替 set_fact。
tasks:
- name: some tasks, which maybe trigger "restart notification"
# ...
- name: trigger reload handler always
debug:
msg: always trigger handler
changed_when: true
notify: reload notification
handlers:
- name: restart notification
debug:
register: restartNotificationHandler
- name: reload notification
debug:
when: restartNotificationHandler is not defined or restartNotificationHandler is skipped
有关如何始终触发处理程序的信息,请参阅https://serverfault.com/questions/617548/always-trigger-handler-execution-in-ansible
我正在寻找一种方法来获取包含由剧本触发的当前处理程序通知的列表(可能是一个可靠的系统变量)。
换句话说,在角色的某个时刻,我想向任务添加一个 "when" 条件,以测试 "restart notification" 是否尚未发送 -> 当重启不在通知列表中时执行此任务
有什么想法吗?
非常感谢!
退一步说,您处于需要以这种方式重新开始某事的情况似乎很奇怪。如果您没有进行任何更改,为什么要重新启动它?如果您已经 进行了更改,为什么不在进行更改的任何任务上注册通知?
无论如何,对于您想做的事情,最简单的解决方案似乎就是发出通知:
- debug:
msg: ensure that handler myhandler is notified
changed_when: "force_change|default('false')|bool"
notify: myhandler
这将为 myhandler
注册一个通知,并且之前的任务是否已注册通知并不重要:在任何一种情况下,myhandler
处理程序将在剧终。
我终于找到了一个解决方案,完全可以接受,使用事实。
我使用一个处理程序来设置事实,并使用另一个处理程序来执行重启。我将它们都与同一通知的监听参数相关联。
此外,仅当该事实未定义或设置为 false 时,重新加载处理程序才执行重新加载。
- name: Register restart Logstash
set_fact:
restart_notified: true
listen: "Restart Logstash"
- name: Restart Logstash service
systemd:
name: logstash
daemon_reload: true
state: restarted
listen: "Restart Logstash"
- name: Reload Logstash
systemd:
name: logstash
daemon_reload: true
state: reloaded
when: restart_notified is not defined or not restart_notified
然后我在需要的地方使用,Restart Logstash
或 Reload Logstash
,并且只执行一个,重新启动或重新加载,但永远不会两者都执行。
类似的解决方案,用寄存器代替 set_fact。
tasks:
- name: some tasks, which maybe trigger "restart notification"
# ...
- name: trigger reload handler always
debug:
msg: always trigger handler
changed_when: true
notify: reload notification
handlers:
- name: restart notification
debug:
register: restartNotificationHandler
- name: reload notification
debug:
when: restartNotificationHandler is not defined or restartNotificationHandler is skipped
有关如何始终触发处理程序的信息,请参阅https://serverfault.com/questions/617548/always-trigger-handler-execution-in-ansible