2017-04-20 37 views
0

私はJSONデータを操作して、Ansibleの特定のフォーマットに一致させようとしています。私は一般的にはPythonとプログラミングに新しいです。私はそれをどうやって行うのか分かりません。私は何をしようとしていることであるPythonでJSONを操作する

./swinds.py --list 
Test json before manipulation: 

{u'results': [{u'Vendor': u'Cisco', u'IPAddress': u'10.150.190.2'}, {u'Vendor': u'Cisco', u'IPAddress': u'10.150.250.3'}, {u'Vendor': u'Unknown', u'IPAddress': u'10.255.255.42'}, {u'Vendor': u'Juniper Networks/NetScreen', u'IPAddress': u'10.58.1.1'}, {u'Vendor': u'Cisco', u'IPAddress': u'10.33.93.1'}, {u'Vendor': u'Cisco', u'IPAddress': u'10.33.93.2'}, {u'Vendor': u'Unknown', u'IPAddress': u'10.33.93.3'}, {u'Vendor': u'Cisco', u'IPAddress': u'10.33.93.4'}, {u'Vendor': u'Unknown', u'IPAddress': u'10.33.93.6'}, {u'Vendor': u'Cisco', u'IPAddress': u'10.33.93.7'}]} 



    Cisco 
hosts:10.150.190.2 
hosts:10.150.250.3 
hosts:10.255.255.42 
hosts:10.58.1.1 
hosts:10.33.93.1 
hosts:10.33.93.2 
hosts:10.33.93.3 
hosts:10.33.93.4 
hosts:10.33.93.6 
hosts:10.33.93.7 
Cisco 
hosts:10.150.190.2 
hosts:10.150.250.3 
hosts:10.255.255.42 
hosts:10.58.1.1 
hosts:10.33.93.1 
hosts:10.33.93.2 
hosts:10.33.93.3 
hosts:10.33.93.4 
hosts:10.33.93.6 
hosts:10.33.93.7 
Unknown 
... 

このAnsibleのような出力に何かを読むことができます:任意のための

{ 
    "Cisco" : { 
     "hosts" : [ "10.150.190.2", "10.150.250.3" ], 
      }, 
    "Unknown" : 
     "hosts" : [ "10.255.255.42" ], 
}, 

おかげでこれが私の出力である

import os 
import sys 
import argparse 
import ConfigParser 

try: 
    import json 
except ImportError: 
    import simplejson as json 

import requests 

payload = 'query=SELECT+TOP+10+IPAddress,+Vendor+FROM+Orion.Nodes' 
url = "https://10.150.199.44:17778/SolarWinds/InformationService/v3/Json/Query" 
req = requests.get(url, params=payload, verify=False, auth=('dmitry', 'security')) 

jsonget = req.json() 


def get_list(self): 
     hostsData = jsonget 
     print "Test json before manipulation:\n" 
     print(hostsData) 
     print "\n\n" 
     for item in hostsData['results']: 
      print '' + item['Vendor'] 
      for item in hostsData['results']: 
       print 'hosts:' + item['IPAddress'] 

:ここに私のreleventコードです助けて。

CB

+0

は、そのサーバーのものを現実の資格情報であり、実際に本物のURLです?? :O – tar

+1

Dude ................投稿前にデータを匿名化する.......... –

+0

'10.0.0.0/24'は私設ネットワークです... – njzk2

答えて

0

EDITED:

import pprint 
import simplejson 

# Your long string 
s = {u'results': [{u'Vendor': u'Cisco', u'IPAddress': u'10.150.190.2'}, {u'Vendor': u'Cisco', u'IPAddress': u'10.150.250.3'}, {u'Vendor': u'Unknown', u'IPAddress': u'10.255.255.42'}, {u'Vendor': u'Juniper Networks/NetScreen', u'IPAddress': u'10.58.1.1'}, {u'Vendor': u'Cisco', u'IPAddress': u'10.33.93.1'}, {u'Vendor': u'Cisco', u'IPAddress': u'10.33.93.2'}, {u'Vendor': u'Unknown', u'IPAddress': u'10.33.93.3'}, {u'Vendor': u'Cisco', u'IPAddress': u'10.33.93.4'}, {u'Vendor': u'Unknown', u'IPAddress': u'10.33.93.6'}, {u'Vendor': u'Cisco', u'IPAddress': u'10.33.93.7'}]} 



# Eval the Json to python friendly dict 
dumped = eval(simplejson.dumps(s)) 

# Make a set of vendors (no duplicates) 
vendor_set = set() 
for value in dumped['results']: 
    vendor_set.add(value['Vendor']) 

# Make a new dict based on these vendors 
final_dict = dict.fromkeys(vendor_set) 

# Loop over the dict, conditionally adding IPAddresses to the hosts key for each vendor 
for key in final_dict: 
    for v in dumped['results']: 
     if final_dict[key] is not None: 
      if key in str(v): 
       final_dict[key]['hosts'].append(v['IPAddress']) 
     else: 
      final_dict[key] = {'hosts': []} 

# Print it (somewhat) nicely 
pprint.pprint(final_dict) 

# Prints: 
{'Cisco': {'hosts': ['10.150.250.3', 
        '10.33.93.1', 
        '10.33.93.2', 
        '10.33.93.4', 
        '10.33.93.7']}, 
'Juniper Networks/NetScreen': {'hosts': ['10.58.1.1']}, 
'Unknown': {'hosts': ['10.255.255.42', '10.33.93.3', '10.33.93.6']}} 
+0

Gotcha。すべてのIPAddessがグループ(ベンダーキー)の下にある必要があります。だから、私はループを持っていた。 Ciscoの下で注意してください、そして次に、ホストのすべてのIPAddress値の下のキー。これは、在庫が在庫のためにデータを読み取る方法です。 { "シスコ":{ "ホスト":[ "10.150.190.2"、 "10.150.250.3"]、 }、 "不明": "ホスト":[ "10.255.255.42"]、 }、 https://docs.ansible.com/ansible/dev_guide/developing_inventory.html#script-conventions – FunkyClicker

+0

試す^ @FunkyClicker。 – JacobIRR

+0

もうすぐです。私はそれを実行するとき、私は最後にナルを得ます。 ./swinds.py --list { 'シスコ' { 'ホスト':['10 .150.250.3' 、 '10 .33.93.1' '10 .33.93.2' '10 .33.93.4' '10 .33.93.7 ']}、 ' Juniper Networks/NetScreen ':{'ホスト ':['10 .58.1.1']}、 '不明':{'ホスト':['10 .255.255.42 '、'10 .33。 93.3 '、'10 .33.93.6']}} null – FunkyClicker