始终在Ansible中触发处理程序执行


33

我正在使用Ansible设置我的开发服务器。

我希望它总是为我提供一些服务。我为此有处理程序,但是触发无条件执行处理程序的最佳方法是什么,例如使其始终有效?

像这样:

tasks:
    - name: Trigger handler
      run_handler: name=nginx-restart

6
如果您希望任务始终运行,则应使其成为任务而不是处理程序。
乔丹

@Jordan-有时您可能想要一个在大多数情况下(除了此特定情况之外)有条件触发的处理程序。
silverdr

Answers:


61

如果您绝对需要每次触发处理程序,则有两个选择:

1)运行noop shell命令,该命令将始终报告更改

-  name: trigger nginx-restart
   command: /bin/true
   notify: nginx-restart

2)使用debug和changed_when:一起触发处理程序

-  debug: msg="trigger nginx-restart"
   notify: nginx-restart
   changed_when: true

还要注意选项1和检查模式:check_mode: no如果使用的是Ansible 2.2或更高always_run: yes版本,或者使用的版本比以前的版本低,则可能要使用它,以便在检查模式下不会跳过任务。从我的手动测试来看,处理程序似乎仍处于检查模式,但请注意您的情况可能有所不同。


7
如今,即使任务失败,您也可以使用--force-handlers运行处理程序。–
conny

5
是的,尽管这将迫使所有处理程序运行
jarv

我发现这篇文章对状态的改变很有用,这使我在这里。 serverfault.com/a/799282/173002。ty。
sonjz

谢谢,我使用了选项2和其中changed_when包含更多逻辑的方法来实现非幂等任务(在某些情况下可能被多次调用)作为处理程序而不是任务。
Sammitch

17

Ansible提供了几种强制处理程序的选项:

1)要始终强制所有处理程序,请运行ansible-playbook playbook.yml --force-handlers,如此处所述:https : //github.com/ansible/ansible/issues/4777

2)要强制在剧本中某个特定点被通知的处理程序,您可以使用元任务https://docs.ansible.com/playbooks_intro.html

tasks: 
  - shell: some tasks go here
  - meta: flush_handlers
  - shell: some other tasks

3)但是,听起来好像您只是想确保服务正在运行或重新启动,而不管其他任务的结果如何。在这种情况下,不要使用处理程序,而要使用一个调用Ansible service模块的新任务:http : //docs.ansible.com/service_module.html

tasks: 
  - name: ensure ntp is running
    service: name=ntp state=started enabled=yes

  - name: always reload nginx
    service: name=nginx state=reloaded

  - name: always restart MySQL
    service: name=mysql state=restarted

1
(3)的问题在于,可能有多个任务通知处理程序,并且我不希望处理程序多次运行(重新启动服务)。
乔纳森·哈特利

多个任务可以通知同一个处理程序,并且该处理程序只会执行一次。这就是处理程序的重点。
Jeff Widman

嘿,杰夫。这个答案是关于不使用处理程序,仅使用任务来指定所有动作。
乔纳森·哈特利

抱歉,恐怕我还是不明白您要解决的用例...也许以您要完成的工作为例打开一个新问题?如果您添加带有链接的评论,我会尽力回答。
杰夫·威德曼

我不需要一个新问题。OQ询问“如何确保始终运行处理程序”,该答案的第3部分建议“改为使用任务”,我的评论指出“在某些情况下,您的任务可能会运行多次”。
乔纳森·哈特利

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.