Controladores globales en Ansible

Controladores globales en Ansible

¿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_tasksdebe 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.ymlcon 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í.

información relacionada