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 相关文章推荐
Django中实现点击图片链接强制直接下载的方法
May 14 Python
用Python将IP地址在整型和字符串之间轻松转换
Mar 22 Python
Python编程对列表中字典元素进行排序的方法详解
May 26 Python
python中不能连接超时的问题及解决方法
Jun 10 Python
Django 中间键和上下文处理器的使用
Mar 17 Python
python中metaclass原理与用法详解
Jun 25 Python
如何运行.ipynb文件的图文讲解
Jun 27 Python
Django框架模型简单介绍与使用分析
Jul 18 Python
Python requests模块基础使用方法实例及高级应用(自动登陆,抓取网页源码)实例详解
Feb 14 Python
Keras设置以及获取权重的实现
Jun 19 Python
教你利用Selenium+python自动化来解决pip使用异常
May 20 Python
python中redis包操作数据库的教程
Apr 19 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 4.2书写安全的脚本
2006/10/09 PHP
php 什么是PEAR?
2009/03/19 PHP
php csv操作类代码
2009/12/14 PHP
zen cart新进商品的随机排序修改方法
2010/09/10 PHP
PHP中应该避免使用同名变量(拆分临时变量)
2015/04/03 PHP
如何修改Laravel中url()函数生成URL的根地址
2017/08/11 PHP
JavaScript中的prototype使用说明
2010/04/13 Javascript
MC Dialog js弹出层 完美兼容多浏览器(5.6更新)
2010/05/06 Javascript
jquery validate在ie8下的bug解决方法
2013/11/13 Javascript
绑定回车enter事件代码
2014/05/18 Javascript
理解 JavaScript Scoping &amp; Hoisting(二)
2015/11/18 Javascript
js和jquery分别验证单选框、复选框、下拉框
2015/12/17 Javascript
JavaScript的Backbone.js框架入门学习指引
2016/05/07 Javascript
浅谈jquery选择器 :first与:first-child的区别
2016/11/20 Javascript
react系列从零开始_简单谈谈react
2017/07/06 Javascript
运用jQuery写的验证表单(实例讲解)
2017/07/06 jQuery
捕获未处理的Promise错误方法
2017/10/13 Javascript
AngularJS 表单验证手机号的实例(非必填)
2017/11/12 Javascript
原生JS实现瀑布流插件
2018/02/06 Javascript
详解Vue前端生产环境发布配置实战篇
2019/05/07 Javascript
JavaScript面向对象程序设计中对象的定义和继承详解
2019/07/29 Javascript
[02:52]2017DOTA2国际邀请赛中国区预选赛晋级之路
2017/07/03 DOTA
[01:04:22]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 IG vs EG
2018/04/01 DOTA
为python设置socket代理的方法
2015/01/14 Python
使用Python脚本实现批量网站存活检测遇到问题及解决方法
2016/10/11 Python
基于scrapy的redis安装和配置方法
2018/06/13 Python
Python时间和字符串转换操作实例分析
2019/03/16 Python
会计助理的岗位职责
2013/11/29 职场文书
夜班门卫岗位职责
2013/12/09 职场文书
经典洗发水广告词
2014/03/13 职场文书
校长竞聘演讲稿
2014/05/16 职场文书
工作求职自荐信
2014/06/13 职场文书
评职称个人总结
2015/03/05 职场文书
小学教师读书笔记
2015/07/01 职场文书
解决Go gorm踩过的坑
2021/04/30 Golang
Redis 操作多个数据库的配置的方法实现
2022/03/23 Redis