
Возможно ли иметь действительно глобальные обработчики в Ansible, чтобы я мог «уведомить» обработчик из любой задачи любой роли любого плейбука? И без явного импорта.
Я просто хочу определить обработчик один раз (например, «перезапустить httpd») и сделать его доступным для любой директивы «notify» в любом месте.
Спасибо!
решение1
Вы можете определить обработчики в вашей игре, а не в ролях. Обработчики, определенные в игре, будут доступны для всех задач/ролей в этой игре.
При желании вы также можете использовать импорт в разделе обработчиков.
---
- hosts: all
handlers:
- import_tasks: global_handlers.yml
tasks:
- shell: echo "Hello World"
notify: some thing from global_handlers
Обратите внимание, что вам необходимо «статическое включение» (согласно https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html#handlers-running-operations-on-change), поэтому его import_tasks
следует использовать вместо include_tasks
:
Вы не можете уведомить обработчик, который определен внутри include. Начиная с Ansible 2.1, это работает, однако include должен быть статическим.
решение2
Есть как минимум два способа добиться этого, и мне не ясно, какой из них лучше.
Решение 1
Одинрекомендуемая практикасоздать файл только для обработчиков и включить или импортировать его в свой плейбук (увидеть различия); таким образом, все роли могут получить выгоду.
Например, предположим, что у вас есть файл, myhandlers.yml
содержащий один обработчик для перезапуска Apache и другой для перезагрузки mysqld.
Затем, в вашей книге действий:
- name: Testing 123
hosts: localhost
handlers:
- name: Here are my custom common handlers
# You can also look at include_tasks: handlers.yml
import_tasks: handlers.yml
tasks:
- command: "true"
notify: restart-apache
- command: "true"
notify: restart-mysql
Решение 2
Еще один чистый подходсоздать специальную роль ( roles/myhandlers/
например) и сделать эту роль зависимой для всех остальных ролей.
dependencies:
- myhandlers
Дополнительная информация о зависимостяхздесь.