在Ansible中,是否有可能仅在播放中存在处理程序时有条件地通知处理程序?
例如:我有一本用于多种主机配置的手册。有些主机使用Apache运行PHP,有些则使用PHP-FPM。根据主机的不同,修改PHP时需要运行不同的处理程序。
这是问题的一个简单示例:
- name: copy php.ini
copy:
src=roles/php/templates/{{ php_template }}/php.ini
dest=/etc/
notify:
- reload php-fpm
- reload apache
显然,我想做的是在php.ini文件更改时通知正确的软件重新加载。但是,Ansible会产生错误,因为在任何时候都只有一个处理程序出现在剧本中,例如:
ERROR: change handler (reload php-fpm) is not defined
有没有一种方法可以在不产生错误或不复制Ansible代码的情况下实现这一目标?
提前致谢
最后,我通过检测相关角色的存在并使用它来确定要运行的处理程序,找到了一种解决方案。如果您可以找到更短的方法,请发布答案。
roles/php/tasks/main.yml
----
- name: detect apache
shell:
'ls /etc/init.d/ | grep httpd | wc -l'
register:
httpd_exists
- name: detect php-fpm
shell:
'ls /etc/init.d/ | grep php-fpm | wc -l'
register:
phpfpm_exists
然后为每个相关处理程序创建本地通知程序:
notify:
- php reload apache
- php reload php-fpm
然后仍然扮演相同的角色,将条件添加到本地处理程序。
roles/php/handlers/main.yml
---
- name: php reload apache
include: ../../apache/handlers/main.yml
when: (httpd_exists.stdout == '1')
- name: php reload php-fpm
include: ../../php-fpm/handlers/main.yml
when: (phpfpm_exists.stdout == '1')
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句