Manipuladores são executados:
- no final de uma peça (não manual)
- na execução da
meta: flush_handlers
tarefa
Portanto, " para adicionar uma função 6 ao final, que precisa ter os manipuladores da quarta função ", você precisa:
Para o seu caso de uso, sugiro o primeiro método, pois o include_role
módulo ainda é muito recente e existem peculiaridades ao usá-lo (consulte esta pergunta no SO ).
Além disso, observe que os nomes dos manipuladores e as chamadas de escuta são globais; portanto, dois manipuladores em funções separadas estarão em conflito se tiverem o mesmo nome e ambas as funções foram atribuídas em uma única peça. (ref. Manipuladores: Executando operações em mudança )
Os manipuladores [] são referenciados por um nome globalmente exclusivo e são notificados pelos notificadores. [] um manipulador, ele será executado apenas uma vez, depois de todas as tarefas concluídas em uma jogada específica.
Os nomes de manipuladores e os tópicos de escuta ficam em um espaço para nome global.
Prova empírica (execute este shell script para confirmar que os manipuladores são executados no final da peça - houve comentários e respostas contraditórios aqui):
#!/bin/bash
mkdir -p ./sf831880/roles/role1
mkdir -p ./sf831880/roles/role1/handlers
mkdir -p ./sf831880/roles/role1/tasks
mkdir -p ./sf831880/roles/role2
mkdir -p ./sf831880/roles/role2/handlers
mkdir -p ./sf831880/roles/role2/tasks
cat >./sf831880/roles/role1/tasks/main.yml <<TASKS1_END
---
- name: Always true in role1
command: echo role1
notify: handler1
TASKS1_END
cat >./sf831880/roles/role2/tasks/main.yml <<TASKS2_END
---
- name: Always true in role2
command: echo role2
notify: handler2
TASKS2_END
cat >./sf831880/roles/role1/handlers/main.yml <<HANDLERS1_END
---
- name: handler1
debug:
msg: "This is a handler in role1"
HANDLERS1_END
cat >./sf831880/roles/role2/handlers/main.yml <<HANDLERS2_END
---
- name: handler2
debug:
msg: "This is a handler in role2"
HANDLERS2_END
cat >./sf831880/playbook.yml <<PLAYBOOK_END
---
- hosts: localhost
gather_facts: no
connection: local
roles:
- role1
- role2
tasks:
- debug:
msg: "This is a task in a play"
PLAYBOOK_END
ansible-playbook ./sf831880/playbook.yml
Resultado:
PLAY [localhost] ***************************************************************
TASK [role1 : Always true in role1] ********************************************
changed: [localhost]
TASK [role2 : Always true in role2] ********************************************
changed: [localhost]
TASK [debug] *******************************************************************
ok: [localhost] => {
"msg": "This is a task in a play"
}
RUNNING HANDLER [role1 : handler1] *********************************************
ok: [localhost] => {
"msg": "This is a handler in role1"
}
RUNNING HANDLER [role2 : handler2] *********************************************
ok: [localhost] => {
"msg": "This is a handler in role2"
Jogo modificado para conter meta: flush_handlers
:
---
- hosts: localhost
gather_facts: no
connection: local
roles:
- role1
- role2
tasks:
- meta: flush_handlers
- debug:
msg: "This is a task in a play"
O resultado:
PLAY [localhost] ***************************************************************
TASK [role1 : Always true in role1] ********************************************
changed: [localhost]
TASK [role2 : Always true in role2] ********************************************
changed: [localhost]
RUNNING HANDLER [role1 : handler1] *********************************************
ok: [localhost] => {
"msg": "This is a handler in role1"
}
RUNNING HANDLER [role2 : handler2] *********************************************
ok: [localhost] => {
"msg": "This is a handler in role2"
}
TASK [debug] *******************************************************************
ok: [localhost] => {
"msg": "This is a task in a play"