python根据nagios配置文件将监控的服务联系人等信息导出到excel表格
python根据nagios配置文件将监控的服务联系人等信息导出到excel表格
前阵子,遇到需要把nagios监控的服务统计到表格的需求,想着如果每一次改动,都要去维护表格的话,难免会有疏漏或者问题,于是观察了nagios的host.cfg,services.cfg等配置文件写了一个脚本,包含对多个主机关联到同一个服务的处理等,脚本也有局限性,就是需要把每个主机,都归类到某个组,比如Linux主机归类到Linux组,实际环境,一般也是有这样做归类的,脚本运行过程中会有文件产生,但都很小,以下是相应模块安装和脚本文件,建议在测试机上面跑完再到实际环境跑。
一,安装xlsxwriter
一个excel操作模块,可以操作多个工作表的文字、数字、公式、图表等。
pip安装方法:
#pipinstallXlsxWriter
源码安装方法(需下载)
#tar-zxvfXlsxWriter-master.tar.gz#cdXlsxWriter-master#pythonsetup.pyinstall
二,脚本文件:
importxlsxwriter importsys reload(sys) sys.setdefaultencoding('utf8') #注意路径 os.system("cat/usr/local/nagios/etc/hosts.cfg|grep-E'host_name|address|hostgroups'|\ seds/[[:space:]]//|awk'{print$1,$2,$3}'|sed-e's/[[:space:]]$//g'>/root/autocount/hostip") #####################处理一行多个host_name情况######################## os.system("cat/usr/local/nagios/etc/services.cfg|grep-E'host_name|service_description|contacts'|seds/[[:space:]]//|\ awk'{print$1,$2,$3,$4,$5,$6}'|sed-e's/[[:space:]]*$//g'|sed-e's/,[[:space:]]/,/g'>/root/autocount/serviceip2") #含有完整行的文件,及host_name都有的 os.system("cat/usr/local/nagios/etc/services.cfg|grep'host_name'|seds/[[:space:]]//|awk'{print$2,$3,$4,$5,$6}'|seds/[[:space:]]//g|awk'/,/{print$0}'>/root/autocount/serviceip1") os.system("sort-u/root/autocount/serviceip1>/root/autocount/serviceip3") #去除重复行 withopen("/root/autocount/serviceip3")asf3: #a中保存有一行多个host_name的主机 a=f3.readlines() withopen("/root/autocount/serviceip2")asf4: b=f4.readlines() j=0 foriina: k=i.strip('\n').split(',') l=3 whilej>testfile,bb, testfile.close() #此时testfile中还是含有长主机名的,即多个主机在配置文件中显示为同一行的(关联服务) jiji=0 foriina: try: whileTrue: ind=b.index("host_name"+i) b.pop(ind) b.pop(ind) b.pop(ind) print"###############" jiji+=1 except: continue #利用a中先前存的类似host1,host2,host3这样关联的主机,从b中剔除。 print"jijiis%s"%jiji finall=open("/root/autocount/serviceip",'w') forkkinb: print>>finall,kk, finall.close() #关闭保存文件,现在就是不存在类似多个主机名的行了。 file1="/root/autocount/hostip" file2="/root/autocount/serviceip" f=open("/root/autocount/joinout",'w') final=open("/root/autocount/final",'w') f1=file(file1,"r") j=0 totalhost=0 foriinf1.readlines(): totalhost+=1 print>>f,i, f2=file(file2,"r") m=2 forkinf2.readlines(): ifi==k:#先判断是否主机名相等,要不如果serviceip文件服务无联系人,就会出现错乱 print"testtesttest" m=0 continue elifm<2and('host_name'notink): print>>f,k, m+=1 else: m=2 continue f1.close() f2.close() f.close() totalhost=totalhost/3 withopen("/root/autocount/joinout")asf: a=f.readlines() linen=0 con=[] totalservice=0 foriina: if'service_description'ini: totalservice+=1 con.append(linen) linen+=1 else: linen+=1 printcon m=1 #处理一些没有contacts的情况 forjincon: if'contacts'notina[j+m]: a.insert(j+m,'contactsnone\n') m+=1 forxina: print>>final,x, title=[u'序列号',u'host',u'ip',u'service',u'联系人',u'所属部门'] workbook=xlsxwriter.Workbook('Nagios监控信息统计.xlsx') worksheet=workbook.add_worksheet() worksheet.set_column('A:C',30) worksheet.set_column('D:F',30) worksheet.set_column('H:I',10) #worksheet.set_row(3,30) #worksheet.set_row(6,30) #worksheet.set_row(7,30) merge_format=workbook.add_format({ 'bold':1, 'border':1, 'align':'center', 'valign':'vcenter', 'fg_color':'#CC0033'}) merge_format1=workbook.add_format({ 'bold':1, 'border':1, 'align':'center', 'valign':'vcenter', 'fg_color':'#D7E4BC'}) bold=workbook.add_format({ 'bold':1, 'border':1, 'align':'center', 'valign':'vcenter'}) merge_format2=workbook.add_format({ #'bold':1, 'border':1, 'align':'center', 'valign':'vcenter'}) format_title=workbook.add_format() format_title.set_border(1) format_title.set_bg_color('#cccccc') format_title.set_align('center') worksheet.merge_range('A1:F1','Nagios监控信息',merge_format) worksheet.merge_range('H1:I1','主机总计服务总计',merge_format1) worksheet.write('H2',totalhost,bold) worksheet.write('I2',totalservice,bold) worksheet.write_row('A2',title,format_title) ####################################### service_list=[] count=0 slist_end=0 initline=3 defwritetoexecl(numb,host,ip,group,service_list): globalinitline globalslist_end slist_len=str(len(service_list)) initl=str(initline) slist_end=int(initl)+int(slist_len)-1 slist_end1=str(slist_end) #一行的就调用write方法 ifinitl==slist_end1: worksheet.write('A'+initl,numb,merge_format2) worksheet.write('B'+initl,host,merge_format2) worksheet.write('C'+initl,ip,merge_format2) worksheet.write('F'+initl,group,merge_format2) else: worksheet.merge_range('A'+initl+':'+'A'+slist_end1,numb,merge_format2) worksheet.merge_range('B'+initl+':'+'B'+slist_end1,host,merge_format2) worksheet.merge_range('C'+initl+':'+'C'+slist_end1,ip,merge_format2) worksheet.merge_range('F'+initl+':'+'F'+slist_end1,group,merge_format2) servicell=initl #输出服务和联系人 forelementinservice_list: print'++++++++' service1=''.join(element.keys()) contacts1=''.join(element.values()) worksheet.write('D'+servicell,service1,merge_format2) worksheet.write('E'+servicell,contacts1,merge_format2) servicell=str(int(servicell)+1) print'++++++++' #worksheet.merge_range('A50:A60',num,merge_format) #printinitl #printslist_end1 initline=int(initl)+int(slist_len) foriina: service_dict={} #定义字典存放服务和联系人 if'host_name'ini: host=i.split()[1] printhost if'service_description'ini: key=i.split()[1] service_dict[key]='' if'contacts'ini: service_dict[key]=i.split()[1] #printservice_dict service_list.append(service_dict) #printservice_list if'address'ini: ip=i.split()[1] printip if'hostgroups'ini: groups=i.split()[1] printservice_list printgroups count+=1 writetoexecl(count,host,ip,groups,service_list) service_list=[] continue workbook.close()
统计的效果如下:
评论关闭