一、环境:
系统: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}
四、最终结果