zabbix5利用python脚本发报警邮件和趋势图

一、环境:

系统:centos8

zabbix版本:5.4

python版本:3.6.8

依赖库:request

二、脚本

1)脚本放在默认脚本路径:/usr/lib/zabbix/alertscripts

2)创建个图片存放的目录

mkdir -p /usr/lib/zabbix/alertscripts

chown -R zabbix:zabbix /usr/lib/zabbix/alertscripts

vi /usr/lib/zabbix/alertscripts/zabbix_email_pic.py

chmod +x /usr/lib/zabbix/alertscripts/zabbix_email_pic.py

chown zabbix:zabbix /usr/lib/zabbix/alertscripts/zabbix_email_pic.py

3)脚本如下:

  1 #!/usr/bin/python
  2 #coding=utf-8
  3 from email.mime.text import MIMEText
  4 from email.mime.multipart import MIMEMultipart
  5 from email.mime.image import MIMEImage
  6 import smtplib,sys,os,time,re,requests
  7 
  8 user='Admin'
  9 password='zabbix'
 10 graph_path='/usr/lib/zabbix/alertscripts/graph'
 11 graph_url='http://192.168.0.1/chart.php'
 12 loginurl="http://192.168.0.1/index.php"
 13 host='192.168.0.1'
 14 to_email=sys.argv[1]
 15 subject=sys.argv[2]
 16 mail_host = 'smtp.163.com'
 17 mail_user = '123456@163.com'
 18 from_mail = '123456@163.com'
 19 mail_pass = '123456'
 20 mail_postfix = '163.com'
 21 
 22 def get_itemid():
 23     #获取报警的itemid
 24     itemid=re.search(r'监控ID:(d+)',sys.argv[3]).group(1)
 25     return itemid
 26 
 27 def get_graph(itemid):
 28     #获取报警的图表并保存
 29     session=requests.Session()   #创建一个session会话
 30     try:
 31         loginheaders={
 32         "Host":host,
 33         "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
 34         }
 35         #定义请求消息头
 36 
 37         payload = {
 38         "name":user,
 39         "password":password,
 40         "autologin":"1",
 41         "enter":"Sign in",
 42         }
 43         #定义传入的data
 44         login=session.post(url=loginurl,headers=loginheaders,data=payload)
 45         #进行登录
 46         graph_params={
 47             "itemids[0]":itemid,
 48             "from":"now-10m",
 49             "to":"now",
 50             "width": "400",
 51             "height":"200",
 52             }
 53         #定义获取图片的参数
 54         graph_req=session.get(url=graph_url,params=graph_params)
 55         #发送get请求获取图片数据
 56         time_tag=time.strftime("%Y%m%d%H%M%S", time.localtime())
 57         graph_name='baojing_'+time_tag+'.png'
 58         #用报警时间来作为图片名进行保存
 59         graph_name = os.path.join(graph_path, graph_name)
 60         #使用绝对路径保存图片
 61         with open(graph_name,'wb') as f:
 62             f.write(graph_req.content)
 63             #将获取到的图片数据写入到文件中去
 64         return graph_name
 65 
 66     except Exception as e:
 67         print(e)
 68         return False
 69 def text_to_html(text):
 70     #将邮件内容text字段转换成HTML格式
 71     d=text.splitlines()
 72     #将邮件内容以每行作为一个列表元素存储在列表中
 73     html_text=''
 74     for i in d:
 75         i='' + i + '<br>'
 76         html_text+=i + '
'
 77     #为列表的每个元素后加上html的换行标签
 78     return html_text
 79 
 80 def send_mail(graph_name):
 81     # 将html和图片封装成邮件进行发送
 82     msg = MIMEMultipart('related')  # 创建内嵌资源的实例
 83     with open(graph_name, 'rb') as f:
 84         graph = MIMEImage(f.read(),_subtype="png")
 85     graph.add_header('Content-ID', 'imgid1')  # 为图片对象添加标题字段和值
 86     text = text_to_html(sys.argv[3])
 87     html = """
 88     <html>
 89         <body>
 90         %s  <br><img src="cid:imgid1">
 91         </body>
 92     </html>
 93     """ % text
 94     html = MIMEText(html, 'html', 'utf-8')  # 创建HTML格式的邮件体
 95     msg.attach(html)  # 使用attach方法将HTML添加到msg实例中
 96     msg.attach(graph)  # 使用attach方法将图片添加到msg实例中
 97 
 98     msg['Subject'] = subject
 99     msg['From'] = from_mail
100     msg['to'] = to_email
101     try:
102         s = smtplib.SMTP()
103         s.connect(mail_host)
104         s.login(mail_user, mail_pass)
105         s.sendmail(from_mail, to_email, msg.as_string())
106         s.close()
107         return True
108     except Exception as e:
109         print('Exception', e)
110         return False
111 
112 def run():
113     itemid=get_itemid()
114     graph_name=get_graph(itemid)
115     send_mail(graph_name)
116 
117 if __name__ =='__main__':
118     run()

三、zabbix服务端配置

1、定义报警媒介类型

1)名称,自己定义,这边定义zabbix_mail_pic

2)类型,选择脚本

3)脚本名称,zabbix_email_pic.py

4)脚本参数:

{ALERT.SENDTO}

{ALERT.SUBJECT}

{ALERT.MESSAGE}

 2)用户添加报警媒介

类型选择zabbix_mail_pic

 3)定义告警动作

主题: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}

 四、最终结果

原文地址:https://www.cnblogs.com/guantou1992/p/14850657.html