Ansible中的条件通知取决于角色

Ansible中的条件通知取决于角色,ansible,ansible-playbook,Ansible,Ansible Playbook,在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

在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')

剧本可以访问角色中定义的变量。 因此,您可以在roles/apache/vars/main.yml中创建一个var“role\u apache:true”,并在条件语句中使用它


如果您在同一剧本中有角色/php和角色/php-fhm,那么该var也可以在角色/php和角色/php-fhm中访问。即使您跳过了其中一个任务。

您是否尝试过在变量中设置处理程序名称,并将其设置为每个主机的适当处理程序?我看到过一个引用,我不确定如何最好地自动执行该操作,同时使任务“基本上”抽象化,而不是在它们之间创建模糊的依赖关系。