设为首页 收藏本站
查看: 1548|回复: 0

[经验分享] Zabbix 绘图实现交换机端口描述

[复制链接]

尚未签到

发表于 2019-1-26 08:14:13 | 显示全部楼层 |阅读模式
思路:        

python netsnmp模块采集交换机SNMP信息,通过pyzabbix 连接Zabbix API 自动生成带有端口描述信息的graph


测试环境 python2.7
    软件包:

         net-snmp-5.4.4.tar.gz

         pyzabbix

net-snmp编译参数



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


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 生成新的screen
  -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了
  





这边也就改变了
如果脚本有问问题请向我指出谢谢!
  

  



附件:http://down.运维网.com/data/2364316


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-667604-1-1.html 上篇帖子: zabbix企业应用之分布式监控proxy-Suzf Blog-运维网 博客 下篇帖子: zabbix 监控端口,其他端口和此端口类似
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表