相思资源网 Design By www.200059.com
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 = ``'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数据并发邮件脚本,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
相思资源网 Design By www.200059.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
相思资源网 Design By www.200059.com
暂无Python自动化导出zabbix数据并发邮件脚本的评论...
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。