具有 when 条件的 ansible 处理程序

具有 when 条件的 ansible 处理程序

所以我有这个剧本

- hosts: localhost
  gather_facts: no
  vars:
    this_thing_is_true: true
    use_handler: false

  tasks:
    - debug:
        msg: 'Notifying handlers'
      changed_when: this_thing_is_true
      notify:
        - me

  handlers:
    - name: me
      debug:
        msg: 'I have been notified'
      when: use_handler is true

当我运行它时,正如预期的那样,处理程序没有运行。

# ansible-playbook handler.yml

PLAY [localhost] ***************************************************************

TASK [debug] *******************************************************************
changed: [localhost] => {
    "msg": "Notifying handlers"
}

RUNNING HANDLER [me] ***********************************************************
skipping: [localhost]

use_handler我可以通过改变剧本中的变量来激活处理程序。

 # ansible-playbook handler.yml  
PLAY [localhost] ***************************************************************

TASK [debug] *******************************************************************
changed: [localhost] => {
    "msg": "Notifying handlers"
}

RUNNING HANDLER [me] ***********************************************************
ok: [localhost] => {
    "msg": "I have been notified"
}

但是,我认为这也会激活处理程序...但是没有。

# ansible-playbook -e use_handler=true handler.yml


PLAY [localhost] ***************************************************************

TASK [debug] *******************************************************************
changed: [localhost] => {
    "msg": "Notifying handlers"
}

RUNNING HANDLER [me] ***********************************************************
skipping: [localhost]

难道我做错了什么?

答案1

更改条件

      when: use_handler|bool
  • 变量的类型use_handler细绳当以选项的 INI 格式声明时

--extra-vars use_handler=true

如果你想的话可以测试一下

  - debug:
      var: use_handler|type_debug
  • 您不必明确地将其测试为is true。可以在测试中使用普通布尔变量。

答案2

我从另一个论坛得到了答案

问题是,在命令行上使用 key=value 样式的额外变量将布尔值传递到运行中是不切实际的。要设置布尔值,您需要使用 JSON。请注意:

[utoddl@tango ansible]$ ansible localhost -e use_handler=true -m debug -a '{"msg": "{{ use_handler | type_debug }}"}'
localhost | SUCCESS => {
    "msg": "str"
}
[utoddl@tango ansible]$ ansible localhost -e '{"use_handler": true}' -m debug -a '{"msg": "{{ use_handler | type_debug }}"}'
localhost | SUCCESS => {
    "msg": "bool"
}

另一个选择是将处理程序中的布尔检查替换为字符串检查

when: use_handler == 'true'

相关内容