So I have this playbook
- 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
And when I run it, as expected, the handler doesn’t run.
# ansible-playbook handler.yml
PLAY [localhost] ***************************************************************
TASK [debug] *******************************************************************
changed: [localhost] => {
"msg": "Notifying handlers"
}
RUNNING HANDLER [me] ***********************************************************
skipping: [localhost]
I can activate the handler by changing the use_handler
variable in the playbook.
# ansible-playbook handler.yml
PLAY [localhost] ***************************************************************
TASK [debug] *******************************************************************
changed: [localhost] => {
"msg": "Notifying handlers"
}
RUNNING HANDLER [me] ***********************************************************
ok: [localhost] => {
"msg": "I have been notified"
}
However, I thought this would also activate the handler … but it doesn’t.
# ansible-playbook -e use_handler=true handler.yml
PLAY [localhost] ***************************************************************
TASK [debug] *******************************************************************
changed: [localhost] => {
"msg": "Notifying handlers"
}
RUNNING HANDLER [me] ***********************************************************
skipping: [localhost]
Am I doing something wrong?
utoddl
(Todd Lewis)
November 14, 2023, 3:31pm
2
The problem is that it’s impractical to pass a bool into a run with key=value
style extra variables on the command line. To set a bool, you’ll need to use JSON. Behold:
[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"
}
See this :
Use the JSON format if you need to pass non-string values such as Booleans, integers, floats, lists, and so on.
2 Likes
Thank you very much.
I will also note that this construct also worked, since it uses a string and not a boolean
when: use_handler == 'true'
utoddl
(Todd Lewis)
November 14, 2023, 7:27pm
4
While that does work, if you plan to use strings, I’d recommend you make them look like strings rather than Booleans. We spent days one time disentangling a rat’s nest of strings, bools, and strings-as-bools. The amazing thing is that it worked as long as we didn’t fix any single obvious error!
Anyway, consider something like
when: handler_state | default('disabled') == 'enabled'
It’s easy to get right on the command line in either key=value
or JSON form, and doesn’t tax your brain to read later.
Cheers.
4 Likes
I want to add (because I learned that the hard way) that you should always transform your “bool” variable with the bool filter in the playbook. If one day you decide to use AWX/AAP, your variable will always be a string even if you thought you send a bool.
So the correct way to write your line:
when: use_handler is true
is:
when: use_handler | bool is true
Or even better (and supported since Ansible 2.10):
when: use_handler is truthy(convert_bool=True)
From the documentation: Tests — Ansible Documentation
4 Likes
chris
(Chris Croome)
November 14, 2023, 9:44pm
6
Is that practically any different from:
when: use_handler | bool
I’ve been using this form, I’ll add is true
if that might make a difference in some circumstances?
utoddl
(Todd Lewis)
November 15, 2023, 6:58am
7
They are not functionally different.
ansible-lint
will berate you mercilessly for the redundant is true
bit.
If you stick with bool
s rather than strings, use Laurent’s suggestion and use the truthy
test.
(In fact, consider marking that post as the solution. It makes the admins happy, and @laurent-indermuehle could use the quatloos.)
1 Like
As one Python poem taught me: Explicit is better than implicit.
1 Like
system
(system)
Closed
July 10, 2024, 12:17pm
9
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.