我正在运行 Ansible 2.0,我可以运行它,但我也可能被欺骗相信我的经验测试不正确的东西,而且我找不到任何文档来告诉我何时应该运行处理程序。
如果处理程序在任务结束时没有运行,这就是我的难题。我有一个包含 5 个角色的剧本,我想在最后添加一个 6 个角色,需要在它开始之前完成第 4 个角色的处理程序。
在做其他事情之前,有没有办法运行 Ansible 来依赖处理程序的完成(即角色完全完成),或者我使用的处理程序是否错误?
tec*_*raf 19
处理程序被执行:
meta: flush_handlers
任务时因此,“要在需要具有第 4 个角色的处理程序的末尾添加 6 个角色”,您需要:
或者添加一个元任务并在include_role
模块中包含第 6 个角色:
roles:
- role4
tasks:
- meta: flush_handlers
- include_role:
name: role6
Run Code Online (Sandbox Code Playgroud)对于您的用例,我建议使用第一种方法,因为该include_role
模块仍然非常新鲜,并且在使用时有一些怪癖(请参阅SO 上的这个问题)。
此外,请注意处理程序的名称和侦听调用是全局的,因此如果两个不同角色的处理程序具有相同的名称并且在单个播放中分配两个角色,则会发生冲突。(ref. Handlers: Running Operations On Change )
处理程序 [ ] 由全局唯一名称引用,并由通知程序通知。[ ] 一个处理程序,它只会运行一次,在特定游戏中的所有任务完成后。
处理程序名称和侦听主题位于全局命名空间中。
经验证明(运行此 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
Run Code Online (Sandbox Code Playgroud)
结果:
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"
Run Code Online (Sandbox Code Playgroud)播放修改为包含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"
Run Code Online (Sandbox Code Playgroud)
结果:
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"
Run Code Online (Sandbox Code Playgroud) 归档时间: |
|
查看次数: |
16597 次 |
最近记录: |