获取Ansible持续通知列表

时间:2017-09-18 12:04:10

标签: ansible handlers

我正在寻找一种方法来获取列表(可能是一个ansible系统变量),其中包含由剧本触发的当前处理程序通知。

换句话说,在角色的某个时刻,我想向一个任务添加一个“when”条件,该任务将测试是否还没有发送“重启通知” - >重新启动不在通知列表中时执行此任务

有什么想法吗?

非常感谢!

3 个答案:

答案 0 :(得分:0)

退一步说,你处于需要以这种方式重新启动某些东西的情况似乎很奇怪。如果您没有进行任何更改,为什么要重新启动呢?如果您已经进行了更改,为什么不在任何正在进行更改的任务上注册通知?

在任何情况下,对于您想要做的事情,似乎最简单的解决方案就是提出通知:

- debug:
    msg: ensure that handler myhandler is notified
  changed_when: "force_change|default('false')|bool"
  notify: myhandler

这将注册myhandler的通知,如果先前的任务是否已注册通知也无关紧要:在任何一种情况下,myhandler处理程序将在结束时触发一次该剧。

答案 1 :(得分:0)

我终于找到了一个完全可以接受的解决方案。

我使用处理程序设置事实,使用另一个处理程序来执行重启。我将它们与listen参数关联到同一通知。

此外,只有在未定义该事实或将其设置为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,只执行一次,重启或重新加载,但从不同时使用。

答案 2 :(得分:0)

类似的解决方案,使用寄存器代替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