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

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

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

我希望它始终为我启动一些服务。我有用于此目的的处理程序,但无条件触发处理程序执行的最佳方法是什么,例如让它始终工作?

像这样:

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

答案1

如果您每次都确实需要触发处理程序,那么有两个选项:

1)运行一个 noop shell 命令,它将始终报告已更改

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

2)使用 debug 以及更改时间:触发处理程序

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

还有笔记check_mode: no对于选项 1 和检查模式:如果使用 Ansible 2.2 或更高版本,或者使用更早的版本,您可能需要使用,always_run: yes以便任务不会在检查模式下被跳过。从我的手动测试来看,处理程序似乎仍处于检查模式,但请小心,因为您的情况可能有所不同。

答案2

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
  1. 但是,听起来你只是想确保服务正在运行或重新启动,而不管另一个任务的结果如何。在这种情况下,不要使用处理程序,而是使用调用 Ansibleservice模块的新任务:https://docs.ansible.com/ansible/latest/collections/ansible/builtin/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

答案3

重启服务是一回事,确保它正在运行又是另一回事。如果你想ansible确保它nginx正在运行,你可以这样做:

tasks:
  - name: Ensure nginx is running
    service: name=nginx state=started

相关内容