我正在运行Ansible 2.0,我可以运行这个,但是我也可以被欺骗,相信我的经验性testing并不是真实的,而且我也没有find任何文件告诉我处理程序何时应该运行。
如果处理者在任务结束时没有跑,这是我的难题。 我有一个有5个angular色的剧本,我想添加一个angular色到最后需要第四个angular色的处理完成,然后才能开始。
有没有办法运行Ansible依赖于一个处理程序正在完成(即完成一个angular色),然后再做别的事情或者我使用处理程序错误?
处理程序执行:
meta: flush_handlers
任务 因此,“ 需要添加一个angular色到需要有第四个angular色的处理者 ”,你需要:
或者添加一个元任务,并将第六个angular色包含在include_role
模块中 :
roles: - role4 tasks: - meta: flush_handlers - include_role: name: role6
对于你的用例,我build议第一个方法,因为include_role
模块仍然是非常新鲜的,使用它时有怪癖(见SO上的这个问题 )。
此外,请注意,处理者的姓名和监听电话是全球性的,所以如果两名处于不同angular色的处理者具有相同的姓名,并且这两个angular色被分配在一个单独的angular色中,则会发生冲突。 (参考处理程序:在更改时运行操作 )
处理程序[]由全局唯一名称引用,并由通知程序通知。 []一个处理程序,它将只运行一次,在所有的任务完成后在一个特定的游戏。
处理程序名称和侦听主题位于全局名称空间中。
经validation明(运行这个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"
处理程序是任务列表,与常规任务没有任何区别,通过全局唯一的名称引用,并由通知程序通知。 如果没有任何通知处理程序,它将不会运行。 不pipe有多less任务通知一个处理程序,在一个特定的游戏中完成所有的任务之后,它只会运行一次。 不可靠的文件
1)做同样的事情的处理程序应该被命名为相同的。
restart nginx
总是重新启动nginx,而不是handler1
和handler2
2)处理程序在整个“播放”范围内的播放结束时运行。
3)我会使用该register
并且when
应该重新启动的任务functionwhen
,注意这个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
很多方法来完成相同的任务。 处理程序旨在防止多次重新启动相同的进程,例如对具有网站的nginx服务器,SSL证书和其他需要重新启动服务的任务进行多次更改。