首页 > 代码库 > zabbix实现Python邮件报警

zabbix实现Python邮件报警

zabbix是个非常强大的监控工具,可以监控linux和windows的服务器数据,也可以通过自定义key来扩展默认的监控项,但是自带的邮件报警提供的信息却不太友善。本文想通过自定脚本的方式,实现在报警邮件的同时发送对应的图像和url连接。

步骤如下:

  1. 创建一个脚本媒体报警:修改zabbix脚本报警配置路径:AlertScritpPath为存放脚本的路径

  2. ### Option: AlertScriptsPath
    # AlertScriptsPath=${datadir}/zabbix/alertscripts
    #AlertScriptsPath=/usr/lib/zabbix/alertscripts
    AlertScriptsPath=/etc/zabbix/alert
  3. 点击创建媒体类型,并关联默认动作报警

    wKioL1QRF4ig1tVhAALOZnV-xPk727.jpg

    wKiom1QRFy-T_AU1AAE0v3PRQRA480.jpg

  4. 为用户启用报警脚本

    wKioL1QRGpyjsqb0AALCzCHpM_g276.jpg

  5. 修改第一步关联的报警动作,让其使用脚步发送报警,注意修改仅发送到的报警方式,还要修改报警的触发模版中带上Itemid这个参数(为脚本报警提供参数)

    wKiom1QRG9STM-_ZAAI8ClOoF1U093.jpg

    wKiom1QRG-jBTfrEAAKknSc_fgI962.jpg

    wKioL1QRHfyS1uB1AANq42qxq9E862.jpg

  6. 最后,准备工作都已完成,将python脚本上传到第1步的路径中即可,此脚本的思路是通过动作报警中的itmeid去获取监控项的item值,并通过history.php获取图形,并提供url连接

    将下面脚本中#注意修改下面的zabbix地址 修改到你实际的zabbix server地址哦!

    #注意修改日志路径 修改到你实际日志的路径


#! /usr/bin/python
# -*- coding: utf-8 -*-
import sys,os,re,smtplib,mimetypes,pycurl,json,urllib,StringIO,time,traceback
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
leng=len(sys.argv)
def log4py(logpath,logtxt):
   f=open(logpath,‘a‘)
   logtime=time.strftime(‘%Y%m%d%H%M%S‘,time.localtime())
   f.writelines(logtime+":")
   f.writelines(logtxt)
   f.writelines(‘\n‘)
   f.close()
def printmlinestr(mlinestr):
   d=mlinestr.splitlines()
   res=""
   for i in d:
      i="<br>"+i+"</br>"
      res+=i+‘\n‘
   return res
#getvalue 通过正则表达式获取对应itemID
def getvalue(string,rexp):
    r=re.compile(rexp,re.M)
    #r=re.compile("^ITEMID:[0-9]*",re.M)
    log4py(logpath,‘method getvalue‘)
    log4py(logpath,‘string‘)
    log4py(logpath,string)
    #for i in string:
    d=r.findall(string)
    log4py (logpath,‘rexp:‘)
    log4py (logpath,rexp)
    str1=d[0] 
    log4py(logpath, ‘rexresult:‘)
    log4py(logpath,str1)
    print str1
   # arrstr=str.split("\xa3\xba")
    arrstr=str1.split(":")
    result=arrstr[1]
    log4py(logpath,‘result:‘)
    log4py(logpath,result)
    log4py(logpath,‘end method getvalue‘)
    return result
#getpic 获取报警图片,写入文件
def getpic(itemid):
        log4py(logpath,‘method getpic‘)
   # try:   
        c = pycurl.Curl()
        pathroot=‘/etc/zabbix/alert/‘
        #path=‘c:/alert.png‘
        #head=‘Content-Type:application/json‘
        global stime
        endtime=time.strftime(‘%Y%m%d%H%M%S‘,time.localtime())
        tmptime=int(endtime)-10000
        stime = repr(tmptime)
        post_data_dic={"itemid":itemid,"period":"3600","stime":stime}
picpath=(pathroot)+(stime)+(itemid)+‘.png‘
print ‘picpath:‘+picpath
        str=file(picpath,‘wb‘)
        #注意修改下面的zabbix地址
        c.setopt(pycurl.URL, "http://10.1.1.67/zabbix/chart.php")
        c.setopt(pycurl.WRITEFUNCTION, str.write)
        c.setopt(pycurl.FOLLOWLOCATION, 1)
        #c.setopt(pycurl.HEADER, True)
        c.setopt(c.POSTFIELDS,urllib.urlencode(post_data_dic))
        c.perform()
        log4py(logpath,‘end method getpic‘)
return picpath
   # except Exception,e:
   #     f.writelines(‘expforgetpic:\n‘)
   #     f.writelines(e)
def SendMail(receivers,subject,data,picpath,itemid):
    msg = MIMEMultipart()
    msg[‘From‘] = "zbx@huazhu.com"
    #msg[‘To‘] = "zgyan@huazhu.com"
    receives=receivers
    msg[‘To‘] = receivers
    msg[‘Subject‘] = subject
    body=printmlinestr(data)
    file1 = picpath
    image = MIMEImage(open(file1,‘rb‘).read())
    image.add_header(‘Content-ID‘,‘<image1>‘)
    msg.attach(image)
    #print txt
    #print ‘txt end‘
    #print type (txt)
    #注意修改下面的zabbix地址
    url=" 
    #msg.attach(txt)
    html =  """ 
    <html> 
      <body>
    """
    html+=body   
    html+="<br><img src=http://www.mamicode.com/cid:image1>
"     html+="<p><a href="http://www.mamicode.com/+url+">URLLINK</a></p>"          html+="""              </body>      </html>     """     htm = MIMEText(html,‘html‘,‘gb2312‘)     msg.attach(htm)     server = smtplib.SMTP()     server.connect(‘mail.huazhu.com‘)     #server.login(‘htinns\qinlaw‘,‘~liuqing0530‘)     #server.sendmail(msg[‘From‘],msg[‘To‘],msg.as_string())     server.sendmail(msg[‘From‘],receives,msg.as_string())     server.quit() #if __name__ == "__main__":     #def main #获取zbx的传入参数 ,参数1-收件人地址,参数2-邮件主题,参数3-报警内容 #注意修改日志路径 global logpath logpath=‘/etc/zabbix/alert/ts.log‘ log4py(logpath,"--------------------------startx") rece=sys.argv[1] subject=sys.argv[2] data=http://www.mamicode.com/sys.argv[3]"^ITEMID\xa3\xba[0-9]*") #itemid=getvalue(data,"^ITEMID:[0-9]*) #f.writelines(data) try:    itemid=getvalue(data,"ITEMID:[0-9]*")    picpath= getpic(itemid)    SendMail(rece,subject,data,picpath,itemid)    os.remove(picpath) except Exception,e:    log4py(logpath,e)    #os.system(‘echo $3|mail -s $2 $1 ‘)    shellcmd=‘echo ‘+data+‘|mail -s ‘+subject+‘ ‘+rece    print shellcmd     os.system(shellcmd) log4py(logpath,"--------------------------end")


补上效果图:

wKioL1QRH_rTIN1VAAOVFEhlAto285.jpg

    

zabbix实现Python邮件报警