[ python3 ] 基于zabbix 自动生成xlsx监控文档
准备做一个每周自动的巡检报告,数据来源于zabbix,通过python读取zabbix数据库获取数据并制作成excel表格,
本来打算直接邮件发送到指定邮箱,但是都被SMTP过滤掉了,试过126和QQ的,其他的不知道。
操作系统:Cenos 6.7
python版本: python3.5
以下代码是亲测并生产环境使用的:
#!/usr/local/python/bin/python3.5
import pymysql
import time, datetime
import smtplib
import os
from email.mime.text import MIMEText
from email.header import Header
# zabbix数据库信息 zdbhost = 'zabbix服务器ip'
zdbuser = 'zabbix数据库用户名'
zdbpass = 'zabbix数据库密码'
zdbport = 3306
zdbname = 'zabbix' d = datetime.datetime.now()
day = datetime.date.today()
keys = {
'trends_uint': [
'net.if.in[eth0]',
'net.if.out[eth0]',
'vfs.fs.size[/,used]',
'vm.memory.size[available]',
],
'trends': [
'system.cpu.load[percpu,avg5]',
'system.cpu.util[,idle]',
],
}
class ReportForm: def __init__(self):
self.conn = pymysql.connect(host=zdbhost, user=zdbuser, passwd=zdbpass, port=zdbport, db=zdbname)
self.cursor = self.conn.cursor()
self.groupname = 'Linux servers'
self.IpInfoList = self.__getHostList()
# return self.IpInfoList def __getHostList(self):
sql = '''select groupid from groups where name = '%s' ''' % self.groupname
self.cursor.execute(sql)
groupid = self.cursor.fetchone()[0]
print(groupid) sql = '''select hostid from hosts_groups where groupid = %s''' % groupid
self.cursor.execute(sql)
hostlist = self.cursor.fetchall() IpInfoList = {}
for i in hostlist:
hostid = i[0]
sql = '''select host from hosts where status = 0 and hostid = %s''' % hostid
ret = self.cursor.execute(sql)
if ret:
IpInfoList[self.cursor.fetchone()[0]] = {'hostid': hostid}
return IpInfoList def __getItemid(self, hostid, itemname):
sql = '''select itemid from items where hostid = %s and key_ = '%s' ''' % (hostid, itemname)
if self.cursor.execute(sql):
itemid = self.cursor.fetchone()[0]
else:
itemid = None
return itemid def getTrendsValue(self, itemid, start_time, stop_time):
resultlist = {}
for type in ['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()[0]
if result == None:
result = 0
resultlist[type] = result
return resultlist def getTrends_uintValue(self, itemid, start_time, stop_time):
resultlist = {}
for type in ['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()[0]
if result:
resultlist[type] = int(result)
else:
resultlist[type] = 0
return resultlist def get_week(self, d):
dayscount = datetime.timedelta(days=d.isoweekday())
dayto = d - dayscount
sixdays = datetime.timedelta(days=6)
dayfrom = dayto - sixdays
date_from = datetime.datetime(dayfrom.year, dayfrom.month, dayfrom.day, 0, 0, 0)
date_to = datetime.datetime(dayto.year, dayto.month, dayto.day, 23, 59, 59)
ts_first = int(time.mktime(datetime.datetime(dayfrom.year, dayfrom.month, dayfrom.day, 0, 0, 0).timetuple()))
ts_last = int(time.mktime(datetime.datetime(dayto.year, dayto.month, dayto.day, 23, 59, 59).timetuple()))
return ts_first, ts_last def getLastMonthData(self, hostid, table, itemname):
ts_first = self.get_week(d)[0]
ts_last = self.get_week(d)[1]
itemid = self.__getItemid(hostid, itemname)
# function = getattr(self, 'get %s Value' % table.capitalize())
function = getattr(self, 'get%sValue' % table.capitalize())
return function(itemid, ts_first, ts_last) def getinfo(self):
for ip, resultdict in zabbix.IpInfoList.items():
print("正在查询 IP:%-15s hostid:%5d 的信息!" % (ip, resultdict['hostid']))
for table, keylists in keys.items():
for key in keylists:
print("\t正在统计 key_:%s" % key)
data = zabbix.getLastMonthData(resultdict['hostid'], table, key)
zabbix.IpInfoList[ip][key] = data def writeToXls(self):
dayscount = datetime.timedelta(days=d.isoweekday())
dayto = d - dayscount
sixdays = datetime.timedelta(days=6)
dayfrom = dayto - sixdays
date_from = datetime.date(dayfrom.year, dayfrom.month, dayfrom.day)
date_to = datetime.date(dayto.year, dayto.month, dayto.day)
'''生成xls文件'''
try:
import xlsxwriter
# 创建文件
workbook = xlsxwriter.Workbook('/usr/monitor/week/%s_%s巡检报告.xlsx' % (date_from, date_to))
# 创建工作薄
worksheet = workbook.add_worksheet()
# 写入标题(第一行)
i = 0
for value in ["主机", "CPU平均空闲值", "CPU最小空闲值", "可用平均内存(单位M)", "可用最小内存(单位M)", "CPU5分钟负载", "进入最大流量(单位Kbps)",
"进入平均流量(单位Kbps)", "出去最大流量(单位Kbps)", "出去平均流量(单位Kbps)"]:
worksheet.write(0, i, value)
i = i + 1
# 写入内容:
j = 1
for ip, value in self.IpInfoList.items():
worksheet.write(j, 0, ip)
worksheet.write(j, 1, '%.2f' % value['system.cpu.util[,idle]']['avg'])
worksheet.write(j, 2, '%.2f' % value['system.cpu.util[,idle]']['min'])
worksheet.write(j, 3, '%dM' % int(value['vm.memory.size[available]']['avg'] / 1024 / 1024))
worksheet.write(j, 4, '%dM' % int(value['vm.memory.size[available]']['min'] / 1024 / 1024))
worksheet.write(j, 5, '%.2f' % value['system.cpu.load[percpu,avg5]']['avg'])
worksheet.write(j, 6, value['net.if.in[eth0]']['max'] / 1000)
worksheet.write(j, 7, value['net.if.in[eth0]']['avg'] / 1000)
worksheet.write(j, 8, value['net.if.out[eth0]']['max'] / 1000)
worksheet.write(j, 9, value['net.if.out[eth0]']['avg'] / 1000)
j = j + 1
workbook.close()
except Exception as e:
print(e)
def __del__(self):
'''关闭数据库连接'''
self.cursor.close()
self.conn.close() def sendmail(self):
sender = '发送者邮箱'
receiver = ['接收者1', '接收者2', '接收者3']
subject = '上周巡检报告'
smtpserver = 'smtp.126.com'
username = '发送者邮箱'
password = 'smtp认证密码' msg = MIMEText('上周巡检报告已生成,请检查。\n报告目录:/usr/monitor\n由于邮件无法发送excel文档,请使用ftp登录'
'查看。\nftp地址:xxx:端口\nftp用户名:xxx\n', 'plain', 'utf-8') # 中文需参数‘utf-8',单字节字符不需要
msg['Subject'] = Header(subject, 'utf-8')
msg['From'] = 'Robot<发送者邮箱>'
msg['To'] = "接收者名字"
smtp = smtplib.SMTP()
smtp.connect('smtp.126.com')
smtp.login(username, password)
smtp.sendmail(sender, receiver, msg.as_string())
print('发送成功!')
smtp.quit() if __name__ == "__main__":
zabbix = ReportForm()
zabbix.getinfo()
zabbix.writeToXls()
zabbix.sendmail()
说明: 由于邮件无法发送附件为excel,所以我这里写了一个发送通知邮件的方法,需要通过ftp登录并下载。
附上生成execl部分截图:
aaarticlea/png;base64,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" alt="" />
[ python3 ] 基于zabbix 自动生成xlsx监控文档的更多相关文章
- 使用jsdoc-toolkit来自动生成js api文档
近来前端组小盆友开发的类库越来越多,很多情况下彼此不知道写了些什么方法,为了更好的合作提高工作效率,找了个比较好的api文档生成方法.使用jsdoc-toolkit来自动生成js api文档. 一. ...
- Go学习笔记(六) | 使用swaggo自动生成Restful API文档(转)
关于Swaggo 或许你使用过Swagger, 而 swaggo就是代替了你手动编写yaml的部分.只要通过一个命令就可以将注释转换成文档,这让我们可以更加专注于代码. 目前swaggo主要实现了sw ...
- Golang使用swaggo自动生成Restful API文档
#关于Swaggo 相信很多程序猿和我一样不喜欢写API文档.写代码多舒服,写文档不仅要花费大量的时间,有时候还不能做到面面具全.但API文档是必不可少的,相信其重要性就不用我说了,一份含糊的文档甚至 ...
- Spring Boot学习笔记 - 整合Swagger2自动生成RESTful API文档
1.添加Swagger2依赖 在pom.xml中加入Swagger2的依赖 <!--swagger2--> <dependency> <groupId>io.spr ...
- C# 自动生成代码API文档
暂时没学会正规的转载style临时记录一下 NET中的规范标准注释(一) -- XML注释标签讲解 http://www.cnblogs.com/mq0036/p/3544264.html NET中的 ...
- 插件式WebApi服务及自动生成Api帮助文档
上一篇博客中,讲到了将WebApi Host到控制台和IIS,本篇总结一下如何将WebApi的Service以插件的形式进行动态部署,并设置Hoster的首页显示Api帮助文档,当然,也包括动态部署进 ...
- Spring MVC学习总结(9)——Spring MVC整合swagger自动生成api接口文档
Swagger 号称:世界最流行的API框架,官网:http://swagger.io/,Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总 ...
- MFC:“Debug Assertion Failed!” ——自动生成的单文档程序项目编译运行就有错误
今天照着孙鑫老师的VC++教程学习文件的操作,VS2010,单文档应用程序,项目文件命名为File,也就有了自动生成的CFileDoc.CFileView等类,一进去就编译运行(就是最初自动生成的项目 ...
- 利用ShowDoc自动生成api接口文档
最近在做新项目,感觉写完一个接口 还要去再写一遍api文档 挺浪费时间的,所以借用ShowDoc的api开放功能 自动生成api文档. 首先 去 https://www.showdoc.cc/ 注册一 ...
随机推荐
- Week9 Teamework from Z.XML-Scenario testing
关于场景测试 About Scenario testing 一.关于用户(About Personas) 1 我们如何预期我们的用户对我们的软件的使用 (How do we expect diff ...
- lintcode-63-搜索旋转排序数组 II
63-搜索旋转排序数组 II 跟进"搜索旋转排序数组",假如有重复元素又将如何? 是否会影响运行时间复杂度? 如何影响? 为何会影响? 写出一个函数判断给定的目标值是否出现在数组中 ...
- 在es中用scroll查询与completableFuture
一般而言,es返回数据的上限是10000条,如果超过这个数量,就必须使用scroll查询. 所谓scroll查询就类似DBMS中的游标,或者快照吧,利用查询条件,在第一次查询时,在所有的结果上形成了一 ...
- 变量可以通过into赋值
- filebeat + logstash + elasticsearch + granfa
filebeat + logstash + elasticsearch + granfa https://www.cnblogs.com/wenchengxiaopenyou/p/9034213.ht ...
- 【bzoj3997】[TJOI2015]组合数学 Dilworth定理结论题+dp
题目描述 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走.问至少走多少次才能将财宝捡完.此对此问题变形,假设每个格子中有好多财宝,而每一次经过一个格子至多只能捡走一块财宝,至少走 ...
- BZOJ4602: [Sdoi2016]齿轮 DFS 逆元
这道题就是一个DFS,有一篇奶牛题几乎一样.但是这道题卡精度. 这道题网上的另一篇题解是有问题的.取对数这种方法可以被轻松卡.比如1e18 与 (1e9-1)*(1e9+1)取对数根本无法保证不被卡精 ...
- [HAOI2007]理想的正方形 st表 || 单调队列
~~~题面~~~ 题解: 因为数据范围不大,而且题目要求的是正方形,所以这道题有2种解法. 1,st表. 这种解法暴力好写好理解,但是较慢.我们设st[i][j][k]表示以(i, j)为左端点,向下 ...
- [codeforces] 633C Spy Syndrome 2
原题 Trie树+dp 首先,我们可以简单的想到一种dp方式,就是如果这一段可以匹配并且可以与前一段接上,那么更新dp[i]为当前字符串的编号,然后倒推就可以得到答案. 但是,显然我们不能O(m)比较 ...
- BZOJ1607 [Usaco2008 Dec]Patting Heads 轻拍牛头 【筛法】
题目 今天是贝茜的生日,为了庆祝自己的生日,贝茜邀你来玩一个游戏. 贝茜让N(1≤N≤100000)头奶牛坐成一个圈.除了1号与N号奶牛外,i号奶牛与i-l号和i+l号奶牛相邻.N号奶牛与1号奶牛相邻 ...