我正在寻找一种获取列表(可能是Ansible System变量)的方法,该列表包含剧本触发的当前处理程序通知。
换句话说,在角色的某个时刻,我想在一个任务中添加"何时"条件,该任务测试是否尚未发送"重新启动通知" ->当不在"通知列表"中重新启动时执行此任务
有什么想法吗?
非常感谢!
我终于提出了一个解决方案,可以使用事实。
我使用处理程序设置事实,而另一个则执行重新启动。我将他们两个都与听力参数相关联。
此外,仅在未定义或设置为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
i然后在需要时使用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
退后一步,您需要以这种方式重新启动某些东西似乎很奇怪。如果您没有进行任何更改,为什么要重新启动?而且,如果您进行了更改,为什么不在任何要更改的任务上注册通知呢?
无论如何,您想做的事情似乎最简单的解决方案只是提出通知:
- debug:
msg: ensure that handler myhandler is notified
changed_when: "force_change|default('false')|bool"
notify: myhandler
这将注册myhandler
的通知,并且以前的任务是否已注册通知也没关系:在播放结束时,myhandler
处理程序将被触发一次。