思路:
python
python netsnmp模塊採集交換機SNMP信息,經過pyzabbix 鏈接Zabbix API 自動生成帶有端口描述信息的graphgit
測試環境 python2.7api
軟件包:
服務器
net-snmp-5.4.4.tar.gzapp
pyzabbixpython2.7
net-snmp編譯參數ide
cd net-snmp-5.4.4 ./configure --with-python-modules --prefix=/usr/local/net-snmp --enable-developer-enable-shared make && make install cd python python2.7 setup.py install
安裝pyzabbix
oop
pip install pyzabbix
Zabbix API item.create 好像不支持建立以SNMP的方法來建立的,因此這邊以以low level discovery方法來採集交換機的端口, 這邊事先手動建立以low level discove測試
#!/usr/bin/env python2.7 import netsnmp import os from pyzabbix import ZabbixAPI import re import sys #import itertools class SnmpSession(object): def __init__(self,oid='ifDescr',Version=2,DestHost='lcoalhost',Community=''): a,b=os.popen4('snmpwalk -v 2c -c %s %s %s' % (Community,DestHost,oid)) oid_value=[] for x in b: # print x.split('.')[1].split(' ')[0] oid_value.append(x.split('.')[1].split(' ')[0]) # print oid_value ifDescr=[] ifAlias=[] ifHCInOctets=[] ifHCOutOctets=[] for x in oid_value: ifDescr.append('ifDescr.%s' % x) ifAlias.append('ifAlias.%s' % x) ifHCInOctets.append('ifHCInOctets.%s' % x) ifHCOutOctets.append('ifHCOutOctets.%s' % x) # print ifDescr # print ifAlias # print ifHCInOctets # print ifHCOutOctets if oid == 'ifDescr': self.oids=ifDescr if oid == 'ifAlias': self.oids=ifAlias if oid == 'ifHCInOctets': slef.oids='ifHCInOctets' if oid == 'ifHCOutOctets': self.oids=ifHCOutOctets # print self.oids self.oid=oid self.Version=Version self.DestHost=DestHost self.Community=Community def query(self): try: result=netsnmp.snmpwalk(self.oid,Version=self.Version,DestHost=self.DestHost,Community=self.Community) ifDescr_d={} for x in zip(self.oids,list(result)): ifDescr_d[x[0]]=x[1] # print ifDescr_d if len(ifDescr_d) == 0: sys.exit(2) return ifDescr_d except: print 'switch Oid or ip is problem' sys.exit(3) #print sys.exc_info() # print result class zabbix(object): #主模塊會調用上面的類 def __init__(self,hostname,Community,swich_ip,columns,name,graph,screen): self.server = 'http://10.0.100.12/zabbix' #Zabbix的服務器IP self.user = 'admin' #Zabbix的賬號 self.passwd = 'admin' #Zabbix的密碼 # self.ip = ip # self.host = host self.hostname = hostname # self.oid = oid self.Community = Community self.swich_ip = swich_ip self.columns = columns self.dynamic = 0 self.name = name self.graph = graph self.screen = screen def __login(self): #登陸Zabbix API的方法後面會屢次被調用 zapi = ZabbixAPI(self.server) zapi.login(self.user,self.passwd) return zapi def __get_host(self): #獲取主機的方法 list_host=self.__login().host.get(output='extend',filter={'host':self.hostname,}) #print list_host return list_host[0]['hostid'] def __get_item(self): #獲取項目的方法 list_item=self.__login().item.get(output='extend',hostids=self.__get_host()) itemids={} for x in list_item: # print x['name'],x['itemid'] itemids[(x['name'])]=x['itemid'] # break # print itemids return itemids def __graph_create(self): #建立繪圖的方法 items=self.__get_item() #print items desc=SnmpSession(oid='ifDescr',DestHost=self.swich_ip,Community=self.Community).query() #被調用的類 alias=SnmpSession(oid='ifAlias',DestHost=self.swich_ip,Community=self.Community).query() # print alias.values() port_desc={} desc_1={} for x in desc.keys(): desc_1[x.split('.')[1]]=desc[x] alias_1={} for x in alias.keys(): alias_1[x.split('.')[1]]=alias[x] for x in desc_1.keys(): port_desc[desc_1[x]]=alias_1[x] # print port_desc group_items={} for x in desc.values(): # print x aa=[] for y in items.keys(): # print y if re.search(x+'$',y): aa.append(items[y]) group_items[x]=aa # print group_items desc_and_port={} for x in port_desc.keys(): # print x for y in group_items.keys(): # print y if re.search(x+'$',y): # print y,port_desc[x],group_items[y] desc_and_port['%s (%s)' % ( y,port_desc[x] )]=group_items[y] # break # self.__login().graph.create( # print desc_and_port def b(x): return int(re.split('^\D+',x)[1].split(' ')[0].split('/')[-1]) #for x in desc_and_port.keys(): print sorted(desc_and_port,key=b) for x in sorted(desc_and_port,key=b): self.__login().graph.create(gitems=[{ "itemid":desc_and_port[x][0], #這邊能夠修改繪圖的參數 "drawtype":"0", "sortorder":"0", "color":"0000CC", "yaxisside":"0", "calc_fnc":"2", "type":"0", "periods_cnt":"5" }, { "itemid":desc_and_port[x][1], "drawtype":"0", "sortorder":"1", "color":"00CC00", "yaxisside":"0", "calc_fnc":"2", "type":"0", "periods_cnt":"5" }], name=x, width="900", height="200", yaxismin="0.0000", yaxismax="3.0000", # templateid="0", show_work_period="1", show_triggers="1", graphtype="0", show_legend="1", show_3d="0", percent_left="0.0000", percent_right="0.0000", ymin_type="0", ymax_type="0", ymin_itemid="0", ymax_itemid="0") def __get_graph(self): #獲取你須要的繪圖 在下面生成screen須要 graphs=[] list_graph=self.__login().graph.get(output='extend',hostids=self. __get_host()) for x in list_graph: # print x['graphid'] if not re.search('Vlanif',x['name'].split(' ')[0]): if not re.search('LoopBack',x['name'].split(' ')[0]): if not re.search('NULL',x['name'].split(' ')[0]): if not re.search('Ethernet0/0/0',x['name'].split(' ')[0]): if not re.search('Console',x['name'].split(' ')[0]): print x['name'].split(' ')[0],x['graphid'] graphs.append(x['graphid']) graph_list=[] x = 0 y = 0 for graph in sorted(graphs): # print "x is " + str(x) # print "y is " + str(y) graph_list.append({ "resourcetype":'0', #這邊能夠修改screen的參數 "resourceid": graph, "width": "500", "height": "100", "x": str(x), "y": str(y), "colspan": "0", "rowspan": "0", "elements": "0", "valign": "0", "halign": "0", "style": "0", "url": "", "dynamic": str(self.dynamic) }) x += 1 # print type(x) # print type(self.columns) if x == int(self.columns): x = 0 y += 1 #print graph_list return graph_list def __create_screen(self): #建立screen的方法 graphids=self.__get_graph() columns = int(self.columns) if len(graphids) % self.columns == 0: vsize = len(graphids) / self.columns else: vsize = (len(graphids) / self.columns) + 1 # print graphids self.__login().screen.create(name=self.name,hsize=self.columns,vsize=vsize,screenitems=graphids) def __exists_screen(self): #判斷 list_exists=self.__login().screen.exists(name=self.name) if list_exists: print '%s is exists' % self.name sys.exit(1) def __exists_host(self): #判斷 list_exists=self.__login().host.exists(host=self.hostname) if not list_exists: print "%s is not exists" % self.hostname sys.exit(1) #return graphs # # def __del_graph(self): # a=self.__get_graph() # self.__login().graph.delete(a) def main(self): self.__exists_host() self.__exists_screen() # self.__get_host() # self.__get_item() if self.graph: self.__graph_create() # self.__get_graph() # self.__del_graph() if self.screen: self.__create_screen() if __name__ == '__main__': from optparse import OptionParser parser = OptionParser() parser.add_option('-G', dest='graphname', help='Zabbix Host create new screen ') parser.add_option('-H', dest='hostname', help='Zabbix Host to create screen from') parser.add_option('-c', dest='columns', type=int, help='number of columns in the screen') parser.add_option('-C', dest='Community', help='switch SNMP community') parser.add_option('-s', dest='switch', help='switch ip') parser.add_option('-x', dest='execute',action='store_true',default=False, help='create host graph') parser.add_option('-n',dest='screen',action='store_true',default=False, help='whether create zabbix screen') options,args=parser.parse_args() a=zabbix(hostname=options.hostname,Community=options.Community,swich_ip=options.switch,columns=options.columns,name=options.graphname,graph=options.execute,screen=options.screen) a.main() #對於多塊板卡的生成的screen有點問題 後期會補上
-G 生成新的screenurl
-H 本身定義的主機名
-c 須要生成的列
-s 交換的ip地址, (這邊交換的ip地址可能會跟你的 Host name 不一樣)
-x 是否開啓建立graph的功能
-n 是否開啓screen 功能
注意 -C -s 若是沒有填正確的信息 腳本會報錯,這個後續改下
例子: ./switch_desc_port_and_create_screen.py -G tom -H 10.0.10.100 -c 2 -C tom -s 10.0.10.100 -x True -n True
Graph出來啦
Screen 也出來了
這邊出來的是你剛纔low level discovery 定義的
如今你能夠改name了
這邊也就改變了
若是腳本有問問題請向我指出謝謝!