
É 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_tasks
deve 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.yml
dentro 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.