diff --git a/changelogs/fragments/47307-handler-include-task.yml b/changelogs/fragments/47307-handler-include-task.yml new file mode 100644 index 0000000000..0b47a2129d --- /dev/null +++ b/changelogs/fragments/47307-handler-include-task.yml @@ -0,0 +1,2 @@ +bugfixes: + - "handlers - fix crash when handler task include tasks" diff --git a/lib/ansible/plugins/strategy/__init__.py b/lib/ansible/plugins/strategy/__init__.py index 0d8e3bf2c0..6418ec38a8 100644 --- a/lib/ansible/plugins/strategy/__init__.py +++ b/lib/ansible/plugins/strategy/__init__.py @@ -952,9 +952,12 @@ class StrategyBase: iterator._play.handlers.append(block) iterator.cache_block_tasks(block) for task in block.block: + task_name = task.get_name() + display.debug("adding task '%s' included in handler '%s'" % (task_name, handler_name)) + self._notified_handlers[task._uuid] = included_file._hosts[:] result = self._do_handler_run( handler=task, - handler_name=task.get_name(), + handler_name=task_name, iterator=iterator, play_context=play_context, notified_hosts=included_file._hosts[:], diff --git a/test/integration/targets/handlers/runme.sh b/test/integration/targets/handlers/runme.sh index fdeb868275..df544052a5 100755 --- a/test/integration/targets/handlers/runme.sh +++ b/test/integration/targets/handlers/runme.sh @@ -63,3 +63,6 @@ set +e result="$(ansible-playbook test_handlers_any_errors_fatal.yml -e output_dir=$output_dir -i inventory.handlers -v "$@" 2>&1)" set -e [ ! -f $output_dir/should_not_exist_B ] || (rm -f $output_dir/should_not_exist_B && exit 1) + +# https://github.com/ansible/ansible/issues/47287 +[ "$(ansible-playbook test_handlers_including_task.yml -i ../../inventory -v "$@" | egrep -o 'failed=[0-9]+')" = "failed=0" ] diff --git a/test/integration/targets/handlers/test_handlers_including_task.yml b/test/integration/targets/handlers/test_handlers_including_task.yml new file mode 100644 index 0000000000..8f7933ab05 --- /dev/null +++ b/test/integration/targets/handlers/test_handlers_including_task.yml @@ -0,0 +1,16 @@ +--- +- name: Verify handler can include other tasks (#47287) + hosts: testhost + tasks: + - name: include a task from the tasks section + include_tasks: handlers.yml + + - name: notify a handler + debug: + msg: notifying handler + changed_when: yes + notify: include a task from the handlers section + + handlers: + - name: include a task from the handlers section + include_tasks: handlers.yml