线上使用zabbix报警脚本(含图片)

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

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

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

3.发送邮件

4.日志记录

脚本内容如下:

#!/usr/bin/python
#coding:utf-8

import sys,time,re,os,glob
import smtplib
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
import urllib,urllib2,cookielib
import zlib

mail_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                            # 构建用于访问图片的URL
        graph_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‘)
        image_data = graph_data.read()
        if graph_data.info().get(‘Content-Type‘) == "image/png":
                image_file = open(‘last_%s.pnj‘%itemID,‘wb‘)
                image_file.write(image_data)
                image_file.close()
        else:
                trigged = open(‘zabbix.png‘,‘rb‘)            # 如果获取图片data失败,打开一张事先准备好的图,这里使用的是zabbix的logo,在邮件中很直接的反应出获取图片失败
                image_data = trigged.read()
                trigged.close()
        print "Graph_URL:",graph_url
        return image_data
        
def mail_con(txtData,imageData):                    # 重写邮件内容(添加图片)
        msg = MIMEMultipart(‘related‘)
        msg[‘Subject‘] = subject
        msg[‘From‘] = me
        msg[‘to‘] = receiver
        con_txt = MIMEText(txtData,_subtype=‘html‘,_charset=‘utf-8‘)
        msg.attach(con_txt)
        con_img = MIMEImage(imageData)
        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_pwd
        os.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)        # 利用正则从邮件内容中获取itemID
        except:
                ItemID = 0000                # item为0000的是一张空图,减少异常情况
        print "ItemID:",ItemID
        
        ImageData = 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-image="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>
时间: 2024-10-13 04:34:22

线上使用zabbix报警脚本(含图片)的相关文章

Zabbix报警脚本

最近上线zabbix由于自带的报警不够直观,领导要求增加监控项的图片,网上找了很多相关的脚本,多少都有些问题,于是自己写了一个,可能不够完善异常判断没加很多,不过线上跑了一段时间没发现啥问题,贴代码共大家参考(其中url及账户密码请自行修改) #!/usr/bin/env python # encoding: utf8 import sys, os import datetime import cookielib, urllib2, urllib, re import smtplib, mime

Zabbix报警脚本-微信

#!/bin/bash ###SCRIPT_NAME:weixin.sh######send message from weixin for zabbix monitor######write by lvkaineng######2015-11-3####1CropID='wx4ad02e53cdceccd7'#3Secret='pczpXfpvDqfLaBhVhssk-XaNbSMw4jwwpYNAuh_FQPo'GURL="https://qyapi.weixin.qq.com/cgi-bi

mysql线上一个定时备份脚本

mysql数据库远程备份的数据最好打包压缩 [[email protected] crontab]# pwd/Data/Mysql_Bakup/crontab[[email protected] crontab]# cat backup_db_wangshibo.sh#!/bin/bashMYSQL="/usr/bin/mysql"MYSQLDUMP="/usr/bin/mysqldump"BACKUP_DIR="/Data/Mysql_Bakup&quo

线上一个简单检测Ping状态的邮件报警脚本

Step1.安装sendmail来发邮件 # yum -y install sendmail # /etc/init.d/sendmail start # chkconfig sendmail on Step2.安装邮件客户端 # yum -y install mutt 2.1添加发件人信息,如下 # vim /etc/Muttrc set charset="utf-8"           #设置发邮件编码 set envelope_from=yes set rfc2047_para

Python脚本通过邮件发送zabbix报警图片

Python脚本通过邮件发送zabbix报警图片流程如下: 通过zabbix传递给脚本的message参数,筛选出报警信息的itemid; 通过获取的itemid,在数据库中查找对应的grpahid; 拉取对应graphid的图片并保存; 将报警信息和图片组装成html; 发送邮件. Python脚本如下: #!/usr/bin/python #coding=utf-8 from email.mime.text import MIMEText from email.mime.multipart 

线上nginx访问日志切割脚本

1.说明 随着时间的增加,nginx 的访问日志会越来越大,下图是新部署的线上 zabbix 监控网站运行了十几天左右产生的访问日志达到213M. 所以必须进行日志分割,要求如下: 1.每天的日志单独生成一个文件 2.保留30天的访问日志 2.编写脚本 vim /usr/local/nginx/logs/nginx_log_rotate.sh #! /bin/bash logs_path="/usr/local/nginx/logs/" log_name="access.lo

expect脚本自动化执行线上服务器命令

这个expect脚本是为了获取线上服务器的容量大小,并无实际意义 #!/usr/bin/expect set timeout 60       #设置超时 set user [lindex $argv 0]    #设置第一个参数 set password [lindex $argv 1] set ipaddr [lindex $argv 2]set port [lindex $argv 3] set mypassword [lindex $argv 4] spawn ssh [email pr

线上日志分析与其他一些脚本

对一些线上常用的脚本进行了一下总结和说明,免得以后忘记了~ 一·线上发布API集群的代码脚本: #!/bin/bash #Author CCC host=' 10.44.22.113 10.44.22.113 10.44.22.112 10.44.22.112 10.44.22.113 10.44.22.113 10.44.22.114 10.44.22.114 10.44.22.115 10.44.22.115 10.44.22.119 10.44.22.119 ' #basePath='/v

BAT脚本一键更新提交代码到线上

如果你发现你每天都在做一件非常繁琐的事情那么必定能将他简单化操作! 发现:当开发把代码提交到了代码服务器之后就没他们什么事情了,剩下的就是我们去将代码推送到线上服务器,这个过程并不复杂,但是非常的繁琐和无聊,首先我们要到开发的svn目录下面更新到最新的版本,再将推送的svn目录也更新一下,确保两个svn的目录是最新的,不然提交时有可能会出错,然后把开发svn目录复制到推送的svn目录下,并且提交,最后远程到推送服务器上进行代码拉取.推送 简化:一个bat脚本应该搞定的事情 @echo off #