mirror of
https://github.com/ansible-collections/community.general.git
synced 2026-05-06 13:22:48 +00:00
Tracebacks are now catchable with ignore_errors and have streamlined output. Also removes 'baby-JSON' for bash modules.
This commit is contained in:
@@ -493,7 +493,7 @@ class PlaybookRunnerCallbacks(DefaultRunnerCallbacks):
|
||||
if returned_msg:
|
||||
display("msg: %s" % returned_msg, color='red', runner=self.runner)
|
||||
if not parsed and module_msg:
|
||||
display("invalid output was: %s" % module_msg, color='red', runner=self.runner)
|
||||
display(module_msg, color='red', runner=self.runner)
|
||||
if ignore_errors:
|
||||
display("...ignoring", color='cyan', runner=self.runner)
|
||||
super(PlaybookRunnerCallbacks, self).on_failed(host, results, ignore_errors=ignore_errors)
|
||||
|
||||
@@ -138,4 +138,10 @@ class InventoryScript(object):
|
||||
except OSError, e:
|
||||
raise errors.AnsibleError("problem running %s (%s)" % (' '.join(cmd), e))
|
||||
(out, err) = sp.communicate()
|
||||
return utils.parse_json(out)
|
||||
if out.strip() == '':
|
||||
return dict()
|
||||
try:
|
||||
return utils.parse_json(out)
|
||||
except ValueError:
|
||||
raise errors.AnsibleError("could not parse post variable response: %s, %s" % (cmd, out))
|
||||
|
||||
|
||||
@@ -539,7 +539,7 @@ class Runner(object):
|
||||
cmd2 = conn.shell.remove(tmp, recurse=True)
|
||||
self._low_level_exec_command(conn, cmd2, tmp, sudoable=False)
|
||||
|
||||
data = utils.parse_json(res['stdout'], from_remote=True)
|
||||
data = utils.parse_json(res['stdout'], from_remote=True, no_exceptions=True)
|
||||
if 'parsed' in data and data['parsed'] == False:
|
||||
data['msg'] += res['stderr']
|
||||
return ReturnData(conn=conn, result=data)
|
||||
|
||||
@@ -43,7 +43,7 @@ class ReturnData(object):
|
||||
self.diff = diff
|
||||
|
||||
if type(self.result) in [ str, unicode ]:
|
||||
self.result = utils.parse_json(self.result, from_remote=True)
|
||||
self.result = utils.parse_json(self.result, from_remote=True, exceptions=False)
|
||||
|
||||
if self.host is None:
|
||||
raise Exception("host not set")
|
||||
|
||||
@@ -506,7 +506,7 @@ def _clean_data_struct(orig_data, from_remote=False, from_inventory=False):
|
||||
data = orig_data
|
||||
return data
|
||||
|
||||
def parse_json(raw_data, from_remote=False, from_inventory=False):
|
||||
def parse_json(raw_data, from_remote=False, from_inventory=False, no_exceptions=False):
|
||||
''' this version for module return data only '''
|
||||
|
||||
orig_data = raw_data
|
||||
@@ -517,28 +517,10 @@ def parse_json(raw_data, from_remote=False, from_inventory=False):
|
||||
try:
|
||||
results = json.loads(data)
|
||||
except:
|
||||
# not JSON, but try "Baby JSON" which allows many of our modules to not
|
||||
# require JSON and makes writing modules in bash much simpler
|
||||
results = {}
|
||||
try:
|
||||
tokens = shlex.split(data)
|
||||
except:
|
||||
print "failed to parse json: "+ data
|
||||
if no_exceptions:
|
||||
return dict(failed=True, parsed=False, msg=raw_data)
|
||||
else:
|
||||
raise
|
||||
for t in tokens:
|
||||
if "=" not in t:
|
||||
raise errors.AnsibleError("failed to parse: %s" % orig_data)
|
||||
(key,value) = t.split("=", 1)
|
||||
if key == 'changed' or 'failed':
|
||||
if value.lower() in [ 'true', '1' ]:
|
||||
value = True
|
||||
elif value.lower() in [ 'false', '0' ]:
|
||||
value = False
|
||||
if key == 'rc':
|
||||
value = int(value)
|
||||
results[key] = value
|
||||
if len(results.keys()) == 0:
|
||||
return { "failed" : True, "parsed" : False, "msg" : orig_data }
|
||||
|
||||
if from_remote:
|
||||
results = _clean_data_struct(results, from_remote, from_inventory)
|
||||
|
||||
Reference in New Issue
Block a user