From 71a25e0ef7ddce76fc20ed78909616debaddc335 Mon Sep 17 00:00:00 2001 From: s-hertel <19572925+s-hertel@users.noreply.github.com> Date: Mon, 10 Apr 2023 15:56:24 -0400 Subject: [PATCH] Validate task attributes with first finalized attrs after individual loop results ci_complete --- lib/ansible/executor/task_executor.py | 5 +++++ lib/ansible/plugins/strategy/linear.py | 6 +----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/ansible/executor/task_executor.py b/lib/ansible/executor/task_executor.py index 47a56aaec24c2c..a186b2c15f1035 100644 --- a/lib/ansible/executor/task_executor.py +++ b/lib/ansible/executor/task_executor.py @@ -280,6 +280,7 @@ def _run_loop(self, items): no_log = False items_len = len(items) results = [] + post_validate = True for item_index, item in enumerate(items): task_vars['ansible_loop_var'] = loop_var @@ -330,6 +331,9 @@ def _run_loop(self, items): (self._play_context, tmp_play_context) = (tmp_play_context, self._play_context) res = self._execute(variables=task_vars) task_fields = self._task.dump_attrs() + if post_validate: + initial_attrs = task_fields + post_validate = False (self._task, tmp_task) = (tmp_task, self._task) (self._play_context, tmp_play_context) = (tmp_play_context, self._play_context) @@ -391,6 +395,7 @@ def _run_loop(self, items): if var in task_vars and var not in self._job_vars: del task_vars[var] + self._task.from_attrs(initial_attrs) self._task.no_log = no_log return results diff --git a/lib/ansible/plugins/strategy/linear.py b/lib/ansible/plugins/strategy/linear.py index 33a9baabc0a63f..6a76fe57f2b0a1 100644 --- a/lib/ansible/plugins/strategy/linear.py +++ b/lib/ansible/plugins/strategy/linear.py @@ -35,7 +35,6 @@ from ansible.errors import AnsibleError, AnsibleAssertionError, AnsibleParserError from ansible.executor.play_iterator import IteratingStates, FailedStates from ansible.module_utils._text import to_text -from ansible.module_utils.parsing.convert_bool import boolean from ansible.playbook.handler import Handler from ansible.playbook.included_file import IncludedFile from ansible.playbook.task import Task @@ -214,10 +213,7 @@ def run(self, iterator, play_context): skip_rest = True break - if templar.is_template(task.run_once): - setattr(task, 'run_once', boolean(templar.template(task.run_once), strict=True)) - - run_once = task.run_once or action and getattr(action, 'BYPASS_HOST_LOOP', False) + run_once = templar.template(task.run_once) or action and getattr(action, 'BYPASS_HOST_LOOP', False) if (task.any_errors_fatal or run_once) and not task.ignore_errors: any_errors_fatal = True