所以我有这个剧本
- 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'