您如何仅根据条件通知 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]