Add option to fail on undefined variables to listify

And use it in the call to get the loop items for a task.
pull/8127/merge
James Cammarata 9 years ago
parent a586c74967
commit 2673eb0afb

@ -143,7 +143,7 @@ class TaskExecutor:
items = None items = None
if self._task.loop and self._task.loop in lookup_loader: 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) items = lookup_loader.get(self._task.loop, loader=self._loader).run(terms=loop_terms, variables=self._job_vars)
return items return items

@ -17,22 +17,29 @@
from __future__ import (absolute_import, division, print_function) from __future__ import (absolute_import, division, print_function)
__metaclass__ = type __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.plugins.lookup import LookupBase
from ansible.utils.listify import listify_lookup_plugin_terms from ansible.utils.listify import listify_lookup_plugin_terms
class LookupModule(LookupBase): class LookupModule(LookupBase):
def __lookup_variabless(self, terms, variables): def __lookup_variables(self, terms, variables):
foo = variables.copy()
foo.pop('vars')
results = [] results = []
for x in terms: 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) results.append(intermediate)
return results return results
def run(self, terms, variables=None, **kwargs): def run(self, terms, variables=None, **kwargs):
terms = self.__lookup_variabless(terms, variables) terms = self.__lookup_variables(terms, variables)
my_list = terms[:] my_list = terms[:]
my_list.reverse() my_list.reverse()

@ -26,14 +26,14 @@ from ansible.template.safe_eval import safe_eval
__all__ = ['listify_lookup_plugin_terms'] __all__ = ['listify_lookup_plugin_terms']
#FIXME: probably just move this into lookup plugin base class #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): if isinstance(terms, basestring):
stripped = terms.strip() stripped = terms.strip()
templar = Templar(loader=loader, variables=variables) templar = Templar(loader=loader, variables=variables)
#FIXME: warn/deprecation on bare vars in with_ so we can eventually remove fail on undefined override #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 #TODO: check if this is needed as template should also return correct type already
terms = safe_eval(terms) terms = safe_eval(terms)

Loading…
Cancel
Save