2017-04-20 65 views
0

我想操縱JSON數據以匹配Ansible的特定格式。我是一般的Python和編程新手。我似乎無法弄清楚如何做到這一點。這裏是我的培訓相關代碼:使用python操縱JSON

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'] 

這是我的輸出:

./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" ], 
}, 

感謝您的任何幫幫我。

CB

+0

是該服務器的真實憑據,是URL實際上真正的? :O – tar

+1

老兄...........發佈前匿名化數據.......... –

+0

'10.0.0.0/24'是專用網絡...... – njzk2

回答

0

編輯:

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

難題。我需要將所有IPAddess都歸於組(供應商密鑰)之下。這就是爲什麼我有循環。注意下面的思科,然後在主機鍵下面的所有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

它很接近。當我運行它時,我會在最後得到一個ansible不喜歡的null。 ./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':{'hosts':['10 .58.1.1']}, 'Unknown':{'hosts':['10 .255.255.42','10 .33。 93.3','10 .33.93.6']}} null – FunkyClicker