zabbix对主机组中的key进行分组批量添加到screen

最近帮朋友写了一个朋友写了一个脚本实现的功能就是对应主机组中的主机对应的cpu,网卡,硬盘进行分组,可以根据时间段来获取数据,添加进screen 手动实现是一件极其麻烦的事情,这样只查看对应的项就方便多了。

我改了下也能按照多个主机来实现添加screen,也能根据主机组来实现

为了方便这边是就是用python 提供的api库来实现了

#!/usr/bin/envpython#coding:utf8frompyzabbiximportZabbixAPIfromitertoolsimportchainimporttimeimportdatetimeimportsocketimportsysimportreclassmake_screen(object):def__init__(self,name=”,columns=2,delete=False,check=False,width=”500″,heigth=”100″,start_time=”,stop_time=”):#def__init__(self):self.columns=columnsself.dynamic=0self.width=widthself.heigth=heigthself.check=checkself.delete=deleteself.name=nameself.start_time=self.f_date(start_time)self.stop_time=self.f_date(datetime.datetime.now())ifstop_time==’now’elseself.f_date(stop_time)#printself.start_time#printself.stop_timeself.history=Trueself.user=’admin’#账号self.passwd=’zabbix’#密码self.server=’#连接你的zabbix服务器的urlself.login()#sys.exit(1)deff_date(self,date):#获取到日期然后对日期进行分割,用字典生成对应的年,月,日,小时,分钟对应的字典#printdatec=re.split(r’-|:|\s’,str(date).split(‘.’)[0])d=[x.lstrip(‘0’)forxincifx.lstrip(‘0’)]iflen(d)>6:print’yourinputtimeiserr’sys.exit(1)returndict(zip(‘ymdhM’,d))defhosts(self,hosts):#输入多个主机生成主机组self.hosts=[xforxinhostsifx]#printself.hosts#defk_filter(self,*filter):defk_filter(self,filter):self.filter=[xforxinfilter]defsearch(self,string):#生成需要过滤主机的key_#print’|’.join(self.filter)ifre.search(r’%s’%’|’.join(self.filter),string):returnstringelse:returndeflogin(self):#登录的zabbix主机self.zapi=ZabbixAPI(self.server)self.zapi.login(self.user,self.passwd)returnself.zapidefg_hostgroup(self,g_name):#获取这个主机组的所有主机returnself.zapi.hostgroup.get(output=’extend’,filter={‘name’:g_name})[0].get(‘groupid’)defg_host(self,name):ifnotself.e_hostgroup(name):#判断这个主机组是否存在的调用defe_hostgroup(self,g_name)方法print”don’thavenamehostgroup”sys.exit(1)host=set()g_host=self.zapi.host.get(output=’extend’,groupids=self.g_hostgroup(name))#从forxing_host:host.add(x.get(‘host’))self.hosts=[xforxinhost]#以主机组获取对应的全部主机#printself.hostsdefe_hostgroup(self,g_name):#判断主机组存在returnself.zapi.hostgroup.exists(name=g_name)defg_item(self):#获取主机对应的的所有item,生成item:key对应的字典items={}forhostnameinself.hosts:host=self.zapi.item.get(output=’extend’,filter={‘host’:hostname,},)forxinhost:#printx.get(‘key_’)ifself.search(x.get(‘key_’)):#printx.get(‘key_’)items[x.get(“itemid”)]=x.get(“value_type”)iflen(items)==0:print”’hostdon’thaveanyitem”’sys.exit(1)#printitemsreturnitems#defv_item(self):defg_history(self):#一个graph可能有很多个item组成的,只要graph中有一个item有数据都认为这个graph是可以用,,获取历史一个时间段的数据进行历史的判断,我这里是根据字典对应的value进行判断,你也可以把对应的value进行累加判断,我这样的做法会把数据为0的也添加进去start_time=time.mktime(datetime.datetime(int(self.start_time.get(‘y’,0)),int(self.start_time.get(‘m’,0)),int(self.start_time.get(‘d’,0)),int(self.start_time.get(‘h’,0)),int(self.start_time.get(‘M’,0))).timetuple())stop_time=time.mktime(datetime.datetime(int(self.stop_time.get(‘y’,0)),int(self.stop_time.get(‘m’,0)),int(self.stop_time.get(‘d’,0)),int(self.stop_time.get(‘h’,0)),int(self.stop_time.get(‘M’,0))).timetuple())printstart_timeprintstop_timeg_item=self.g_item()v_item={}forhistorying_item.keys():#printg_item[history]ifg_item[history]==’0′:get_history=self.zapi.history.get(history=’0′,output=’extend’,itemids=history,time_from=str(start_time),time_till=str(stop_time))elifg_item[history]==’3′:get_history=self.zapi.history.get(output=’extend’,itemids=history,time_from=str(start_time),time_till=str(stop_time))else:’nowonlysupportintegerandfload,doyoucanmodify’sys.exit(1)foryinget_history:ifv_item.has_key(history):v_item[history].append(y.get(‘value’))else:v_item[history]=[]v_item[history].append(y.get(‘value’))#printv_itemreturnv_item.keys()#returnv_item.keys()#returnself.v__itemdefgid_host(self,g_gid):#在引用g_graphitemreturnself.zapi.host.get(output=’extend’,graphids=g_gid)defkey_graph(self,k_graph):#获取graph和主机名,这边的排序是根据主机名来排序forxinself.zapi.graph.get(output=’extend’,graphids=k_graph):return[k_graph,x.get(‘name’)]defg_graphitem(self):graphs=set()g_dict={}s_graphs=[]ifself.history:#是否根据历史中item来判断g_item=self.g_history()else:g_item=self.g_item().keys()#foritemiding_item:#获取没有重复的多有graphv=self.zapi.graphitem.get(output=’extend’,itemids=itemid,)foridinv:#printidgraphs.add(id.get(‘graphid’))iflen(graphs)==0:#这个主机组中没有graph就退出了print”’don’thaveanygraph”’sys.exit(1)#printgraphsk_g={}forxingraphs:#defkey_graphc=self.key_graph(x)#printck_g[c[0]]=c[1]#printk_gforxingraphs:iflen(self.gid_host(x))>1:print’gid_hosthaveproblem’sys.exit(1)foryinself.gid_host(x):#获取主机id生成{主机名:{组名:组id}的字典下面需要排序ifg_dict.get(y.get(‘host’)):g_dict[y.get(‘host’)][k_g.get(x)]=x#pass#print”hostcorrespondingtwograph”#sys.exit(1)else:g_dict[y.get(‘host’)]={}ifnotg_dict[y.get(‘host’)].has_key(k_g.get(x)):g_dict[y.get(‘host’)][k_g.get(x)]=x#printy#passnor=[]err=[]#printg_dict#sys.exit(1)ip_d={}#正则能匹配到ip但不是真正的ip比如1-192.168.1.102-3306这个也能匹配,这个字典主要实现ip转换{192.168.1.102:1-192.168.1.102-3306}forxing_dict:#把正常的ip加进去nor不是就加入到err以便下面能使用socket.inet_aton排序ifre.search(r’\d{1,3}(\.\d{1,3})’,x):ifre.search(r’\-‘,x):#匹配到了的话就加入到字典里面转换下以便根据ip排序不会报错,我这里使用的是re.split以上面的格式split不一定你能使用你可以使用re.findall替代匹配的真正的ipip_d[re.split(r’-‘,x)[0]]=xnor.append(re.split(r’-‘,x)[0])else:nor.append(x)else:err.append(x)#printnor#sys.exit(1)nor_id=[]err_id=[]forxinsorted(nor,key=socket.inet_aton):ifip_d.has_key(x):#这边已经排序完成,然后就把ip替换掉192.168.1.102-3306x=ip_d.get(x)#实现字典中的内切字典也进行排序foryinsorted(g_dict.get(x).keys()):nor_id.append(g_dict.get(x).get(y))forxinsorted(err):#不是ip的话直接排序,就好了,内切字典也进行排序foryinsorted(g_dict.get(x).keys()):err_id.append(g_dict.get(x).get(y))#printnor_id#sys.exit(1)s_graphs=chain(nor_id,err_id)#forzinsorted(g_dict.keys(),key=socket.inet_aton):#s_graphs.append(g_dict.get(z))#printg_dict#sys.exit(1)#print1x=0y=0graph_list=[]#这里就生成对应screen所需要的参数forgraphins_graphs:#printgraphgraph_list.append({“resourcetype”:’0′,”resourceid”:graph,”width”:self.width,”height”:self.heigth,”x”:str(x),”y”:str(y),”colspan”:”0″,”rowspan”:”0″,”elements”:”0″,”valign”:”0″,”halign”:”0″,”style”:”0″,”url”:””,”dynamic”:str(self.dynamic)})x+=1ifx==int(self.columns):x=0y+=1#printgraph_listreturngraph_listdefc_screen(self):#生成screengraphids=self.g_graphitem()columns=int(self.columns)iflen(graphids)%self.columns==0:vsize=len(graphids)/self.columnselse:vsize=(len(graphids)/self.columns)+1#printgraphidsself.zapi.screen.create(name=self.name,hsize=self.columns,vsize=vsize,screenitems=graphids)defe_screen(self):#判断screen是否存在了list_exists=self.zapi.screen.exists(name=self.name)iflist_exists:print’%sisexists’%self.namesys.exit(1)defcheck_screen(self,c_name):#是否生成screen进行验证下ifnotself.zapi.screen.exists(name=c_name):print”%saddfailure”%(c_name)defg_screen(self,g_id):#删除的功能,建议手动删除s_name={}forxinself.zapi.screen.get(output=’extend’):s_name[x.get(‘name’)]=x.get(‘screenid’)ifg_idins_name:self.zapi.screen.delete(s_name[g_id],)defd_screen(self,id):self.zapi.screen.delete(id,)defrun(self):#self.g_history()self.e_screen()self.c_screen()if__name__==’__main__’:fromoptparseimportOptionParserparser=OptionParser()parser.add_option(‘-G’,dest=’graphname’,help=’ZabbixHostGraphtocreatescreenfrom’)parser.add_option(‘-c’,dest=’columns’,type=int,help=’numberofcolumnsinthescreen’)parser.add_option(‘–group’,dest=’group’,help=’thehostgroupname’)parser.add_option(‘-f’,dest=’filter’,action=”append”,help=’whatdoyoufilterstring’)parser.add_option(‘–hosts’,dest=’hosts’,action=’append’,help=’manyhoststogetkey’)parser.add_option(‘–delete’,dest=’delete’,type=int,help=’doyouwanttodeletescreen’)parser.add_option(‘–delete-name’,dest=’delete_name’,help=’removename?’)parser.add_option(‘–check’,dest=’check’,type=int,help=’checkscreenisok?’)parser.add_option(‘-w’,dest=’width’,help=’screenwidth’),parser.add_option(‘–check-name’,dest=’check_name’,help=’checkname?’)parser.add_option(‘-l’,dest=’heigth’,help=’screenheigth’)parser.add_option(‘–start’,dest=’start’,help=’startinhistorytime’)parser.add_option(‘–stop’,dest=’stop’,default=datetime.datetime.now(),help=’stopinhistorytime’)options,args=parser.parse_args()ifoptions.delete:a=make_screen(delete=options.delete)a.g_screen(options.delete_name)sys.exit()ifoptions.check:a=make_screen(check=options.check)a.check_screen(options.check_name)sys.exit(2)#printre.split(r’:|,’,options.filter[0])ifoptions.hostsandoptions.group:print”options.hostsandgroups.grouphavevalueasthesametime”sys.exit(1)elifnot(options.hostsoroptions.group):print”options.hostsandgroups.groupmusttheonehaveavalue”sys.exit(1)#printre.split(r’:|,’,options.hosts[0])#printoptions.hostsa=make_screen(columns=options.columns,name=options.graphname,width=options.width,heigth=options.heigth,start_time=options.start,stop_time=options.stop)#a=make_screen()ifoptions.hosts:a.hosts(re.split(r’:|,’,options.hosts[0]))#a.hosts(‘10.0.15.123′,’10.0.15.1′)ifoptions.group:a.g_host(options.group)a.k_filter(re.split(r’:|,’,options.filter[0]))a.run()

python filter_screen.py -G “SFA-HPC-网络流量” -f “net.if.in” -c 2 –group zabbix -w 800 -l 100 –start 2014-8-6-20-00 –stop now

这里in 和out都在一个graph中,只要一个graph中有一个item有数据就会出来对应的grpah

cpu

注意:

python filter_screen.py -G “SFA-HPC-网络流量” -f “net.if.in[eth0]” -c 2 –group zabbix -w 800 -l 100 –start 2014-8-6-20-00 –stop now

这样就会出问题,正则表达式中[]是或

正确

python filter_screen.py -G “SFA-HPC-网络流量” -f “net.if.in\[eth0\]” -c 2 –group zabbix -w 800 -l 100 –start 2014-8-6-20-00 –stop now

[]需要对齐转义

如果有很多screen,你可以写个循环脚本进行循环,这样见简化繁琐了

有何问题请向我反映谢谢~~~~~~~~~~

本文出自 “zhangke” 博客,请务必保留此出处

两粒种子,一片森林。

zabbix对主机组中的key进行分组批量添加到screen

相关文章:

你感兴趣的文章:

标签云: