zabbix实现Python邮件报警

发布时间:2019-09-13 09:26:30编辑:auto阅读(2060)

    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.p_w_picpath 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
        p_w_picpath = MIMEImage(open(file1,'rb').read())
        p_w_picpath.add_header('Content-ID','<p_w_picpath1>')
        msg.attach(p_w_picpath)
        #print txt
        #print 'txt end'
        #print type (txt)
        #注意修改下面的zabbix地址
        url=" 
        #msg.attach(txt)
        html =  """ 
        <html> 
          <body>
        """
        html+=body   
        html+="<br><img src=cid:p_w_picpath1></br>"
        html+="<p><a href="+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=sys.argv[3]
    #picpath='c:/alert.png'
    #picpath='/etc/zabbix/alert/alert.png'
    #\xa3\xba代表中文的冒号
    #以后要加上异常处理,如果没有找到ID或者图片
    #itemid=getvalue(data,"^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

        

关键字