diff --git a/lib/ansible/executor/task_executor.py b/lib/ansible/executor/task_executor.py index 2fa7901fe73..f83f901e900 100644 --- a/lib/ansible/executor/task_executor.py +++ b/lib/ansible/executor/task_executor.py @@ -143,7 +143,7 @@ class TaskExecutor: items = None if self._task.loop and self._task.loop in lookup_loader: - loop_terms = listify_lookup_plugin_terms(terms=self._task.loop_args, variables=self._job_vars, loader=self._loader) + loop_terms = listify_lookup_plugin_terms(terms=self._task.loop_args, variables=self._job_vars, loader=self._loader, fail_on_undefined=True) items = lookup_loader.get(self._task.loop, loader=self._loader).run(terms=loop_terms, variables=self._job_vars) return items diff --git a/lib/ansible/plugins/lookup/nested.py b/lib/ansible/plugins/lookup/nested.py index 52f4bed1d52..b4b4e5d9714 100644 --- a/lib/ansible/plugins/lookup/nested.py +++ b/lib/ansible/plugins/lookup/nested.py @@ -17,22 +17,29 @@ from __future__ import (absolute_import, division, print_function) __metaclass__ = type -from ansible.errors import AnsibleError +from jinja2.exceptions import UndefinedError + +from ansible.errors import AnsibleError, AnsibleUndefinedVariable from ansible.plugins.lookup import LookupBase from ansible.utils.listify import listify_lookup_plugin_terms class LookupModule(LookupBase): - def __lookup_variabless(self, terms, variables): + def __lookup_variables(self, terms, variables): + foo = variables.copy() + foo.pop('vars') results = [] for x in terms: - intermediate = listify_lookup_plugin_terms(x, variables, loader=self._loader) + try: + intermediate = listify_lookup_plugin_terms(x, variables, loader=self._loader, fail_on_undefined=True) + except UndefinedError, e: + raise AnsibleUndefinedVariable("One of the nested variables was undefined. The error was: %s" % e) results.append(intermediate) return results def run(self, terms, variables=None, **kwargs): - terms = self.__lookup_variabless(terms, variables) + terms = self.__lookup_variables(terms, variables) my_list = terms[:] my_list.reverse() diff --git a/lib/ansible/utils/listify.py b/lib/ansible/utils/listify.py index 7bcf9ce802c..95d48121339 100644 --- a/lib/ansible/utils/listify.py +++ b/lib/ansible/utils/listify.py @@ -26,14 +26,14 @@ from ansible.template.safe_eval import safe_eval __all__ = ['listify_lookup_plugin_terms'] #FIXME: probably just move this into lookup plugin base class -def listify_lookup_plugin_terms(terms, variables, loader): +def listify_lookup_plugin_terms(terms, variables, loader, fail_on_undefined=False): if isinstance(terms, basestring): stripped = terms.strip() templar = Templar(loader=loader, variables=variables) #FIXME: warn/deprecation on bare vars in with_ so we can eventually remove fail on undefined override - terms = templar.template(terms, convert_bare=True, fail_on_undefined=False) + terms = templar.template(terms, convert_bare=True, fail_on_undefined=fail_on_undefined) #TODO: check if this is needed as template should also return correct type already terms = safe_eval(terms)