版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiegh2014/article/details/79604822
发送邮件的脚本
#!/usr/bin/python
#coding:utf-8
import smtplib, time, os
from email.mime.text import MIMEText
from email.header import Header
def send_mail_html(file):
'''发送html内容邮件'''
# 发送邮箱
#sender = '[email protected]'
sender = ("%s<[email protected]>")%(Header('Zabbix监控系统告警!','utf-8'),)
# 接收邮箱
receiver = '[email protected]'
# 发送邮件主题
t = time.strftime("%Y年%m月%d日", time.localtime())
subject = t +'zabbix监控报表!'
# 发送邮箱服务器
smtpserver = 'smtp.163.com'
# 发送邮箱用户/密码
username = 'l10880347'
password = '你的授权码'
# 读取html文件内容
f = open(file, 'rb')
mail_body = f.read()
f.close()
# 组装邮件内容和标题,中文需参数‘utf-8’,单字节字符不需要
msg = MIMEText(mail_body, _subtype='html', _charset='utf-8')
msg['Subject'] = Header(subject, 'utf-8')
msg['From'] = sender
msg['To'] = receiver
# 登录并发送邮件
try:
smtp = smtplib.SMTP()
smtp.connect(smtpserver)
smtp.login(username, password)
smtp.sendmail(sender, receiver, msg.as_string())
except:
print("邮件发送失败!")
else:
print("邮件发送成功!")
finally:
smtp.quit()
def find_new_file(dir):
'''查找目录下最新的文件'''
file_lists = os.listdir(dir)
file_lists.sort(key=lambda fn: os.path.getmtime(dir + "/" + fn)
if not os.path.isdir(dir + "/" + fn)
else 0)
# print('最新的文件为: ' + file_lists[-1])
file = os.path.join(dir, file_lists[-1])
print('/usr/lib/zabbix/repostscripts/html/:', file)
return file
dir = '/usr/lib/zabbix/repostscripts/html/' # 指定文件目录
file = find_new_file(dir) # 查找最新的html文件
send_mail_html(file) # 发送html内容邮件
html的文件内容
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>zabbix监控告警</title>
</head>
<body>
<table width="900" border="0">
<tr>
<td colspan="2" style="background-color:#FFA500;">
<h4>告警级别: 1 表示:信息 2 表示:告警 3 表示:一般严重 4 表示:严重 5 表示:灾难</h4>
</td>
</tr>
<tr>
<td style="background-color:#FFD700;width:100px;">
<TABLE BORDER=1><TR><TH>主机</TH><TH>触发器</TH><TH>告警级别</TH><TH>告警次数</TH></TR><TR><TD>Zabbix server</TD><TD>{HOST.NAME} has just been restarted</TD><TD>1</TD><TD>14</TD></TR><TR><TD>Zabbix server</TD><TD>Zabbix unreachable poller processes more than 75% busy</TD><TD>3</TD><TD>10</TD></TR><TR><TD>Zabbix server</TD><TD>Disk I/O is overloaded on {HOST.NAME}</TD><TD>2</TD><TD>8</TD></TR><TR><TD>Zabbix server</TD><TD>Zabbix agent on {HOST.NAME} is unreachable for 5 minutes</TD><TD>3</TD><TD>5</TD></TR><TR><TD>Zabbix server</TD><TD>Zabbix preprocessing worker processes more than 75% busy</TD><TD>3</TD><TD>4</TD></TR><TR><TD>Zabbix server</TD><TD>Zabbix trapper processes more than 75% busy</TD><TD>3</TD><TD>4</TD></TR><TR><TD>Zabbix server</TD><TD>Zabbix alerter processes more than 75% busy</TD><TD>3</TD><TD>2</TD></TR><TR><TD>Zabbix server</TD><TD>Zabbix proxy poller processes more than 75% busy</TD><TD>3</TD><TD>2</TD></TR><TR><TD>Zabbix server</TD><TD>Zabbix preprocessing manager processes more than 75% busy</TD><TD>3</TD><TD>2</TD></TR><TR><TD>devops-docker-node50</TD><TD>Zabbix agent on {HOST.NAME} is unreachable for 5 minutes</TD><TD>3</TD><TD>2</TD></TR><TR><TD>Zabbix server</TD><TD>Zabbix poller processes more than 75% busy</TD><TD>3</TD><TD>2</TD></TR><TR><TD>Zabbix server</TD><TD>Zabbix alert manager processes more than 75% busy</TD><TD>3</TD><TD>2</TD></TR></TABLE>
</td>
</tr>
<tr>
<td colspan="2" style="background-color:#FFA500;text-align:center;">
zabbix告警统计</td>
</tr>
</table>
</body>
</html>
<html>
<style> .title{font-weight:bold;font-size:18px;}</style>
<body>
<p>
<img src="">
<br><br>
<span
class="title">运维日报</span>
<br><br>
各项监控指标如下:
<br>
目前添加监控主机为:101 台
<br>
基础监控告警为:10次
<br>
中间监控告警为:11次
<br>
数据库监控告警为:5次
<br>
业务监控告警为:3次
<br><br>
<span class="title">运行情况</span>
<br><br>
CPU最小闲置10% 5台服务器
<br>
内存使用率大于10% 20台服务器
<br>
磁盘使用率超过80% 40台服务器
<br><br>
<span class="title">运维监控日报统计</span>
<br><br>
</p>
</body>
</html>
生成XLSX脚本
#!/usr/bin/python
# coding:utf-8
import xlsxwriter
# 创建一个Excel文件
workbook = xlsxwriter.Workbook('zabbix.xlsx')
# 创建一个工作表sheet对象,使用默认名称:"Sheet1"
worksheet = workbook.add_worksheet("repost")
# 创建一个图表对象
chart = workbook.add_chart({'type':'column'})
# 定义数据表头
title = [u'告警级别',u'星期一',u'星期二',u'星期三',u'星期四',u'星期五',u'星期六',u'星期日',u'平均告警次数']
# 定义业务名称列表
buname = [u'信息',u'一般严重',u'非常严重',u'严重',u'灾难']
# 定义5个频道一周七天的数据列表
data = [
[1,2,5,9,1,1,8],
[2,8,9,9,8,0,9],
[5,2,8,1,7,8,5],
[1,5,8,8,4,0,9],
[0,5,8,6,3,8,4]
]
# 定义数据formatter格式对象,设置边框加粗1像素
formatter = workbook.add_format()
formatter.set_border(1)
# 定义标题栏格式对象:边框加粗1像素,背景色为灰色,单元格内容居中、加粗
title_formatter = workbook.add_format()
title_formatter.set_border(1)
title_formatter.set_bg_color('#cccccc')
title_formatter.set_align('center')
title_formatter.set_bold()
# 定义平均值栏数据格式对象:边框加粗1像素,数字按2位小数显示
ave_formatter = workbook.add_format()
ave_formatter.set_border(1)
ave_formatter.set_num_format('0.00')
# 定义图表数据系列函数
def chart_series(cur_row):
chart.add_series({
'categories':'=repost!$B$1:$H$1',
'values':'=repost!$B${}:$H${}'.format(cur_row,cur_row),
'line':{'color':'black'},
'name':'=repost!$A${}'.format(cur_row)
})
# 注:其中categories表示x轴,values表示y轴,line表示线条样式,name表示图例项
# 下面分别以行和列的方式将标题栏、业务名称、流量数据写入单元格,并引用不同的格式对象
worksheet.write_row('A1',title,title_formatter)
worksheet.write_column('A2',buname,formatter)
# 写入第2到第6行的数据,并将第2~6行数据加入图表系列
for i in range(2,7):
worksheet.write_row('B{}'.format(i),data[i-2],formatter)
# 计算平均流量栏数据并写入
worksheet.write_formula('I{}'.format(i),'=AVERAGE(B{}:H{})'.format(i,i),ave_formatter)
# 将每一行数据加入图表序列
chart_series(str(i))
# 设置图表大小
chart.set_size({'width':577,'height':287})
# 设置图表大标题
chart.set_title({'name':u'zabbix监控告警周报表'})
# 设置y轴小标题
chart.set_y_axis({'name':''})
# 在A8单元格插入图表
worksheet.insert_chart('A8',chart)
# 关闭Excel文档
workbook.close()
使用Grafana实现监控告警报表可视化