'including handlers from different file

The handlers I have are not being run by the playbook or tasks

I have the following directory structur:

<project>
  - playbook.yml
  - <roles>
  -<handler>
     - main.yml
  -<meta>
  -<tasks>
      -main.yml

The problem is the handler is never called.

tasks/main.yml:

  - name: run task1
    command: run_task
    notify: "test me now"


handler/main.yml:

   - name: tested
     register: val1
     listen: "test me now"

The playbook just calls the task/main.yml and has host:all

Do I ned an include/import? I tried in playbook but it didn't help



Solution 1:[1]

The play below works

      tasks:
        - include_tasks: tasks/main.yml
        - meta: flush_handlers
        - debug: var=val1.stdout
      handlers:
        - import_tasks: handlers/main.yml
  • handlers must be imported to be present when the task notifies it.
  • tasks may be included, or imported.

A module is missing in handler/main.yml. This would cause:

ERROR! no action detected in task. This often indicates a misspelled module name, or incorrect module path.

Use some module in handler/main.yml. For example:

    - name: tested
      command: "echo 'running handler'"
      register: val1
      listen: "test me now"

Running such play gives

    val1.stdout: running handler

Simplified example

Running the playbook below

shell> cat playbook.yml 
- hosts: localhost
  tasks:
    - include_tasks: tasks/main.yml
  handlers:
    - import_tasks: handlers/main.yml
shell> cat tasks/main.yml
- command: date
  register: result
  notify: test me now
shell> cat handlers/main.yml
- name: test me now
  debug:
    msg: "{{ result.stdout }} Running handler."

gives

shell> ansible-playbook playbook.yml 

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

TASK [Gathering Facts] ***********************************************************************
ok: [localhost]

TASK [include_tasks] *************************************************************************
included: /export/scratch/tmp8/test-801/tasks/main.yml for localhost

TASK [command] *******************************************************************************
changed: [localhost]

RUNNING HANDLER [test me now] ****************************************************************
ok: [localhost] => 
  msg: Mon 25 Apr 2022 04:59:02 PM CEST Running handler.

PLAY RECAP ***********************************************************************************
localhost                  : ok=4    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Solution 2:[2]

You should have the structure described in https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html thus the directory should be called handlers (and not handler)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 ttavi