我正在使用 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 提供了几个强制处理程序的选项:
要始终强制所有处理程序,请运行
ansible-playbook playbook.yml --force-handlers
,如下所述:https://github.com/ansible/ansible/issues/4777要强制在剧本中的特定点通知的处理程序,可以使用元任务https://docs.ansible.com/playbooks_intro.html:
tasks:
- shell: some tasks go here
- meta: flush_handlers
- shell: some other tasks
- 但是,听起来你只是想确保服务正在运行或重新启动,而不管另一个任务的结果如何。在这种情况下,不要使用处理程序,而是使用调用 Ansible
service
模块的新任务: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