Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you notify a handler in Ansible based solely on a conditional?

I would like to notify a handler in my role by doing something like this:

- name: Notify handler
  notify: my_handler
  when: this_thing_is_true|bool

But Ansible just whines:

ERROR! no module/action detected in task.

I have tried various wedges, such as:

- name: Notify handler
  meta: noop
  notify: my_handler
  when: this_thing_is_true|bool

But that similarly whines:

[WARNING]: noop task does not support when conditional

Any suggestions?

like image 956
fbicknel Avatar asked Mar 02 '23 09:03

fbicknel


2 Answers

@β.εηοιτ.βε shows a solution that prefers debug, but I think that the output from assert is cleaner.

debug code:

- name: with debug
  debug: msg=''
  changed_when: true
  when: something is changed
  notify: 'do stuff'

assert code:

- name: with assert
  assert: { that: true, quiet: true }
  changed_when: true
  when: something is changed
  notify: 'do stuff'

debug output:

TASK [mytask : with debug] *****************************************************
changed: [server] => {
    "msg": ""
}

RUNNING HANDLER [mytask : do stuff] ********************************************
changed: [server]

assert output (seems cleaner):

TASK [mytask : with assert] ****************************************************
changed: [server]

RUNNING HANDLER [myhandlers : do stuff] ****************************************
changed: [server]
like image 170
lonix Avatar answered Apr 27 '23 21:04

lonix


Please mind that running a task is not enough for an handler to be notified, you also need a task that creates a changed result.

You can achieve a change result on any task with the help of the changed_when option in Ansible.
Then, doing a simple debug could be an option.

The other ideas I had, but that did not really made sense in the end:

  • pause: but you cannot pause for less than a second
  • assert: but it feels silly to assert the same condition that you also need to put in the changed_that to notify the handler. You can still assert: that: true but it feels equally silly.
  • Maybe the most silliest of the ideas I could came with was a fail task with a failed_when: false.
  • command: 'true' is maybe less silly, compared to the above, but I am not totally convinced, still

Given the playbook:

- 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'

Gives the recap:

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   
like image 35
β.εηοιτ.βε Avatar answered Apr 27 '23 21:04

β.εηοιτ.βε