获取 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 LogstashReload 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