
¿Es posible tener controladores verdaderamente globales en Ansible para que pueda "notificar" al controlador de cualquier tarea de cualquier rol de cualquier libro de jugadas? Y sin importar explícitamente.
Solo quiero definir un controlador una vez (digamos "reiniciar httpd") y tenerlo disponible para cualquier directiva de "notificación" en cualquier lugar.
¡Gracias!
Respuesta1
Podrías definir a tus manejadores dentro de tu juego en lugar de dentro de sus roles. Los controladores definidos en una jugada estarían disponibles para todas las tareas/roles de esa jugada.
También puede utilizar la importación si lo desea en la sección de controladores.
---
- hosts: all
handlers:
- import_tasks: global_handlers.yml
tasks:
- shell: echo "Hello World"
notify: some thing from global_handlers
Tenga en cuenta que necesita una 'inclusión estática' (por https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html#handlers-running-operatives-on-change), por lo que import_tasks
debe usarse en lugar de include_tasks
:
No puede notificar a un controlador que esté definido dentro de una inclusión. A partir de Ansible 2.1, esto funciona, sin embargo, la inclusión debe ser estática.
Respuesta2
Hay al menos dos formas de lograrlo; y no me queda claro cuál es la mejor práctica.
Solución 1
Unopráctica recomendadaes crear un archivo solo para controladores e incluirlo o importarlo en su libro de jugadas (ver las diferencias); De esa manera, todos los roles pueden beneficiarse.
Por ejemplo, digamos que tiene un archivo myhandlers.yml
con un controlador interno para reiniciar Apache y otro para recargar mysqld.
Luego, en tu libro de jugadas:
- 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
Solución 2
Otro enfoque limpioes crear un rol dedicado ( roles/myhandlers/
por ejemplo) y hacer que este rol dependa de todos los demás roles.
dependencies:
- myhandlers
Más información sobre dependenciasaquí.