Python自动化导出zabbix数据并发邮件脚本


Posted in Python onAugust 16, 2019

Zabbix没有报表导出的功能,于是通过编写脚本导出zabbix数据并发邮件。效果如下:

Python自动化导出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 = ``'from@runoob.com'`
`receivers = [``'hejianlai@pci.cn'``] # 接收邮件,可设置为你的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数据并发邮件脚本,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python中使用OpenCV进行人脸检测的例子
Apr 18 Python
详解Python中的变量及其命名和打印
Mar 11 Python
解决Python 中英文混输格式对齐的问题
Jul 16 Python
Python3.6使用tesseract-ocr的正确方法
Oct 17 Python
浅谈Python接口对json串的处理方法
Dec 19 Python
使用python分析统计自己微信朋友的信息
Jul 19 Python
python3实现带多张图片、附件的邮件发送
Aug 10 Python
Python使用Pandas库常见操作详解
Jan 16 Python
python ffmpeg任意提取视频帧的方法
Feb 21 Python
记录模型训练时loss值的变化情况
Jun 16 Python
python 多进程和协程配合使用写入数据
Oct 30 Python
Python偏函数实现原理及应用
Nov 20 Python
python禁用键鼠与提权代码实例
Aug 16 #Python
Python函数装饰器原理与用法详解
Aug 16 #Python
python word转pdf代码实例
Aug 16 #Python
django 快速启动数据库客户端程序的方法示例
Aug 16 #Python
djano一对一、多对多、分页实例代码
Aug 16 #Python
python try except返回异常的信息字符串代码实例
Aug 15 #Python
python 多进程共享全局变量之Manager()详解
Aug 15 #Python
You might like
PHP脚本的10个技巧(2)
2006/10/09 PHP
PHP 正则表达式之正则处理函数小结(preg_match,preg_match_all,preg_replace,preg_split)
2012/10/05 PHP
PHP 信号管理知识整理汇总
2017/02/19 PHP
JavaScript window.setTimeout() 的详细用法
2009/11/04 Javascript
js+css在交互上的应用
2010/07/18 Javascript
addEventListener 的用法示例介绍
2014/05/07 Javascript
jQuery实现的数值范围range2dslider选取插件特效多款代码分享
2015/08/27 Javascript
jquery实现仿Flash的横向滑动菜单效果代码
2015/09/17 Javascript
Angularjs2不同组件间的通信实例代码
2017/05/06 Javascript
初探JavaScript 面向对象(推荐)
2017/09/03 Javascript
简单实现jquery隔行变色
2017/11/09 jQuery
详解vue.js移动端配置flexible.js及注意事项
2019/04/10 Javascript
LayUI switch 开关监听 获取属性值、更改状态的方法
2019/09/21 Javascript
vue2.0 解决抽取公用js的问题
2020/07/31 Javascript
vue3.0 自适应不同分辨率电脑的操作
2021/02/06 Vue.js
Python中使用PIL库实现图片高斯模糊实例
2015/02/08 Python
flask中主动抛出异常及统一异常处理代码示例
2018/01/18 Python
python3 遍历删除特定后缀名文件的方法
2018/04/23 Python
在python中以相同顺序shuffle两个list的方法
2018/12/13 Python
Python实现多进程的四种方式
2019/02/22 Python
Python实现的调用C语言函数功能简单实例
2019/03/13 Python
使用Python制作缩放自如的圣诞老人(圣诞树)
2019/12/25 Python
Pycharm连接远程服务器过程图解
2020/04/30 Python
python里反向传播算法详解
2020/11/22 Python
html5 canvas的绘制文本自动换行的示例代码
2018/09/17 HTML / CSS
什么是GWT的Entry Point
2013/08/16 面试题
销售人员自我评价
2014/02/01 职场文书
程序员求职信
2014/04/16 职场文书
给学校的建议书范文
2014/05/15 职场文书
中学生的1000字检讨书
2014/10/11 职场文书
先进单位申报材料
2014/12/25 职场文书
党员公开承诺书2016
2016/03/24 职场文书
标准演讲稿格式结尾应该怎么书写?
2019/07/17 职场文书
Vue CLI中模式与环境变量的深入详解
2021/05/30 Vue.js
MySQL Innodb索引机制详细介绍
2021/11/23 MySQL
Python echarts实现数据可视化实例详解
2022/03/03 Python