Manipuladores globais em Ansible

Manipuladores globais em Ansible

É possível ter manipuladores verdadeiramente globais no Ansible para que eu possa "notificar" o manipulador de qualquer tarefa sobre qualquer função de qualquer manual? E sem importar explicitamente.

Eu só quero definir um manipulador uma vez (digamos "reiniciar httpd") e disponibilizá-lo para qualquer diretiva "notificar" em qualquer lugar.

Obrigado!

Responder1

Você poderia definir seus manipuladores dentro da sua peça, em vez de dentro dos papéis. Os manipuladores definidos em uma peça estariam disponíveis para todas as tarefas/funções dessa peça.

Você também pode usar import se quiser na seção de manipuladores.

---
- hosts: all
  handlers:
  - import_tasks: global_handlers.yml
  tasks:
  - shell: echo "Hello World"
    notify: some thing from global_handlers

Observe que você precisa de uma 'inclusão estática' (por https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html#handlers-running-operations-on-change), então import_tasksdeve ser usado em vez de include_tasks:

Você não pode notificar um manipulador definido dentro de uma inclusão. A partir do Ansible 2.1, isso funciona, porém a inclusão deve ser estática.

Responder2

Existem pelo menos duas maneiras de conseguir isso; e não está claro para mim qual é a melhor prática.

Solução 1

Umprática recomendadaé criar um arquivo apenas para manipuladores e incluí-lo ou importá-lo em seu manual (veja as diferenças); dessa forma, todas as funções podem se beneficiar.

Por exemplo, digamos que você tenha um arquivo myhandlers.ymldentro de um manipulador para reiniciar o Apache e outro para recarregar o mysqld.

Então, em seu manual:

- 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

Solução 2

Outra abordagem limpaé criar uma função dedicada ( roles/myhandlers/por exemplo) e tornar essa função uma dependência para todas as outras funções.

dependencies:
  - myhandlers

Mais informações sobre dependênciasaqui.

informação relacionada