zabbix 5.0 邮件钉钉发送带告警图
zabbix访问监控图形
# http://zabbix.xxx/chart.php?itemids[0]=44314
代码如下:
#!/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 SMTP user="Admin" #定义zabbix用户名 password='zabbixmima' #定义zabbix用户密码graph_path='/usr/lib/zabbix/alertscripts/graph' #定义图片存储路径 graph_url='http://localhost/chart.php' #定义图表的url loginurl="http://localhost/index.php" #定义登录的url host='localhost' to_email=sys.argv[1] #传入的第一个参数为收件人邮箱 subject=sys.argv[2] #传入的第二个参数为邮件主题 #subject=subject.decode('utf-8') smtp_host = 'smtp.xxx.com' #定义smtp主机地址 from_email = 'monitor@xxx.com' #定义发件人地址 mail_pass = '邮箱密码' #发件人邮箱校验码 def get_itemid(): #获取报警的itemid itemid = re.search(r'ITEMID:(\d+)',sys.argv[3]).group(1) #print(itmeid) 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", } #定义传入的data login=session.post(url=loginurl,headers=loginheaders,data=payload) #进行登录 graph_params={ "from" :"now-10m", "to" : "now", "itemids[0]" : itemid, #zabbix5.0 此处是php7版本以上,代码有所改动,需要写成列表获取,其他版本itemids即可 "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_name except 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_text def 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> """ % text html=MIMEText(html,'html','utf-8') #创建HTML格式的邮件体 msg.attach(html) #使用attach方法将HTML添加到msg实例中 msg.attach(graph) #使用attach方法将图片添加到msg实例中 msg['Subject'] = subject msg['From'] = from_email try: server=SMTP(smtp_host,"25") #创建一个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()
钉钉代码:
#!/usr/bin/python # -*- coding: utf-8 -*- import requests,time import json,sys,re,os user="Admin" #定义zabbix用户名 password='admin' #定义zabbix用户密码 zabbixserver_url ='http://localhost/index.php' #定义远端的web服务器地址,将图片复制到远端的web目录下,让zabbix主机可以访问这个图片 pname_path='http://localhost/dingding_pic/' #定义获取的图片地址 graph_url = "http://localhost/chart.php" host='zabbixhost' def get_itemid(): itemid=re.search(r'ITEMID:(\d+)',sys.argv[1]).group(1) return itemid def get_picture(itemid,pname): 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" } # 构建登录所需的信息 playLoad = { "name": user, "password": password, "autologin": "1", "enter": "Sign in", } session.post(url=zabbixserver_url, headers=loginHeaders, data=playLoad) playLoad = { "from": "now-1h", "to": "now", "itemids[0]": itemid, "width": "700", } #定义获取图片的参数 graph_req = session.get(url=graph_url,params=playLoad) IMAGEPATH = os.path.join('/usr/lib/zabbix/alertscripts/dingding_pic/', pname) #将获取到的图片数据写入到文件中去 with open(IMAGEPATH,'wb') as f: f.write(graph_req.content) pname_url = pname_path+pname return pname_url except Exception as e: print(e) return False #构造发送消息的请求 def send_msg(pname_url,title,result_message): headers = {'Content-Type': 'application/json;charset=utf-8'} print(result_message) data = { "msgtype": "markdown", "markdown": { #"title": title, "text": result_message+"![screenshot](%s)"%(pname_url) }, "at":{ "atMobiles": reminders, "isAtAll": False, }, } r = requests.post(url=webhook_url,json=data,headers=headers) print(r.text) #对报警信息进行格式化 def info_text(message): new_text = "" x = message.split('\n') for i in x: if re.search('ITEM ID',str(i)): pass else: new_text+="- "+str(i)+('\n') print(type(new_text)) return new_text if __name__ == '__main__': #将报警信息写入日志 #os.system("echo hello >> /tmp/syslog.md") pname = str(int(time.time()))+'.png' #title = str(sys.argv[2]) message = str(sys.argv[1]) result_message = info_text(message) # with open('/tmp/syslog.md','a') as f: # f.write(title) # f.write(message) # f.close() reminders = [] webhook_url = 'https://localhost/robot/send?access_token=********************' #钉钉机器人 itemid = get_itemid() pname_url=get_picture(itemid,pname) print(pname_url) send_msg(pname_url,title,result_message)
代码中需要获取zabbix 监控项id即itemids,此处需要在消息中自定义,如下:
告警主机:{HOST.NAME}
告警地址:{HOST.IP}
ITEMID:{ITEM.ID}
监控项目:{ITEM.NAME}
监控取值:{ITEM.LASTVALUE}
告警等级:{TRIGGER.SEVERITY}
当前状态:{TRIGGER.STATUS}
告警信息:{TRIGGER.NAME}
告警时间:{EVENT.DATE} {EVENT.TIME}
事件ID:{EVENT.ID}