diff --git a/changelogs/fragments/48936-import-handlers.yaml b/changelogs/fragments/48936-import-handlers.yaml new file mode 100644 index 00000000000..1f206b955cd --- /dev/null +++ b/changelogs/fragments/48936-import-handlers.yaml @@ -0,0 +1,4 @@ +bugfixes: +- imports - Prevent the name of an import from being addressable as a handler, only the tasks within should + be addressable. Use an include instead of an import if you need to execute many tasks from a single handler + (https://github.com/ansible/ansible/issues/48936) diff --git a/lib/ansible/plugins/strategy/__init__.py b/lib/ansible/plugins/strategy/__init__.py index 41b74edabde..ceb0f8eaa97 100644 --- a/lib/ansible/plugins/strategy/__init__.py +++ b/lib/ansible/plugins/strategy/__init__.py @@ -402,7 +402,7 @@ class StrategyBase: def parent_handler_match(target_handler, handler_name): if target_handler: - if isinstance(target_handler, (TaskInclude, IncludeRole)): + if isinstance(target_handler, (TaskInclude, IncludeRole)) and not getattr(target_handler, 'statically_loaded', True): try: handler_vars = self._variable_manager.get_vars(play=iterator._play, task=target_handler) templar = Templar(loader=self._loader, variables=handler_vars) diff --git a/test/integration/targets/include_import/handler_addressing/playbook.yml b/test/integration/targets/include_import/handler_addressing/playbook.yml new file mode 100644 index 00000000000..7515dc99d30 --- /dev/null +++ b/test/integration/targets/include_import/handler_addressing/playbook.yml @@ -0,0 +1,11 @@ +- hosts: localhost + gather_facts: false + tasks: + - import_role: + name: include_handler_test + +- hosts: localhost + gather_facts: false + tasks: + - import_role: + name: import_handler_test diff --git a/test/integration/targets/include_import/handler_addressing/roles/import_handler_test/handlers/main.yml b/test/integration/targets/include_import/handler_addressing/roles/import_handler_test/handlers/main.yml new file mode 100644 index 00000000000..95524ed464e --- /dev/null +++ b/test/integration/targets/include_import/handler_addressing/roles/import_handler_test/handlers/main.yml @@ -0,0 +1,2 @@ +- name: do_import + import_tasks: tasks/handlers.yml diff --git a/test/integration/targets/include_import/handler_addressing/roles/import_handler_test/tasks/handlers.yml b/test/integration/targets/include_import/handler_addressing/roles/import_handler_test/tasks/handlers.yml new file mode 100644 index 00000000000..eeb49ff632e --- /dev/null +++ b/test/integration/targets/include_import/handler_addressing/roles/import_handler_test/tasks/handlers.yml @@ -0,0 +1,2 @@ +- debug: + msg: import handler task diff --git a/test/integration/targets/include_import/handler_addressing/roles/import_handler_test/tasks/main.yml b/test/integration/targets/include_import/handler_addressing/roles/import_handler_test/tasks/main.yml new file mode 100644 index 00000000000..b0312cc20d1 --- /dev/null +++ b/test/integration/targets/include_import/handler_addressing/roles/import_handler_test/tasks/main.yml @@ -0,0 +1,3 @@ +- command: "true" + notify: + - do_import diff --git a/test/integration/targets/include_import/handler_addressing/roles/include_handler_test/handlers/main.yml b/test/integration/targets/include_import/handler_addressing/roles/include_handler_test/handlers/main.yml new file mode 100644 index 00000000000..7f24b9d5895 --- /dev/null +++ b/test/integration/targets/include_import/handler_addressing/roles/include_handler_test/handlers/main.yml @@ -0,0 +1,2 @@ +- name: do_include + include_tasks: tasks/handlers.yml diff --git a/test/integration/targets/include_import/handler_addressing/roles/include_handler_test/tasks/handlers.yml b/test/integration/targets/include_import/handler_addressing/roles/include_handler_test/tasks/handlers.yml new file mode 100644 index 00000000000..2bf07f23e38 --- /dev/null +++ b/test/integration/targets/include_import/handler_addressing/roles/include_handler_test/tasks/handlers.yml @@ -0,0 +1,2 @@ +- debug: + msg: include handler task diff --git a/test/integration/targets/include_import/handler_addressing/roles/include_handler_test/tasks/main.yml b/test/integration/targets/include_import/handler_addressing/roles/include_handler_test/tasks/main.yml new file mode 100644 index 00000000000..c29a787c02c --- /dev/null +++ b/test/integration/targets/include_import/handler_addressing/roles/include_handler_test/tasks/main.yml @@ -0,0 +1,3 @@ +- command: "true" + notify: + - do_include diff --git a/test/integration/targets/include_import/runme.sh b/test/integration/targets/include_import/runme.sh index e3497119ee9..4fc2d9a538c 100755 --- a/test/integration/targets/include_import/runme.sh +++ b/test/integration/targets/include_import/runme.sh @@ -86,3 +86,7 @@ ansible-playbook public_exposure/no_overwrite_roles.yml -i ../../inventory "$@" # https://github.com/ansible/ansible/pull/48068 ansible-playbook run_once/playbook.yml "$@" + +# https://github.com/ansible/ansible/issues/48936 +ansible-playbook -v handler_addressing/playbook.yml 2>&1 | tee test_handler_addressing.out +test "$(egrep -c 'include handler task|ERROR! The requested handler '"'"'do_import'"'"' was not found' test_handler_addressing.out)" = 2