diff --git a/lib/ansible/executor/task_executor.py b/lib/ansible/executor/task_executor.py index 489bd68a7cf..20320c29b38 100644 --- a/lib/ansible/executor/task_executor.py +++ b/lib/ansible/executor/task_executor.py @@ -26,7 +26,7 @@ import sys import time from ansible import constants as C -from ansible.errors import AnsibleError, AnsibleParserError +from ansible.errors import AnsibleError, AnsibleParserError, AnsibleUndefinedVariable from ansible.playbook.conditional import Conditional from ansible.playbook.task import Task from ansible.plugins import connection_loader, action_loader @@ -154,7 +154,14 @@ class TaskExecutor: if self._task.loop: if self._task.loop in self._shared_loader_obj.lookup_loader: #TODO: remove convert_bare true and deprecate this in with_ - loop_terms = listify_lookup_plugin_terms(terms=self._task.loop_args, templar=templar, loader=self._loader, fail_on_undefined=True, convert_bare=True) + try: + loop_terms = listify_lookup_plugin_terms(terms=self._task.loop_args, templar=templar, loader=self._loader, fail_on_undefined=True, convert_bare=True) + except AnsibleUndefinedVariable as e: + if 'has no attribute' in str(e): + loop_terms = [] + self._display.deprecated("Skipping task due to undefined attribute, in the future this will be a fatal error.") + else: + raise items = self._shared_loader_obj.lookup_loader.get(self._task.loop, loader=self._loader, templar=templar).run(terms=loop_terms, variables=vars_copy) else: raise AnsibleError("Unexpected failure in finding the lookup named '%s' in the available lookup plugins" % self._task.loop) diff --git a/lib/ansible/template/__init__.py b/lib/ansible/template/__init__.py index cee617b06e4..c309e113adc 100644 --- a/lib/ansible/template/__init__.py +++ b/lib/ansible/template/__init__.py @@ -256,8 +256,8 @@ class Templar: # safely catch run failures per #5059 try: ran = instance.run(loop_terms, variables=self._available_variables, **kwargs) - except (AnsibleUndefinedVariable, UndefinedError): - raise + except (AnsibleUndefinedVariable, UndefinedError) as e: + raise AnsibleUndefinedVariable(e) except Exception, e: if self._fail_on_lookup_errors: raise @@ -337,7 +337,7 @@ class Templar: return res except (UndefinedError, AnsibleUndefinedVariable), e: if fail_on_undefined: - raise + raise AnsibleUndefinedVariable(e) else: #TODO: return warning about undefined var return data