Python自动化导出zabbix数据并发邮件脚本
Python  /  管理员 发布于 7年前   189
Zabbix没有报表导出的功能,于是通过编写脚本导出zabbix数据并发邮件。效果如下:
下面是脚本,可根据自己的具体情况修改:
#!/usr/bin/python``#coding:utf-8``import MySQLdb``import time,datetime``import xlsxwriter``import smtplib``from` `email.mime.text import MIMEText``from` `email.mime.multipart import MIMEMultipart``from` `email.header import Header``#zabbix数据库信息:``zdbhost = ``'127.0.0.1'``zdbuser = ``'zabbix'``zdbpass = ``'zabbix'``zdbport = 3306``zdbname = ``'zabbix'``#生成文件名称:``xlsfilename = ``'Group_Production_Server.xlsx'``#需要查询的key列表 [名称,表名,key值,取值,格式化,数据整除处理]``keys = [``# ['CPU核心数','trends_uint','system.cpu.num','avg','',1],``#['CPU平均空闲值','trends','system.cpu.util[,idle]','avg','%.2f',1],``#['CPU最小空闲值','trends','system.cpu.util[,idle]','min','%.2f',1],``[``'CPU使用率(%)'``,``'trends'``,``'CPU_used'``,``'avg'``,``'%.2f'``,1],``#['内存大小(单位G)','trends_uint','vm.memory.size[total]','avg','',1048576000],``#['剩余内存(单位G)','trends_uint','vm.memory.size[available]','avg','',1048576000],``[``'内存使用率(%)'``,``'trends'``,``'Memory_used'``,``'avg'``,``'%.2f'``,1],``# ['可用平均内存(单位G)','trends_uint','vm.memory.size[available]','avg','',1048576000],``# ['可用最小内存(单位G)','trends_uint','vm.memory.size[available]','min','',1048576000],``# ['swap总大小(单位G)','trends_uint','system.swap.size[,total]','avg','',1048576000],``# ['swap平均剩余(单位G)','trends_uint','system.swap.size[,free]','avg','',1048576000],``# ['根分区总大小(单位G)','trends_uint','vfs.fs.size[/,total]','avg','',1073741824],``# ['根分区平均剩余(单位G)','trends_uint','vfs.fs.size[/,free]','avg','',1073741824],``#['磁盘总大小(单位G)','trends_uint','vfs.fs.size[/fs01,total]','avg','',1073741824],``#['磁盘剩余(单位G)','trends_uint','vfs.fs.size[/fs01,free]','avg','',1073741824],``[``'磁盘使用率(%)'``,``'trends'``,``'fs01_used'``,``'avg'``,``'%.2f'``,1],``# ['进入最大流量(单位Kbps)','trends_uint','net.if.in[eth0]','max','',1000],``# ['进入平均流量(单位Kbps)','trends_uint','net.if.in[eth0]','avg','',1000],``# ['出去最大流量(单位Kbps)','trends_uint','net.if.out[eth0]','max','',1000],``# ['出去平均流量(单位Kbps)','trends_uint','net.if.out[eth0]','avg','',1000],``]``class` `ReportForm:``def __init__(self):``''``'打开数据库连接'``''``self.conn = MySQLdb.connect(host=zdbhost,user=zdbuser,passwd=zdbpass,port=zdbport,db=zdbname)``self.cursor = self.conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)``#生成zabbix哪个分组报表``self.groupname = ``'Group_Production_Server'``#获取IP信息:``self.IpInfoList = self.__getHostList()``def __getHostList(self):``''``'根据zabbix组名获取该组所有IP'``''``#查询组ID:``sql = ``''``'select groupid from groups where name = '``%s``' '``''` `% self.groupname``self.cursor.execute(sql)``groupid = self.cursor.fetchone()[``'groupid'``]``#根据groupid查询该分组下面的所有主机ID(hostid):``sql = ``''``'select hostid from hosts_groups where groupid = '``%s``' '``''` `% groupid``self.cursor.execute(sql)``hostlist = self.cursor.fetchall()``#生成IP信息字典:结构为{'119.146.207.19':{'hostid':10086L,},}``IpInfoList = {}``for` `i ``in` `hostlist:``hostid = i[``'hostid'``]``sql = ``''``'select host from hosts where status = 0 and hostid = '``%s``' '``''` `% hostid``ret = self.cursor.execute(sql)``if` `ret:``IpInfoList[self.cursor.fetchone()[``'host'``]] = {``'hostid'``:hostid}``return` `IpInfoList``def __getItemid(self,hostid,itemname):``''``'获取itemid'``''``sql = ``''``'select itemid from items where hostid = '``%s``' and key_ = '``%s``' '``''` `% (hostid, itemname)``if` `self.cursor.execute(sql):``itemid = self.cursor.fetchone()[``'itemid'``]``else``:``itemid = None``return` `itemid``def getTrendsValue(self,type, itemid, start_time, stop_time):``''``'查询trends_uint表的值,type的值为min,max,avg三种'``''``sql = ``''``'select %s(value_%s) as result from trends where itemid = '``%s``' and clock >= '``%s``' and clock <= '``%s``' '``''` `% (type, type, itemid, start_time, stop_time)``self.cursor.execute(sql)``result = self.cursor.fetchone()[``'result'``]``if` `result == None:``result = 0``return` `result``def getTrends_uintValue(self,type, itemid, start_time, stop_time):``''``'查询trends_uint表的值,type的值为min,max,avg三种'``''``sql = ``''``'select %s(value_%s) as result from trends_uint where itemid = '``%s``' and clock >= '``%s``' and clock <= '``%s``' '``''` `% (type, type, itemid, start_time, stop_time)``self.cursor.execute(sql)``result = self.cursor.fetchone()[``'result'``]``if` `result:``result = ``int``(result)``else``:``result = 0``return` `result``def getLastMonthData(self,type,hostid,table,itemname):``''``'根据hostid,itemname获取该监控项的值'``''``#获取上个月的第20天和最后1天``ts_first = ``int``(time.mktime(datetime.date(datetime.date.today().year,datetime.date.today().month-1,20).timetuple()))``lst_last = datetime.date(datetime.date.today().year,datetime.date.today().month,1)-datetime.timedelta(1)``ts_last = ``int``(time.mktime(lst_last.timetuple()))``itemid = self.__getItemid(hostid, itemname)``function = getattr(self,``'get%sValue'` `% table.capitalize())``return` `function(type,itemid, ts_first, ts_last)``def getNowData(self):``nowtime = datetime.datetime.now().strftime(``'%Y-%m-%d'``)``return` `nowtime``def getInfo(self):``#循环读取IP列表信息``for` `ip,resultdict ``in` `zabbix.IpInfoList.items():``print ``"正在查询 IP:%-15s hostid:%5d 的信息!"` `% (ip, resultdict[``'hostid'``])``#循环读取keys,逐个key统计数据:``for` `value ``in` `keys:``print ``"\t正在统计 key_:%s"` `% value[2]``if` `not value[2] ``in` `zabbix.IpInfoList[ip]:``zabbix.IpInfoList[ip][value[2]] = {}``data = zabbix.getLastMonthData(value[3], resultdict[``'hostid'``],value[1],value[2])``zabbix.IpInfoList[ip][value[2]][value[3]] = data``def writeToXls2(self):``''``'生成xls文件'``''``#创建文件``workbook = xlsxwriter.Workbook(xlsfilename)``#创建工作薄``worksheet = workbook.add_worksheet()``#写入第一列:``worksheet.write(0,0,``"主机"``.decode(``'utf-8'``))``i = 1``for` `ip ``in` `self.IpInfoList:``worksheet.write(i,0,ip)``i = i + 1``#写入其他列:``i = 1``for` `value ``in` `keys:``worksheet.write(0,i,value[0].decode(``'utf-8'``))``#写入该列内容:``j = 1``for` `ip,result ``in` `self.IpInfoList.items():``if` `value[4]:``worksheet.write(j,i, value[4] % result[value[2]][value[3]])``else``:``worksheet.write(j,i, result[value[2]][value[3]] / value[5])``j = j + 1``i = i + 1``workbook.close()``def __del__(self):``''``'关闭数据库连接'``''``self.cursor.close()``self.conn.close()``def Send_Email(self):``sender = ``'[email protected]'``receivers = [``'[email protected]'``] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱``#创建一个带附件的实例``message = MIMEMultipart()``message[``'From'``] = Header(``"Zabbix_server"``, ``'utf-8'``)``message[``'To'``] = Header(``"it"``, ``'utf-8'``)``subject = ``'生产环境虚机资源使用情况'``message[``'Subject'``] = Header(subject, ``'utf-8'``)``#邮件正文内容``message.attach(MIMEText(``'生产环境虚机资源使用情况'``, ``'plain'``, ``'utf-8'``))``# 构造附件1,传送当前目录下的 test.txt 文件``att1 = MIMEText(open(``'Group_Production_Server.xlsx'``, ``'rb'``).read(), ``'base64'``, ``'utf-8'``)``att1[``"Content-Type"``] = ``'application/octet-stream'``# 这里的filename可以任意写,写什么名字,邮件中显示什么名字``att1[``"Content-Disposition"``] = ``'attachment; filename="Group_Production_Server.xlsx"'``message.attach(att1)``try``:``smtpObj = smtplib.SMTP(``'localhost'``)``smtpObj.sendmail(sender, receivers, message.as_string())``print ``"邮件发送成功"``except smtplib.SMTPException:``print ``"Error: 无法发送邮件"``if` `__name__ == ``"__main__"``:``zabbix = ReportForm()``zabbix.getInfo()``zabbix.writeToXls2()``zabbix.Send_Email()`
总结
以上所述是小编给大家介绍的Python自动化导出zabbix数据并发邮件脚本,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号