我正在使用 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
版本,或者使用比该版本更早的版本,您可能需要使用,以便任务不会在检查模式下被跳过。从我的手动测试来看,处理程序似乎仍处于检查模式,但请小心,因为您的情况可能有所不同。
Jef*_*man 20
要始终强制所有处理程序,请运行ansible-playbook playbook.yml --force-handlers
,如此处所述:https : //github.com/ansible/ansible/issues/4777
要强制在剧本中的特定点通知处理程序,您可以使用元任务https://docs.ansible.com/playbooks_intro.html:
任务:
但是,听起来您只想确保服务正在运行或重新启动,而不管另一个任务的结果如何。在这种情况下,不要使用处理程序,而是使用调用 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
Ant*_*des 11
重启服务是一回事;确保它正在运行是另一回事。如果要ansible
确保nginx
正在运行,请执行以下操作:
tasks:
- name: Ensure nginx is running
service: name=nginx state=started
Run Code Online (Sandbox Code Playgroud)