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 相关文章推荐
wxpython学习笔记(推荐查看)
Jun 09 Python
Python批量创建迅雷任务及创建多个文件
Feb 13 Python
Python闭包之返回函数的函数用法示例
Jan 27 Python
使用Django开发简单接口实现文章增删改查
May 09 Python
Django利用cookie保存用户登录信息的简单实现方法
May 27 Python
在SQLite-Python中实现返回、查询中文字段的方法
Jul 17 Python
Django-Model数据库操作(增删改查、连表结构)详解
Jul 17 Python
python 经典数字滤波实例
Dec 16 Python
python zip,lambda,map函数代码实例
Apr 04 Python
Python常用数据分析模块原理解析
Jul 20 Python
Python如何使用input函数获取输入
Aug 06 Python
Python 使用Opencv实现目标检测与识别的示例代码
Sep 08 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变量引用的面试题
2010/08/08 PHP
php下使用curl模拟用户登陆的代码
2010/09/10 PHP
浅谈Eclipse PDT调试PHP程序
2014/06/09 PHP
使用PHPExcel实现数据批量导出为excel表格的方法(必看)
2017/06/09 PHP
PHPMailer使用QQ邮箱实现邮件发送功能
2017/08/18 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
浅谈Javascript鼠标和滚轮事件
2012/06/27 Javascript
jquery入门——事件机制之事件中的冒泡现象示例解释
2020/09/12 Javascript
jQuery弹出层始终垂直居中相对于屏幕或当前窗口
2013/04/01 Javascript
JS操作图片(增,删,改) 例子
2013/04/17 Javascript
js动态给table添加/删除tr的方法
2013/08/02 Javascript
node.js中的fs.fchmodSync方法使用说明
2014/12/16 Javascript
基于javascript实现右下角浮动广告效果
2016/01/08 Javascript
第一次接触神奇的Bootstrap
2016/10/14 Javascript
Angular2生命周期钩子函数的详细介绍
2017/07/10 Javascript
微信小程序tabBar底部导航中文注解api详解
2017/08/16 Javascript
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
2018/01/11 Javascript
vue2 全局变量的设置方法
2018/03/09 Javascript
用Vue写一个分页器的示例代码
2018/04/22 Javascript
js实现前面自动补全位数的方法
2018/10/10 Javascript
微信小程序登录session的使用
2019/03/17 Javascript
新手入门js闭包学习过程解析
2019/10/08 Javascript
基于Vue.js+Nuxt开发自定义弹出层组件
2020/10/09 Javascript
python三元运算符实现方法
2013/12/17 Python
深入讨论Python函数的参数的默认值所引发的问题的原因
2015/03/30 Python
Python实现感知器模型、两层神经网络
2017/12/19 Python
python实现简单的五子棋游戏
2020/09/01 Python
详解向scrapy中的spider传递参数的几种方法(2种)
2020/09/28 Python
Sneaker Studio匈牙利:购买运动鞋
2018/03/26 全球购物
个人自我剖析材料
2014/02/07 职场文书
仓管岗位职责范本
2014/02/08 职场文书
汽车维修工岗位职责
2014/02/12 职场文书
学生安全责任书
2014/04/15 职场文书
毕业感言怎么写
2015/07/31 职场文书
ROS系统将python包编译为可执行文件的简单步骤
2021/07/25 Python
使用Oracle命令进行数据库备份与还原
2021/12/06 Oracle