您如何仅根据条件通知 Ansible 中的处理程序?
How do you notify a handler in Ansible based solely on a conditional?
我想通过执行以下操作来通知担任我角色的处理程序:
- name: Notify handler
notify: my_handler
when: this_thing_is_true|bool
但 Ansible 只是抱怨:
ERROR! no module/action detected in task.
我尝试过各种楔子,例如:
- name: Notify handler
meta: noop
notify: my_handler
when: this_thing_is_true|bool
但这同样是抱怨:
[WARNING]: noop task does not support when conditional
Any suggestions?
请注意 运行 一个任务不足以通知处理程序,您还需要一个创建更改结果的任务。
借助 Ansible 中的 changed_when
选项,您可以在任何任务上实现更改结果。
然后,做一个简单的 debug
可能是一种选择。
我有其他的想法,但最终没有真正意义:
pause
: 但是你不能停顿不到一秒
assert
:但是断言您还需要放入 changed_that
以通知处理程序的相同条件感觉很愚蠢。你仍然可以 assert: that: true
但感觉同样愚蠢。
- 也许我能想到的最愚蠢的想法是
fail
任务 failed_when: false
。
与上面的相比,command: 'true'
可能不那么傻,但我并不完全相信,仍然
鉴于剧本:
- hosts: local
gather_facts: no
vars:
this_thing_is_true: true
tasks:
- debug:
msg: 'Notifying handlers'
# var: this_thing_is_true
# ^-- might be an alternative option to msg:
changed_when: this_thing_is_true
notify:
- me
handlers:
- name: me
debug:
msg: 'I have been notified'
回顾一下:
PLAY [local] *******************************************************************
TASK [debug] *******************************************************************
changed: [local] => {
"msg": "Notifying handlers"
}
RUNNING HANDLER [me] ***********************************************************
ok: [local] => {
"msg": "I have been notified"
}
PLAY RECAP *********************************************************************
local : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
@β.εηοιτ.βε 显示了一个更喜欢 debug
的解决方案,但我认为 assert
的输出更清晰。
debug
代码:
- name: with debug
debug: msg=''
changed_when: true
when: something is changed
notify: 'do stuff'
assert
代码:
- name: with assert
assert: { that: true, quiet: true }
changed_when: true
when: something is changed
notify: 'do stuff'
debug
输出:
TASK [mytask : with debug] *****************************************************
changed: [server] => {
"msg": ""
}
RUNNING HANDLER [mytask : do stuff] ********************************************
changed: [server]
assert
输出(看起来更干净):
TASK [mytask : with assert] ****************************************************
changed: [server]
RUNNING HANDLER [myhandlers : do stuff] ****************************************
changed: [server]
我想通过执行以下操作来通知担任我角色的处理程序:
- name: Notify handler
notify: my_handler
when: this_thing_is_true|bool
但 Ansible 只是抱怨:
ERROR! no module/action detected in task.
我尝试过各种楔子,例如:
- name: Notify handler
meta: noop
notify: my_handler
when: this_thing_is_true|bool
但这同样是抱怨:
[WARNING]: noop task does not support when conditional Any suggestions?
请注意 运行 一个任务不足以通知处理程序,您还需要一个创建更改结果的任务。
借助 Ansible 中的 changed_when
选项,您可以在任何任务上实现更改结果。
然后,做一个简单的 debug
可能是一种选择。
我有其他的想法,但最终没有真正意义:
pause
: 但是你不能停顿不到一秒assert
:但是断言您还需要放入changed_that
以通知处理程序的相同条件感觉很愚蠢。你仍然可以assert: that: true
但感觉同样愚蠢。- 也许我能想到的最愚蠢的想法是
fail
任务failed_when: false
。
与上面的相比, command: 'true'
可能不那么傻,但我并不完全相信,仍然
鉴于剧本:
- hosts: local
gather_facts: no
vars:
this_thing_is_true: true
tasks:
- debug:
msg: 'Notifying handlers'
# var: this_thing_is_true
# ^-- might be an alternative option to msg:
changed_when: this_thing_is_true
notify:
- me
handlers:
- name: me
debug:
msg: 'I have been notified'
回顾一下:
PLAY [local] *******************************************************************
TASK [debug] *******************************************************************
changed: [local] => {
"msg": "Notifying handlers"
}
RUNNING HANDLER [me] ***********************************************************
ok: [local] => {
"msg": "I have been notified"
}
PLAY RECAP *********************************************************************
local : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
@β.εηοιτ.βε 显示了一个更喜欢 debug
的解决方案,但我认为 assert
的输出更清晰。
debug
代码:
- name: with debug
debug: msg=''
changed_when: true
when: something is changed
notify: 'do stuff'
assert
代码:
- name: with assert
assert: { that: true, quiet: true }
changed_when: true
when: something is changed
notify: 'do stuff'
debug
输出:
TASK [mytask : with debug] ***************************************************** changed: [server] => { "msg": "" } RUNNING HANDLER [mytask : do stuff] ******************************************** changed: [server]
assert
输出(看起来更干净):
TASK [mytask : with assert] **************************************************** changed: [server] RUNNING HANDLER [myhandlers : do stuff] **************************************** changed: [server]