zabbix报警-邮件-钉钉
安装zabbix的时候已经配置了zabbix_server的脚本目录
AlertScriptsPath=/opt/app/zabbix/script
所以把邮件、钉钉、微信相关的脚本都放在/opt/zabbix/script目录下
邮件
效果图
<table width="800px" border="0" cellspacing="0", cellpadding="4"> <tr bgcolor="#EFEBDE"> <td >时间</td> <td>at {EVENT.TIME} on {EVENT.DATE}</td> <tr> <tr bgcolor="#C0C0C0"> <td >问题</td> <td>{TRIGGER.NAME}</td> <tr> <tr bgcolor="#EFEBDE"> <td>主机</td> <td>{HOST.NAME}</td> <tr> <tr bgcolor="#C0C0C0"> <td >级别</td> <td>{TRIGGER.SEVERITY}</td> <tr> <tr bgcolor="#EFEBDE"> <td >ID</td> <td>{EVENT.ID}</td> <tr> <tr bgcolor="#C0C0C0"> <td >相关图表</td> <td><img src="cid:zbx_img" /></td> <tr> </table>
#!/usr/bin/env python # -*- coding:utf-8 -*- import HTMLParser import urlparse import urllib import urllib2 import cookielib import string import os # 登录的主页面 hosturl = 'http://zabbix.heboan.com/screens.php' # 根据自己的实际地址填写 # post数据接收和处理的页面(我们要向这个页面发送我们构造的Post数据) posturl = 'http://zabbix.heboan.com/index.php' # 从数据包中分析出,处理post请求的url # 设置一个cookie处理器,它负责从服务器下载cookie到本地,并且在发送请求时带上本地的cookie cj = cookielib.LWPCookieJar() cookie_support = urllib2.HTTPCookieProcessor(cj) opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler) urllib2.install_opener(opener) # 打开登录主页面(他的目的是从页面下载cookie,这样我们在再送post数据时就有cookie了,否则发送不成功) h = urllib2.urlopen(hosturl) # 构造header,一般header至少要包含一下两项。这两项是从抓到的包里分析得出的。 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1', 'Referer': '******'} # 构造Post数据,他也是从抓大的包里分析得出的。 postData = { 'name': 'admin', # 用户名 'password': 'zabbix', # 密码 'autologin': 1, 'enter': 'Sign in' } # 需要给Post数据编码 postData = urllib.urlencode(postData) # 通过urllib2提供的request方法来向指定Url发送我们构造的数据,并完成登录过程 request = urllib2.Request(posturl, postData, headers) response = urllib2.urlopen(request) text = response.read() def get_graph(graphid, period, image_name): host = 'zabbix.heboan.com' path = '/tmp/image/' # 保存图片的地址 #zabbix的图片的地址的构造 url = "http://%s/chart2.php?graphid=%s&period=%s&width=500&height=100" % (host, graphid, period) img_req = urllib2.Request(url) png = urllib2.urlopen(img_req).read() file = path + image_name + '.png' with open(file,'wb') as f: f.write(png)
#!/usr/bin/env python # -*- coding:utf-8 -*- import sys from zbx_g import get_graph import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.image import MIMEImage import time mailto_list=[] # 收件人列表 mailto_list.append(sys.argv[1]) mail_host="smtp.xxx.com:25" # 邮件服务器 mail_user="xxxx" # 用户名 mail_pass="xxxxx" # 密码 mail_postfix="xxxxx.com" # 邮件后缀 title = sys.argv[2] content = sys.argv[3] def send_mail(to_list, sub): # 增加图片 def addimg(src, imgid): fp = open(src, 'rb') msgImage = MIMEImage(fp.read()) fp.close() msgImage.add_header('Content-ID', imgid) return msgImage msg = MIMEMultipart('related') #HTML代码 msgtext = MIMEText(content, "html", "utf-8") msg.attach(msgtext) # 全文件路径,后者为ID 根据ID在HTML中插入的位置 msg.attach(addimg("/tmp/image/cpu_load.png", "zbx_img")) me = mail_user + "@" + mail_postfix msg['Subject'] = sub msg['From'] = me msg['To'] = ",".join(to_list) send_to = to_list try: server = smtplib.SMTP() server.connect(mail_host) server.login(mail_user, mail_pass) server.sendmail(me, send_to, msg.as_string()) server.close() return True except Exception, e: print str(e) return False if __name__ == '__main__': get_graph(790, 10800, 'cpu_load') send_mail(mailto_list, title)
钉钉
效果图
创建一个群组,添加你需要发送报警人
点击个人头像--机器人管理
在机器人管理页面选择“自定义”机器人,输入机器人名字并选择要发送消息的群。如果需要的话,可以为机器人设置一个头像。点击“完成添加”
点击“复制”按钮,即可获得这个机器人对应的Webhook地址
>{TRIGGER.NAME}| 主机:{HOST.NAME}| 时间:{EVENT.DATE} {EVENT.TIME}| 等级:{TRIGGER.SEVERITY}| 详情:{ITEM.NAME}:{ITEM.VALUE}| 状态:{TRIGGER.STATUS}:{ITEM.VALUE1}| 事件ID:{EVENT.ID}
#!/usr/bin/env python # coding=utf-8 import sys import urllib2 import json class DtalkRobot(object): """自定义机器人的封装类""" def __init__(self, webhook): self.webhook = webhook # markdown类型 def sendMarkdown(self, title, text): data = { "msgtype": "markdown", "markdown": { "title": title, "text": text } } return self.post(data) def post(self, data): post_data = json.dumps(data) # print post_data headers = {'Content-Type': 'application/json'} req = urllib2.Request(self.webhook, post_data, headers) content = urllib2.urlopen(req).read() return content if __name__ == "__main__": webhook = "你的钉钉webhook" #标题 title = sys.argv[1] #内容 text = sys.argv[2].replace('|', "\n\n") robot = DtalkRobot(webhook) print robot.sendMarkdown(title, text)
每天进步一点,加油!