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

Sla*_* II 46 ansible

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

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

像这样的东西:

tasks:
    - name: Trigger handler
      run_handler: name=nginx-restart
Run Code Online (Sandbox Code Playgroud)

jar*_*arv 75

如果您绝对需要每次都触发处理程序,那么这里有两个选项:

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

-  name: trigger nginx-restart
   command: /bin/true
   notify: nginx-restart
Run Code Online (Sandbox Code Playgroud)

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

-  debug: msg="trigger nginx-restart"
   notify: nginx-restart
   changed_when: true
Run Code Online (Sandbox Code Playgroud)

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

  • 如今,即使任务失败,您也可以` --force-handlers 运行处理程序` (9认同)
  • 是的,尽管这将强制所有处理程序运行 (6认同)

Jef*_*man 20

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

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

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

    任务:

    • shell:这里有一些任务
    • 元:flush_handlers
    • 外壳:一些其他任务
  3. 但是,听起来您只想确保服务正在运行或重新启动,而不管另一个任务的结果如何。在这种情况下,不要使用处理程序,而是使用调用 Ansibleservice模块的新任务:https : //docs.ansible.com/ansible/latest/collections/ansible/builtin/service_module.html

    任务:

    • 名称:确保 ntp 正在运行服务:名称=ntp state=started enabled=yes

    • 名称:总是重新加载 nginx 服务:名称=nginx 状态=重新加载

    • 名称:始终重启 MySQL 服务:名称=mysql state=restarted

  • (3) 的问题在于,一个人可能有多个通知处理程序的任务,我不希望处理程序多次运行(重新启动服务)。 (2认同)
  • 我相信您在问题 #4777 中引用的文档是不正确的:`--force-handlers` 不会无条件运行所有处理程序。https://unix.stackexchange.com/a/327595/29483 `--force-handlers` 的行为几乎在其他地方都有正确记录,例如在手册页和 ansible 用户指南中,它是*通知的*处理程序即使由于任务失败而提前停止,也会运行。 (2认同)

Ant*_*des 11

重启服务是一回事;确保它正在运行是另一回事。如果要ansible确保nginx正在运行,请执行以下操作:

tasks:
  - name: Ensure nginx is running
    service: name=nginx state=started
Run Code Online (Sandbox Code Playgroud)