diff --git a/lib/ansible/executor/task_executor.py b/lib/ansible/executor/task_executor.py index 08b6d4deb33..845367a4255 100644 --- a/lib/ansible/executor/task_executor.py +++ b/lib/ansible/executor/task_executor.py @@ -100,9 +100,14 @@ class TaskExecutor: for item in item_results: if 'changed' in item and item['changed'] and not res.get('changed'): res['changed'] = True - if 'failed' in item and item['failed'] and not res.get('failed'): - res['failed'] = True - res['msg'] = 'One or more items failed' + if 'failed' in item and item['failed']: + item_ignore = item.pop('_ansible_ignore_errors') + if not res.get('failed'): + res['failed'] = True + res['msg'] = 'One or more items failed' + self._task.ignore_errors = item_ignore + elif self._task.ignore_errors and not item_ignore: + self._task.ignore_errors = item_ignore # ensure to accumulate these for array in ['warnings', 'deprecations']: @@ -295,6 +300,7 @@ class TaskExecutor: (self._task, tmp_task) = (tmp_task, self._task) (self._play_context, tmp_play_context) = (tmp_play_context, self._play_context) res = self._execute(variables=task_vars) + task_fields = self._task.dump_attrs() (self._task, tmp_task) = (tmp_task, self._task) (self._play_context, tmp_play_context) = (tmp_play_context, self._play_context) @@ -302,6 +308,7 @@ class TaskExecutor: # to the list of results res[loop_var] = item res['_ansible_item_result'] = True + res['_ansible_ignore_errors'] = task_fields.get('ignore_errors') if label is not None: templar = Templar(loader=self._loader, shared_loader_obj=self._shared_loader_obj, variables=self._job_vars) @@ -312,7 +319,7 @@ class TaskExecutor: self._host.name, self._task._uuid, res, - task_fields=self._task.dump_attrs(), + task_fields=task_fields, ), block=False, )