Question

J'écris un plugin pour renvoyer les résultats du journal sous forme de fichier json pour ansible-playbook.

Je ne suis pas très familier avec Python, mais j'ai hacké quelque chose qui semble fonctionner :

def json_log(res, host):
    if type(res) == type(dict()):
        if 'verbose_override' not in res:
          host_json = JSONEncoder().encode({'host':host})
          result_json = JSONEncoder().encode(res)
          combined_json = host_json + result_json
          combined_json = combined_json.replace("}{", ',')
          print(combined_json)

host_json serait quelque chose comme : {"host": "centos65"}

result_json serait quelque chose comme : {"cmd": "echo \"Hello World\" ", "end": "2014-08-01 19:32:38.714584", "stdout": "Hello World", "changed": true, "start": "2014-08-01 19:32:38.707510", "delta": "0:00:00.007074", "stderr": "", "rc": 0, "invocation": {"module_name": "shell", "module_args": "echo \"Hello World\""}}

J'ai donc opté pour la voie de la force brute, j'ai simplement combiné les chaînes et supprimé le }{ il arrive là où ils rejoignent, donc ce sera dans le format que je veux comme json valide :

{"host": "centos65","cmd": "echo \"Hello World\" ", "end": "2014-08-01 19:32:38.714584", "stdout": "Hello World", "changed": true, "start": "2014-08-01 19:32:38.707510", "delta": "0:00:00.007074", "stderr": "", "rc": 0, "invocation": {"module_name": "shell", "module_args": "echo \"Hello World\""}}

Donc pour le moment, je mélange simplement les deux chaînes, puis je remplace la jointure par une virgule. Existe-t-il un moyen plus intelligent de les combiner avec la partie hôte étant au début du json ?

Était-ce utile?

La solution

res = {"cmd": "echo \"Hello World\" ", "end": "2014-08-01 19:32:38.714584", "stdout": "Hello World", "changed": True, "start": "2014-08-01 19:32:38.707510", "delta": "0:00:00.007074", "stderr": "", "rc": 0, "invocation": {"module_name": "shell", "module_args": "echo \"Hello World\""}}

def json_log(res, host):
    if isinstance(res,dict) and 'verbose_override' not in res:  
           res.update({"host": host})        
           combined_json  = JSONEncoder().encode(res)
           print(combined_json)

In [73]: json_log(res,"centos")
{"cmd": "echo \"Hello World\" ", "end": "2014-08-01 19:32:38.714584", "stdout": "Hello World", "changed": true, "rc": 0, "start": "2014-08-01 19:32:38.707510", "host": "centos", "stderr": "", "delta": "0:00:00.007074", "invocation": {"module_name": "shell", "module_args": "echo \"Hello World\""}}

Vous pouvez mettre à jour un dict avec le contenu d'un autre, le seul problème que vous auriez serait si vous aviez des clés en double et ne souhaitiez pas que les valeurs soient écrasées.

Autres conseils

Puisqu’il s’agit de deux dictionnaires, vous pouvez mettre à jour l’un des deux dictionnaires avec l’autre.Ex:

>>> a = {"host": "centos65"}

>>> b = {"cmd": "echo \"Hello World\" ", "end": "2014-08-01 19:32:38.714584", "stdout": "Hello World", "changed": True, "start": "2014-08-01 19:32:38.707510", "delta": "0:00:00.007074", "stderr": "", "rc": 0, "invocation": {"module_name": "shell", "module_args": "echo \"Hello World\""}}

>>> a.update(b)
>>> a
{'cmd': 'echo "Hello World" ', 'end': '2014-08-01 19:32:38.714584', 'stdout': 'Hello World', 'changed': True, 'rc': 0, 'start': '2014-08-01 19:32:38.707510', 'host': 'centos65', 'stderr': '', 'delta': '0:00:00.007074', 'invocation': {'module_name': 'shell', 'module_args': 'echo "Hello World"'}}
>>> a["host"]
'centos65'
>>> a["cmd"]
'echo "Hello World" '
>>> 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top