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

问题描述 投票:1回答:2

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代码? 提前致谢

ansible ansible-playbook
2个回答
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')

0
投票

Playbook可以访问角色中定义的变量。因此,您可以在roles / apache / vars / main.yml中创建var“role_apache:true”,并在条件中使用它。

如果你有相同的剧本中的那些,那么var也可以在roles / php和roles / php-fhm中访问。即使你跳过了其中一个。

© www.soinside.com 2019 - 2024. All rights reserved.