只有在该游戏中出现处理程序时,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代码?
提前致谢
答案 0 :(得分:2)
最后,我通过检测相关角色的存在并使用它来确定要运行的处理程序来找到解决方案。如果你能看到更短的方式,请发一个答案。
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')
答案 1 :(得分:0)
剧本可以访问角色中定义的变量。 因此,您可以在role / apache / vars / main.yml中创建一个变量“ role_apache:true”,并在条件条件中使用该变量。
如果您在同一本剧本中,也可以在role / php和Roles / php-fhm中访问该var。即使您跳过其中之一。