From f92490283071f437a53ea330b1bdbdf92a8c75ff Mon Sep 17 00:00:00 2001 From: Sloane Hertel <19572925+s-hertel@users.noreply.github.com> Date: Mon, 15 Dec 2025 11:33:18 -0500 Subject: [PATCH] adhoc, ansible-console - fix traceback for meta end_play tasks (#86294) Ensure all entrypoints using TaskQueueManager catch AnsibleEndPlay --- changelogs/fragments/fix-adhoc-meta-end_play.yml | 3 +++ lib/ansible/cli/adhoc.py | 4 +++- lib/ansible/cli/console.py | 4 +++- .../integration/targets/adhoc/roles/end_play/tasks/main.yml | 1 + test/integration/targets/adhoc/runme.sh | 2 ++ .../targets/ansible-console/roles/end_play/tasks/main.yml | 1 + test/integration/targets/ansible-console/runme.sh | 6 ++++++ 7 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 changelogs/fragments/fix-adhoc-meta-end_play.yml create mode 100644 test/integration/targets/adhoc/roles/end_play/tasks/main.yml create mode 100644 test/integration/targets/ansible-console/roles/end_play/tasks/main.yml diff --git a/changelogs/fragments/fix-adhoc-meta-end_play.yml b/changelogs/fragments/fix-adhoc-meta-end_play.yml new file mode 100644 index 00000000000..d020693a21a --- /dev/null +++ b/changelogs/fragments/fix-adhoc-meta-end_play.yml @@ -0,0 +1,3 @@ +bugfixes: +- >- + ``ansible``, ``ansible-console`` - fix executing ``- meta: end_play`` tasks. diff --git a/lib/ansible/cli/adhoc.py b/lib/ansible/cli/adhoc.py index acbd0d4c9cf..5607340e9bd 100755 --- a/lib/ansible/cli/adhoc.py +++ b/lib/ansible/cli/adhoc.py @@ -14,7 +14,7 @@ from ansible import constants as C from ansible import context from ansible.cli.arguments import option_helpers as opt_help from ansible.errors import AnsibleError, AnsibleOptionsError, AnsibleParserError -from ansible.executor.task_queue_manager import TaskQueueManager +from ansible.executor.task_queue_manager import AnsibleEndPlay, TaskQueueManager from ansible.module_utils.common.text.converters import to_text from ansible.parsing.splitter import parse_kv from ansible.playbook import Playbook @@ -198,6 +198,8 @@ class AdHocCLI(CLI): result = self._tqm.run(play) self._tqm.send_callback('v2_playbook_on_stats', self._tqm._stats) + except AnsibleEndPlay as e: + result = e.result finally: if self._tqm: self._tqm.cleanup() diff --git a/lib/ansible/cli/console.py b/lib/ansible/cli/console.py index 5a6f941664f..bb69a16dfc8 100755 --- a/lib/ansible/cli/console.py +++ b/lib/ansible/cli/console.py @@ -20,7 +20,7 @@ import sys from ansible import constants as C from ansible import context from ansible.cli.arguments import option_helpers as opt_help -from ansible.executor.task_queue_manager import TaskQueueManager +from ansible.executor.task_queue_manager import AnsibleEndPlay, TaskQueueManager from ansible.module_utils.common.text.converters import to_native, to_text from ansible.module_utils.parsing.convert_bool import boolean from ansible.parsing.splitter import parse_kv @@ -230,6 +230,8 @@ class ConsoleCLI(CLI, cmd.Cmd): result = self._tqm.run(play) display.debug(result) + except AnsibleEndPlay as e: + result = e.result finally: if self._tqm: self._tqm.cleanup() diff --git a/test/integration/targets/adhoc/roles/end_play/tasks/main.yml b/test/integration/targets/adhoc/roles/end_play/tasks/main.yml new file mode 100644 index 00000000000..6501db2134c --- /dev/null +++ b/test/integration/targets/adhoc/roles/end_play/tasks/main.yml @@ -0,0 +1 @@ +- meta: end_play diff --git a/test/integration/targets/adhoc/runme.sh b/test/integration/targets/adhoc/runme.sh index 9f15e8cdb35..0235b6ca3ff 100755 --- a/test/integration/targets/adhoc/runme.sh +++ b/test/integration/targets/adhoc/runme.sh @@ -26,3 +26,5 @@ ansible localhost -m setup > /dev/null ansible localhost -m assert -a '{"that": "ansible_facts.distribution is defined"}' # test flushing the fact cache ansible --flush-cache localhost -m debug -a "msg={{ ansible_facts }}" | grep '"msg": {}' +# test meta end_play +ansible localhost -m include_role -a name=end_play diff --git a/test/integration/targets/ansible-console/roles/end_play/tasks/main.yml b/test/integration/targets/ansible-console/roles/end_play/tasks/main.yml new file mode 100644 index 00000000000..6501db2134c --- /dev/null +++ b/test/integration/targets/ansible-console/roles/end_play/tasks/main.yml @@ -0,0 +1 @@ +- meta: end_play diff --git a/test/integration/targets/ansible-console/runme.sh b/test/integration/targets/ansible-console/runme.sh index 15476058817..13d2517c5a2 100755 --- a/test/integration/targets/ansible-console/runme.sh +++ b/test/integration/targets/ansible-console/runme.sh @@ -8,3 +8,9 @@ set -eux unset ANSIBLE_HOST_PATTERN_MISMATCH echo debug var=inventory_hostname | ansible-console '{{"localhost"}}' + +echo include_role name=end_play | ansible-console localhost 2>&1 | tee err.txt +if grep -q "ERROR" err.txt; then + echo "Failed to execute end_play" + exit 1 +fi