Answers:
处理程序执行:
meta: flush_handlers
任务时因此,“ 需要在第6角色的末尾添加第4角色的处理程序 ”,您需要:
或添加一个meta任务,并在include_role
模块中包含第6个角色:
roles:
- role4
tasks:
- meta: flush_handlers
- include_role:
name: role6
对于您的用例,我建议第一种方法,因为该include_role
模块仍然非常新鲜,并且在使用它时会出现一些古怪的现象(请参阅SO上的此问题)。
此外,请注意,处理程序的名称和侦听调用是全局的,因此,如果两个角色在单独的角色中具有相同的名称,并且两个角色均在一次播放中分配,则它们将发生冲突。(请参阅处理程序:更改时运行操作)
处理程序[]由全局唯一名称引用,并由通知程序通知。[]处理程序,在特定播放中完成所有任务后,它将仅运行一次。
处理程序名称和侦听主题位于全局命名空间中。
经验证明(运行此shell脚本以确认处理程序在播放结束时执行-此处存在矛盾的注释和答案):
#!/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
结果:
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"
播放已修改为包含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"
结果:
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"
处理程序是任务列表,实际上与常规任务没有什么不同,它们由全局唯一名称引用,并由通知者通知。如果没有任何通知处理程序,它将不会运行。无论有多少任务通知处理程序,在特定播放中完成所有任务后,该处理程序将仅运行一次。Ansible文档
1)执行相同操作的处理程序应命名为相同。
restart nginx
始终重新启动nginx的,不handler1
和handler2
2)处理程序在整个“播放”的结尾处运行,该播放以您的小节为范围。
3)对于应该重新启动的任务,我将使用register
和when
函数,请注意此var应该随身携带。
PLAY [localhost] ***************************************************************
TASK [debug] *******************************************************************
ok: [localhost] => {
"msg": "Play 1"
}
TASK [role1 : Always true in role1] ********************************************
changed: [localhost]
TASK [role1 : Always true in role1] ********************************************
changed: [localhost]
TASK [role1 : Always true in role1] ********************************************
changed: [localhost]
TASK [role1 : Always true in role1] ********************************************
changed: [localhost]
TASK [role1 : Always true in role1] ********************************************
changed: [localhost]
TASK [role2 : Run if change in task c of role 1] *******************************
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 : handler] **********************************************
ok: [localhost] => {
"msg": "This is a handler in role1"
}
PLAY [localhost] ***************************************************************
TASK [debug] *******************************************************************
ok: [localhost] => {
"msg": "Play 2"
}
TASK [role1 : Always true in role1] ********************************************
changed: [localhost]
TASK [role1 : Always true in role1] ********************************************
changed: [localhost]
TASK [role1 : Always true in role1] ********************************************
changed: [localhost]
TASK [role1 : Always true in role1] ********************************************
changed: [localhost]
TASK [role1 : Always true in role1] ********************************************
changed: [localhost]
TASK [role2 : Run if change in task c of role 1] *******************************
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 : handler] **********************************************
ok: [localhost] => {
"msg": "This is a handler in role1"
}
PLAY RECAP *********************************************************************
localhost : ok=20 changed=14 unreachable=0 failed=0
完成相同任务的方法很多。处理程序旨在防止多次重新启动同一进程,例如对具有网站,ssl证书和需要重新启动服务的其他任务的nginx服务器进行多次更改。