For with_first_found loops, set undefined variables to fall through rather than failing the task

pull/12704/merge
Toshio Kuratomi 9 years ago
parent 317e908165
commit 1a04f354f3

@ -167,14 +167,21 @@ class TaskExecutor:
if self._task.loop: if self._task.loop:
if self._task.loop in self._shared_loader_obj.lookup_loader: if self._task.loop in self._shared_loader_obj.lookup_loader:
#TODO: remove convert_bare true and deprecate this in with_ #TODO: remove convert_bare true and deprecate this in with_
try: if self._task.loop == 'first_found':
loop_terms = listify_lookup_plugin_terms(terms=self._task.loop_args, templar=templar, loader=self._loader, fail_on_undefined=True, convert_bare=True) # first_found loops are special. If the item is undefined
except AnsibleUndefinedVariable as e: # then we want to fall through to the next value rather
if 'has no attribute' in str(e): # than failing.
loop_terms = [] loop_terms = listify_lookup_plugin_terms(terms=self._task.loop_args, templar=templar, loader=self._loader, fail_on_undefined=False, convert_bare=True)
self._display.deprecated("Skipping task due to undefined attribute, in the future this will be a fatal error.") loop_terms = [t for t in loop_terms if not templar._contains_vars(t)]
else: else:
raise 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) items = self._shared_loader_obj.lookup_loader.get(self._task.loop, loader=self._loader, templar=templar).run(terms=loop_terms, variables=vars_copy)
else: else:
raise AnsibleError("Unexpected failure in finding the lookup named '%s' in the available lookup plugins" % self._task.loop) raise AnsibleError("Unexpected failure in finding the lookup named '%s' in the available lookup plugins" % self._task.loop)

Loading…
Cancel
Save