diff --git a/lib/ansible/plugins/action/__init__.py b/lib/ansible/plugins/action/__init__.py index f941d1304ca..d98c980e494 100644 --- a/lib/ansible/plugins/action/__init__.py +++ b/lib/ansible/plugins/action/__init__.py @@ -405,7 +405,7 @@ class ActionBase: # not valid json, lets try to capture error data = dict(failed=True, parsed=False) if 'stderr' in res and res['stderr'].startswith('Traceback'): - data['traceback'] = res['stderr'] + data['exception'] = res['stderr'] else: data['msg'] = res.get('stdout', '') if 'stderr' in res: diff --git a/lib/ansible/plugins/callback/default.py b/lib/ansible/plugins/callback/default.py index 5b50b49cc89..071cb8e48ad 100644 --- a/lib/ansible/plugins/callback/default.py +++ b/lib/ansible/plugins/callback/default.py @@ -37,10 +37,24 @@ class CallbackModule(CallbackBase): pass def v2_runner_on_failed(self, result, ignore_errors=False): - if 'exception' in result._result and self._display.verbosity < 3: + if 'exception' in result._result: + if self._display.verbosity < 3: + # extract just the actual error message from the exception text + error = result._result['exception'].strip().split('\n')[-1] + msg = "An exception occurred during task execution. To see the full traceback, use -vvv. The error was: %s" % error + else: + msg = "An exception occurred during task execution. The full traceback is:\n" + result._result['exception'] + + self._display.display(msg, color='red') + + # finally, remove the exception from the result so it's not shown every time del result._result['exception'] + self._display.display("fatal: [%s]: FAILED! => %s" % (result._host.get_name(), json.dumps(result._result, ensure_ascii=False)), color='red') + if result._task.ignore_errors: + self._display.display("...ignoring") + def v2_runner_on_ok(self, result): if result._task.action == 'include':