Catch loop eval errors and only raise them again if the task is not skipped

This should help on issues like #16222.
This commit is contained in:
James Cammarata 2016-11-15 10:02:07 -06:00
parent 4981feee99
commit 57cf5e431c

View file

@ -71,6 +71,7 @@ class TaskExecutor:
self._shared_loader_obj = shared_loader_obj self._shared_loader_obj = shared_loader_obj
self._connection = None self._connection = None
self._rslt_q = rslt_q self._rslt_q = rslt_q
self._loop_eval_error = None
self._task.squash() self._task.squash()
@ -84,8 +85,14 @@ class TaskExecutor:
display.debug("in run()") display.debug("in run()")
try:
try: try:
items = self._get_loop_items() items = self._get_loop_items()
except AnsibleUndefinedVariable as e:
# save the error raised here for use later
items = None
self._loop_eval_error = e
if items is not None: if items is not None:
if len(items) > 0: if len(items) > 0:
item_results = self._run_loop(items) item_results = self._run_loop(items)
@ -402,6 +409,11 @@ class TaskExecutor:
if not self._task.evaluate_conditional(templar, variables): if not self._task.evaluate_conditional(templar, variables):
display.debug("when evaluation failed, skipping this task") display.debug("when evaluation failed, skipping this task")
return dict(changed=False, skipped=True, skip_reason='Conditional check failed', _ansible_no_log=self._play_context.no_log) return dict(changed=False, skipped=True, skip_reason='Conditional check failed', _ansible_no_log=self._play_context.no_log)
# since we're not skipping, if there was a loop evaluation error
# raised earlier we need to raise it now to halt the execution of
# this task
if self._loop_eval_error is not None:
raise self._loop_eval_error
except AnsibleError: except AnsibleError:
# skip conditional exception in the case of includes as the vars needed might not be avaiable except in the included tasks or due to tags # skip conditional exception in the case of includes as the vars needed might not be avaiable except in the included tasks or due to tags
if self._task.action not in ['include', 'include_role']: if self._task.action not in ['include', 'include_role']: