分享一个线上使用的自定义zabbix报警脚本,脚本思路大致如下:

1.使用爬虫获取报警图片(前提是要获得报警的item)

2.将图片与邮件内容整合

3.发送邮件

4.日志记录

脚本内容如下:

#!/usr/bin/python
#coding:utf-8import sys,time,re,os,glob
import smtplib
from email.mime.text import MIMEText
from email.mime.p_w_picpath import MIMEImage
from email.mime.multipart import MIMEMultipart
import urllib,urllib2,cookielib
import zlibmail_host = '************'            # 邮件发送方相关信息
mail_user = '************'
mail_pass = '************'
mail_postfix = '************'zabbix_user = "********"            # zabbix-web相关信息
zabbix_pass = "********"
url = "http://***********/"
alartscript_path="/**********/alertscripts/"        # 邮件脚本及日志位置
line = "ItemID"me = "zabbix"+'<'+mail_user+'>'######### 利用爬虫获取图片,保证cookie的可用性
def get_graph(itemID):login_url = url + "index.php"post_value = {"request":"","name":zabbix_user,"password":zabbix_pass,"autologin":"1",                #注意这个是否记住密码的选项,将造成生成的cookie长度不一样,短的能查看到图但没有数据"enter":"Sign in"}post_data = urllib.urlencode(post_value)headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0","Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Encoding":"gzip, deflate","Accept-Language":"zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3","Connection":"Keep-Alive","Host":"**************","Referer":login_url,###########这个cookie很重要,要求当前cookie正在浏览器上正常使用,才能顺利取图"Cookie":"******** zbx_sessionid=*********"}request = urllib2.Request(login_url,post_data,headers)cj = cookielib.CookieJar()opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))urllib2.install_opener(opener)result = opener.open(request)print result.info()                                              #查看下内容信息,如果是gzip要解压写入文件result_html = zlib.decompress(result.read(), 16+zlib.MAX_WBITS)global graph_url                            # 构建用于访问图片的URLgraph_url = url+"chart.php"+"?itemids="+str(itemID)graph_data = urllib2.urlopen(graph_url)print graph_data.info()#.get('Content-Encoding')#graph_html = zlib.decompress(graph_data.read(), 16+zlib.MAX_WBITS)print graph_data.info().get('Content-Type')p_w_picpath_data = graph_data.read()if graph_data.info().get('Content-Type') == "p_w_picpath/png":p_w_picpath_file = open('last_%s.pnj'%itemID,'wb')p_w_picpath_file.write(p_w_picpath_data)p_w_picpath_file.close()else:trigged = open('zabbix.png','rb')            # 如果获取图片data失败,打开一张事先准备好的图,这里使用的是zabbix的logo,在邮件中很直接的反应出获取图片失败p_w_picpath_data = trigged.read()trigged.close()print "Graph_URL:",graph_urlreturn p_w_picpath_datadef mail_con(txtData,p_w_picpathData):                    # 重写邮件内容(添加图片)msg = MIMEMultipart('related')msg['Subject'] = subjectmsg['From'] = memsg['to'] = receivercon_txt = MIMEText(txtData,_subtype='html',_charset='utf-8')msg.attach(con_txt)con_img = MIMEImage(p_w_picpathData)con_img.add_header('Content-ID','digglife')        # 将要发送的图片嵌入到邮件头部,重写邮件内容msg.attach(con_img)return msg.as_string()def send_mail(receiver,subject,contents):                # 邮件发送,并将结果记录logfile = open('alarm_mail.log','a')try:s = smtplib.SMTP()s.connect(mail_host)s.login(mail_user,mail_pass)s.sendmail(me,receiver,contents)s.close()log = time.ctime() + "\tOK\t" + subject +"\t"+ receiver + "\n"except Exception,e:log = time.ctime() + "\tFail\t" + subject +"\t"+ receiver + "\n"logfile.write("\n"+"\t"+graph_url+"\n")logfile.write(log)logfile.close()if __name__ == "__main__":cur_pwd = os.getcwd()print cur_pwdos.chdir(alartscript_path)                # zabbix-server工作的路径为/,在这里切换邮件脚本路径,可以写入日志和图片处理,减少出错old_pnjs = glob.glob('last_*.pnj')for old_file in old_pnjs:os.remove(old_file)receiver = sys.argv[1]subject = sys.argv[2]src_mail_con = sys.argv[3]try:ItemID = re.match(r'.*ItemID:(\d+)[^\d]+.*',src_mail_con.replace('\n',''),re.S).group(1)        # 利用正则从邮件内容中获取itemIDexcept:ItemID = 0000                # item为0000的是一张空图,减少异常情况print "ItemID:",ItemIDImageData = get_graph(ItemID)MailCon = mail_con(src_mail_con,ImageData)send_mail(receiver,subject,MailCon)

脚本中‘********’部分出于个人信息安全进行隐藏,读者可根据具体环境修改(发件箱信息,zabbix-web登陆信息及cookie)

脚本首先要获得报警itemID,以及邮件内容放置图片信息,因此还要自定义报警邮件内容,如下:

邮件内容

    <body>故障通知<br/>触发器: {TRIGGER.NAME}<br/>主机名:{HOST.NAME}({IPADDRESS})<br/>状态: {TRIGGER.STATUS}<br/>告警级别: {TRIGGER.SEVERITY}<br/>URL: {TRIGGER.URL}<br/><br/>告警项目:<br/><br/>{ITEM.NAME1} ({HOST.NAME1}:{ITEM.KEY1}): {ITEM.VALUE1}<br/><br/><div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><img src="cid:digglife" orgwidth="1016" orgheight="376" data-p_w_picpath="1" style="width: 780px; height: 288px;"></div>ItemID:{ITEM.ID}<br/>EventID: {EVENT.ID}<br/>告警时间:{EVENT.DATE} {EVENT.TIME} <br/><br/>详细信息:<a href="http://*******/history.php?action=showgraph&itemids[]={ITEM.ID}" target="_blank">登录查看</a><br/></body>

效果如下

QQ邮箱接收邮件,显示内容:

日志记录:

转载于:https://blog.51cto.com/11424123/1771220

线上使用zabbix报警脚本(含图片)相关推荐

  1. XE中FMX操作ListBox,添加上千条记录(含图片)

    我之前是想在ListBox的每个Item上添加一个图片,Item上所有的内容都是放在Object里赋值,结果发现加载一百条记录耗时四五秒: procedure TMainForm.AddItem; v ...

  2. 线上SQL脚本执行错了出事之后互相甩锅怎么办?

    平常我们线上执行的SQL脚本都是很粗犷的.呼叫一下DBA或者运维,把脚本发过去,然后告诉他在哪个环境执行.然后双方沟通不畅,测试环境的脚本执行到生产了!脚本写的有问题执行错了却没有回滚脚本!或者每个人 ...

  3. 线上服务导致cpu飙升问题排查

    一.故障说明 昨晚突然收到线上服务器cpu报警,登录监控平台看了下发现cpu瞬间飙升到60%.第一反应就是使用top命令去查看,发现是一个java进程.于是立刻使用jps -l命令定位到该java进程 ...

  4. gc就是fullgc吗 major_线上出现fullgc问题如何排查?

    1.问题描述 线上出现fullgc报警,每5分钟一次 2.背景知识 1. 程序执行了System.gc() 执行了jmap -histo:live pid命令 在执行minor gc的时候进行的一系列 ...

  5. 【开发技能】研发线上事故总结!

    一.前言 你的代码出过事故吗? 老人言:常在河边走哪有不湿鞋.只要你在做着编程开发的工作就一定会遇到事故,或大或小而已. 当然可能有一部分研发同学,在相对传统的行业或者做着用户体量较小的业务等,很难遇 ...

  6. 面试官:线上服务器CPU占用率高如何排查定位问题?

    开发十年,就只剩下这套架构体系了!! 国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下:  ...

  7. 线上发生死锁异常了,该怎么办

    前言 MySQL 死锁异常是我们经常会遇到的线上异常类别,一旦线上业务日间复杂,各种业务操作之间往往会产生锁冲突,有些会导致死锁异常.这种死锁异常一般要在特定时间特定数据和特定业务操作才会复现,并且分 ...

  8. mysql死锁的排查方法_MySQL死锁系列-线上死锁问题排查思路

    前言 MySQL 死锁异常是我们经常会遇到的线上异常类别,一旦线上业务日间复杂,各种业务操作之间往往会产生锁冲突,有些会导致死锁异常.这种死锁异常一般要在特定时间特定数据和特定业务操作才会复现,并且分 ...

  9. window服务器cpu过高的排查_线上服务器发生CPU占用率过高应该如何排查并定位问题?...

    国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下: 排名前几的比较受重视的能力分别为:解决问题 ...

最新文章

  1. 微软与联合国环境规划署联手解决环境问题
  2. Leetcode 122. 买卖股票的最佳时机 II 解题思路及C++实现
  3. html5效果源码,10款web前端值得学习的 HTML5 效果附源码
  4. android配置开发环境ubuntu
  5. 沣东新城镐京遗址规划_沣东新城房价为啥这么高?
  6. centos 6.5装mysql 5.7,centos 6.5装mysql5.7
  7. [深度学习-数据集] cifar-10数据集介绍
  8. linux下weblogic12c建域,三、WebLogic 12C集群部署-创建域
  9. 苹果cms V10模板|首涂第二十五套精简宽屏主题模板破解带后台无加密版
  10. 【Python密度泛函理论】
  11. Matlab求整数规划
  12. MTK刷机工具Flash_Tool部分4032错误解决办法
  13. php如何实时显示弹幕,斗鱼弹幕 PHP 实现
  14. Eclipse设置护眼浅绿色背景
  15. 【MDCC 2016】产品与设计峰会现场实录(下)
  16. 突破某些网站限制只能由微信打开的尴尬场景
  17. IGMP协议(IGMPv1、IGMPv2、IGMPv3)
  18. GitHub上README.md编写教程(基本语法)
  19. 《复杂网络》复杂网络的结构及特点
  20. react render相关 【类组件、函数组件 】

热门文章

  1. linux dump用法,Linux命令之tcpdump命令用法介绍
  2. bootstrap table php,bootstrap table Tooltip
  3. git本地仓库关联远端仓库
  4. Redis高级客户端Lettuce详解
  5. 如何高效地去调试UGUI的源码
  6. python-9-IO编程
  7. CSharpGL(43)环境映射(Environment Mapping)-天空盒(Skybox)反射(Reflection)和折射(Refraction)...
  8. Looping over the databases on a server
  9. 清除 Xcode 项目缓存
  10. 如何实施好基于MOSS的企业搜索项目(上)