ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-08-15 22:39:56  阅读:389  来源: 互联网

标签:发邮件 hostid Python self trends zabbix uint avg size


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

[外链图片转存中…(img-YujWHCbu-1565876650802)]

下面是脚本,可根据自己的具体情况修改:

`#!/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学习扣qun:784758214,看看前辈们是如何学习的!交流经验!自己是一名高级python开发工程师,从基础的python脚本到web开发、爬虫、django、数据挖掘等,零基础到项目实战的资料都有整理。送给每一位python的小伙伴!分享一些学习的方法和需要注意的小细节,点击加入我们的 python学习者聚集地

标签:发邮件,hostid,Python,self,trends,zabbix,uint,avg,size
来源: https://blog.csdn.net/wcg541/article/details/99657082

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有