微信公众号:运维开发故事,作者:double冬


1 python实现在4.2版本zabbix发送带有图片的报警邮件

我们通常收到的报警,都是文字,是把动作中的消息内容当成了正文参数传给脚本,然后邮件或者微信进行接收,往往只能看到当前值,无法直观的获取到历史当天该监控项的运行曲线图,因此根据此需求,使用python编写脚本来分别对邮件告警和微信告警,进行升级,报警内容中加入了当天的历史趋势图,功夫不负有心人,已成功解锁,并实践成功,因此分享出来供大家参考,另外得非常感谢脚本编写中刚哥大神和王二基友给予的帮助

1.1 实现思路

  • 首先报警信息里第一行要有itemid,这是前提,根据信息里传入的参数使用正则匹配到itemid

  • 使用脚本创建一个zabbix会话,来根据itemid来获取图片,并将获取到的图片保存到本地

  • 将传入的参数信息的text字段转换成HTML格式,然后将HTML格式的信息和图片作为邮件进行发送

1.2 准备环境

  • 脚本是使用python脚本,运行环境为python 2.7.5

  • 依赖库:

    requests

1.3 脚本实现

[root@5804703917ad zabbix]# cd /usr/lib/zabbix/alertscripts/  #进入zabbix默认的脚本路径
[root@5804703917ad alertscripts]# mkdir graph #创建一个存放图片的文件夹
[root@5804703917ad alertscripts]# chmod 777 graph #给文件夹赋予权限
[root@5804703917ad alertscripts]# vim zabbix_email_pic.py #编写实现脚本
#!/usr/bin/python
#coding=utf-8
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
import smtplib,sys,os,time,re,requests
from smtplib import SMTPuser='Admin'    #定义zabbix用户名
password='zabbix'    #定义zabbix用户密码
graph_path='/usr/lib/zabbix/alertscripts/graph'   #定义图片存储路径
graph_url='http://192.168.73.133/chart.php'     #定义图表的url
loginurl="http://192.168.73.133/index.php"          #定义登录的url
host='192.168.73.133'
to_email=sys.argv[1]    #传入的第一个参数为收件人邮箱
subject=sys.argv[2]  #传入的第二个参数为邮件主题
subject=subject.decode('utf-8')
smtp_host = 'smtp.163.com'  #定义smtp主机地址
from_email = 'xxxx@163.com.cn'     #定义发件人地址
mail_pass = 'xxx'       #发件人邮箱校验码def get_itemid():#获取报警的itemiditemid=re.search(r'监控ID:(\d+)',sys.argv[3]).group(1)return itemiddef get_graph(itemid):#获取报警的图表并保存session=requests.Session()   #创建一个session会话try:loginheaders={"Host":host,"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"}#定义请求消息头payload = {"name":user,"password":password,"autologin":"1","enter":"Sign in",}#定义传入的datalogin=session.post(url=loginurl,headers=loginheaders,data=payload)#进行登录graph_params={"from" :"now-10m","to" : "now","itemids" : itemid,"width" : "400",}#定义获取图片的参数graph_req=session.get(url=graph_url,params=graph_params)#发送get请求获取图片数据time_tag=time.strftime("%Y%m%d%H%M%S", time.localtime())graph_name='baojing_'+time_tag+'.png'#用报警时间来作为图片名进行保存graph_name = os.path.join(graph_path, graph_name)#使用绝对路径保存图片with open(graph_name,'wb') as f:f.write(graph_req.content)#将获取到的图片数据写入到文件中去return graph_nameexcept Exception as e:print(e)return False
def text_to_html(text):#将邮件内容text字段转换成HTML格式d=text.splitlines()#将邮件内容以每行作为一个列表元素存储在列表中html_text=''for i in d:i='' + i + '<br>'html_text+=i + '\n'#为列表的每个元素后加上html的换行标签return html_textdef send_mail(graph_name):#将html和图片封装成邮件进行发送msg = MIMEMultipart('related')  #创建内嵌资源的实例with open(graph_name,'rb') as f:#读取图片文件graph=MIMEImage(f.read())  #读取图片赋值一个图片对象graph.add_header('Content-ID','imgid1')  #为图片对象添加标题字段和值text=text_to_html(sys.argv[3])html="""<html><body>%s  <br><img src="cid:imgid1"></body></html>""" % texthtml=MIMEText(html,'html','utf-8')  #创建HTML格式的邮件体msg.attach(html)   #使用attach方法将HTML添加到msg实例中msg.attach(graph)  #使用attach方法将图片添加到msg实例中msg['Subject'] = subjectmsg['From'] = from_emailtry:server=SMTP(smtp_host,"587")   #创建一个smtp对象server.starttls()    #启用安全传输模式server.login(from_email,mail_pass)  #邮箱账号登录server.sendmail(from_email,to_email,msg.as_string())  #发送邮件server.quit()   #断开smtp连接except smtplib.SMTPException as a:print(a)def run():itemid=get_itemid()graph_name=get_graph(itemid)send_mail(graph_name)if __name__ =='__main__':run()

1.4 定义报警媒介类型


  • 打开zabbix监控web,在管理菜单中选择报警媒介类型,创建媒体类型,选择脚本,填写刚才编写的邮件带图脚本名称zabbix_email_pic.py,脚本参数,最后添加

  • 打开管理中的用户,点击需要设置邮件告警的用户,然后在报警媒介中添加报警媒介,在弹框中选择刚才定义的类型,然后填写想要发送的邮箱地址,最后添加

    1.5 定义告警动作

  • 点击配置菜单中的动作,创建动作,然后根据图片进行填写

操作
默认标题 Zabbix告警:服务器:{HOSTNAME}发生: {TRIGGER.NAME}故障!
监控ID:{ITEM.ID}
告警主机:{HOST.NAME}
告警主机:{HOST.IP}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE}
事件ID:{EVENT.ID}
恢复操作
Zabbix告警:服务器:{HOST.NAME}发生: {TRIGGER.NAME}已恢复!
监控ID:{ITEM.ID}
告警主机:{HOST.NAME}
告警主机:{HOST.IP}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE}
事件ID:{EVENT.ID}



1.6 最终效果

可以手动触发一个报警测试效果

2 python实现在4.2版本zabbix发送带有图片的微信告警

2.1 实现思路

  • 首先创建企业公众号获取agentId,secret和部门id

  • 然后根据报警信息获取itemid,使用正则匹配到itemid

  • 使用脚本创建一个zabbix会话,来根据itemid来获取图片,并将获取到的图片保存到本地

  • 调用企业微信api接口,把图片当成临时素材上传,返回一个media_id,给发送消息和图片调用使用,最后使用mpnews消息类型把图片和报警内容进行推送到微信上

    2.2 准备环境

  • 脚本是使用python脚本,运行环境为python 2.7.5

  • 依赖库提前安装:

    requests

2.3 创建企业公众号获取agentid,secret

这部分内容,可以查看前面不带图的文章有详细描述

2.4 脚本实现

[root@5804703917ad zabbix]# cd /usr/lib/zabbix/alertscripts/  #进入zabbix默认的脚本路径
[root@5804703917ad alertscripts]# mkdir graph #创建一个存放图片的文件夹
[root@5804703917ad alertscripts]# chmod 777 graph #给文件夹赋予权限
[root@5804703917ad alertscripts]# vim zabbix_weixin_pic.py #编写实现脚本
#!/usr/bin/python
#coding=utf-8
_author__ = 'zhangdongdong'
import requests, json
import urllib3
import smtplib,sys,os,time,re,requests
from email.mime.image import MIMEImage
if sys.getdefaultencoding() != 'utf-8':reload(sys)sys.setdefaultencoding('utf-8')
urllib3.disable_warnings()
class WechatImage(object): # 根据企业微信api接口文档,定义一个类,使用mpnews类型,https://qydev.weixin.qq.com/wiki/index.php?title=%E6%B6%88%E6%81%AF%E7%B1%BB%E5%9E%8B%E5%8F%8A%E6%95%B0%E6%8D%AE%E6%A0%BC%E5%BC%8Fdef get_token(self, corpid, secret): # 获取tokenurl = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"data = {"corpid": corpid,"corpsecret": secret}r = requests.get(url=url, params=data, verify=False)token = r.json()['access_token']return tokendef get_image_url(self, token, path): # 上传临时素材图片,然后返回media_idurl = "https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=%s&type=image" % tokendata = {"media": open(path, 'rb')}r = requests.post(url=url, files=data)dict_data = r.json()return dict_data['media_id']def get_messages( self,subject,content,path): #定义mpnews类型中的参数字典data = ''messages = {}body = {}content_html=text_to_html(content)token = self.get_token(corpid, secret)image = self.get_image_url(token, path)content_html += "<br/> <img src='https://qyapi.weixin.qq.com/cgi-bin/media/get?access_token=%s&media_id=%s'>" % (token, image)body["title"] = subjectbody['digest'] = contentbody['content'] = content_htmlbody['thumb_media_id'] = imagedata = []data.append(body)messages['articles'] = datareturn messagesdef send_news_message(self, corpid, secret,to_user, agentid,path): #定义发送mpnews类型的数据token = self.get_token(corpid, secret)messages = self.get_messages( subject, content,path)url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s" % tokendata = {"toparty": to_user,                                 # 企业号中的用户帐号"agentid": agentid,                             # 企业号中的应用id"msgtype": "mpnews","mpnews": messages,"safe": "0"}headers = {'content-type': 'application/json'}data_dict = json.dumps(data, ensure_ascii=False).encode('utf-8')r = requests.post(url=url, headers=headers, data=data_dict)return r.text
def text_to_html(text): #将邮件内容text字段转换成HTML格式d=text.splitlines()#将邮件内容以每行作为一个列表元素存储在列表中html_text=''for i in d:i='' + i + '<br>'html_text+=i + '\n'#为列表的每个元素后加上html的换行标签return html_text
def get_itemid():#获取报警的itemiditemid=re.search(r'监控ID:(\d+)',sys.argv[3]).group(1)return itemid
def get_graph(itemid):#获取报警的图表并保存session=requests.Session()   #创建一个session会话try:loginheaders={"Host":host,"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"}#定义请求消息头payload = {"name":user,"password":password,"autologin":"1","enter":"Sign in",}#定义传入的datalogin=session.post(url=loginurl,headers=loginheaders,data=payload)#进行登录graph_params={"from" :"now-10m","to" : "now","itemids" : itemid,"width" : "290", #图片的高宽参数可以自行调整"height" : "40",}#定义获取图片的参数graph_req=session.get(url=graph_url,params=graph_params)#发送get请求获取图片数据time_tag=time.strftime("%Y%m%d%H%M%S", time.localtime())graph_name='baojing_'+time_tag+'.png'#用报警时间来作为图片名进行保存graph_name = os.path.join(graph_path, graph_name)#使用绝对路径保存图片with open(graph_name,'wb') as f:f.write(graph_req.content)#将获取到的图片数据写入到文件中去return graph_nameexcept Exception as e:print(e)return False
if __name__ == '__main__':user='Admin'    #定义zabbix用户名password='zabbix'    #定义zabbix用户i密graph_path='/usr/lib/zabbix/alertscripts/graph/'   #定义图片存储路径,图片需要定时清理graph_url='http://192.168.73.133/chart.php'     #定义图表的urlloginurl="http://192.168.73.133/index.php"          #定义登录的urlhost='192.168.73.133'itemid=get_itemid()path =get_graph(itemid)to_user = str(sys.argv[1]) subject = str(sys.argv[2]) content = str(sys.argv[3])corpid= "xxxxx"secret = "xxxxxxx"agentid = "1000002"wechat_img = WechatImage()wechat_img.send_news_message(corpid, secret,to_user, agentid, path)

2.5 定义报警媒介类型

  • 打开zabbix监控web,在管理菜单中选择报警媒介类型,创建媒体类型,选择脚本,填写刚才编写的微信带图脚本名称zabbix_weixin_pic.py,脚本参数,最后添加

  • 打开管理中的用户,点击需要设置邮件告警的用户,然后在报警媒介中添加报警媒介,在弹框中选择刚才定义的类型,然后填写企业微信中创建的部门id,最后添加

    2.6 定义告警动作

  • 点击配置菜单中的动作,创建动作,然后根据图片进行填写

操作默认标题 Zabbix告警:服务器:{HOSTNAME}发生: {TRIGGER.NAME}故障!监控ID:{ITEM.ID}告警主机:{HOST.NAME}告警主机:{HOST.IP}告警时间:{EVENT.DATE} {EVENT.TIME}告警等级:{TRIGGER.SEVERITY}告警信息: {TRIGGER.NAME}告警项目:{TRIGGER.KEY}问题详情:{ITEM.NAME}:{ITEM.VALUE}当前状态:{TRIGGER.STATUS}:{ITEM.VALUE}事件ID:{EVENT.ID}恢复操作Zabbix告警:服务器:{HOST.NAME}发生: {TRIGGER.NAME}已恢复!监控ID:{ITEM.ID}告警主机:{HOST.NAME}告警主机:{HOST.IP}告警时间:{EVENT.DATE} {EVENT.TIME}告警等级:{TRIGGER.SEVERITY}告警信息: {TRIGGER.NAME}告警项目:{TRIGGER.KEY}问题详情:{ITEM.NAME}:{ITEM.VALUE}当前状态:{TRIGGER.STATUS}:{ITEM.VALUE}事件ID:{EVENT.ID}



2.7 测试效果

可以手动触发一个报警测试效果,手机上就可以收到带图的报警了,点击消息之后的页面也可以看到历史的图片

在zabbix中实现发送带有图片的邮件和微信告警相关推荐

  1. python发送邮件带附件_在python中如何发送带有附件的邮件?

    在发邮件时,如果需要发文件,我们会与电子邮件附在一起传送至对方邮箱.用来附加说明或者提供材料用的电子表格 网页.数据库等等是不能简单用文本形式的邮件来发送的,而且表格.网页.数据库等在邮件服务商提供的 ...

  2. Spring boot锦集(二):整合邮件发送的四种方法 | 纯文本的邮件、带有图片的邮件、带Html的邮件、带附件的邮件(很详细)

    前言 邮件发送,听着很神秘,然而对于Spring Boot来说,这个功能已被集成好,只需引入spring-boot-starter-mail依赖后,少量代码即可实现大部分邮件发送需求. 本文以异常教程 ...

  3. SpringBoot发送邮件(二)发送包含图片的邮件

    前言:使用发邮件这个功能不难,但是也有一些坑,下面我把开发邮件功能总结了一下分享给大家,同时为了避免篇幅过长,导致大家看的不仔细或看一半不想看了,我将这个功能细分了一下,写了好几篇供大家各取所需. S ...

  4. java 邮件 附件_java中javamail发送带附件的邮件实现方法

    本文实例讲述了java中javamail发送带附件的邮件实现方法.分享给大家供大家参考.具体分析如下: JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理em ...

  5. MailBee.NET Objects发送电子邮件(SMTP)教程六:创建并发送带有附件的邮件

    2019独角兽企业重金招聘Python工程师标准>>> MailBee.NET Objects是一款为创建.发送.接收以及处理电子邮件而设计的健壮.功能丰富的.NET控件.几行代码便 ...

  6. python 实现使用163邮箱发送有图片的邮件

    周末温习下python,正好最近在做监控,想着 给163邮箱发邮件,记录下来,方便备查. 邮件发送必须要知道邮件的 传输协议 SMTP SMTP (Simple Mail Transfer Proct ...

  7. zabbix部署、设置邮件和微信告警

    1. Zabbix简介 Zabbix 是一个企业级分布式开源监控解决方案. Zabbix 软件能够监控众多网络参数和服务器的健康度.完整性.Zabbix 使用灵活的告警机制,允许用户为几乎任何事件配置 ...

  8. .NET(C#):使用SmtpClient发送带有图片和附件的电子邮件

    第一次使用这种方式发邮件呵呵,就比如拿我的Live邮箱往QQ邮箱上发一封邮件. 使用SmtpClient发送邮件的步骤就不讲了,在网上你可以找到太多的资料了,这里说一些需要注意的地方: 如果邮件的内容 ...

  9. java发送带图片的邮件代码

    图片目录: 实现代码: /*** 发送带附件的mail** @param subject 邮件标题* @param to 收件人列表* @param cc 抄送人列表* @param bodyText ...

最新文章

  1. Ubuntu 系统 下 AndroidStudio 工具 使用ctrl+z 回退上一步的方法
  2. 爬虫训练之--获取错误并将其保存进本地文件
  3. python序列类型有_Python序列类型
  4. 写的很好!细数 Java 线程池的原理
  5. 数据结构相关C语言代码
  6. Charles学习(四)之使用Map local代理本地静态资源以及配置移动端代理在真机上调试iOS和Android客户端...
  7. boost::fusion::all用法的测试程序
  8. asp.netkg117《计算机网络》教学网站的设计与实现,《计算机网络》教学网站的设计与实现 毕业论文.doc...
  9. SQLServer当数据导入平面文件
  10. LeetCode 1220. 统计元音字母序列的数目(DP)
  11. python echo off_生活中的python-随机分配单词输出至word
  12. 公司组织框架以及人员信息同步到钉钉相关解决方案
  13. 【机器学习】Andrew Ng——02单变量线性回归
  14. 常用php操作redis命令整理(五)ZSET类型
  15. 计算机网络基础学ppt,计算机网络基础学习情景.ppt
  16. 中兴B860 AV2.1 S905L刷入armbian并启用docker且使用Portainer汉化版控制面板
  17. 业务系统需要不同浏览器打开解决方式
  18. 异常值检验的一些方法
  19. css之3D旋转讲解
  20. 编译原理 最新版 (龙书) 简介and sources

热门文章

  1. 【总结整理】读《结网》有感 ---腾讯系
  2. android 图片凸出
  3. Ubuntu上Firefox字体太小--高分屏背锅
  4. 如何对一个杯子进行检测
  5. FOURCC四字符码对照表
  6. Java+Rest-Assrued+Gradle+Allure搭建接口测试自动化框架
  7. 教你如何寻找更多的外链
  8. python模块subprocess学习
  9. 全球与中国市场聚乙烯醇缩丁醛(PVB)树脂发展规模分析与前景战略研究报告2022年版
  10. 对应届毕业生参加面试的一些建议