前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >zabbix实现Python邮件报警

zabbix实现Python邮件报警

作者头像
py3study
发布2020-01-07 11:31:05
7790
发布2020-01-07 11:31:05
举报
文章被收录于专栏:python3python3

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
wKioL1QRF4ig1tVhAALOZnV-xPk727.jpg
wKiom1QRFy-T_AU1AAE0v3PRQRA480.jpg
wKiom1QRFy-T_AU1AAE0v3PRQRA480.jpg
  1. 为用户启用报警脚本
wKioL1QRGpyjsqb0AALCzCHpM_g276.jpg
wKioL1QRGpyjsqb0AALCzCHpM_g276.jpg
  1. 修改第一步关联的报警动作,让其使用脚步发送报警,注意修改仅发送到的报警方式,还要修改报警的触发模版中带上Itemid这个参数(为脚本报警提供参数)
wKiom1QRG9STM-_ZAAI8ClOoF1U093.jpg
wKiom1QRG9STM-_ZAAI8ClOoF1U093.jpg
wKiom1QRG-jBTfrEAAKknSc_fgI962.jpg
wKiom1QRG-jBTfrEAAKknSc_fgI962.jpg
wKioL1QRHfyS1uB1AANq42qxq9E862.jpg
wKioL1QRHfyS1uB1AANq42qxq9E862.jpg
  1. 最后,准备工作都已完成,将python脚本上传到第1步的路径中即可,此脚本的思路是通过动作报警中的itmeid去获取监控项的item值,并通过history.php获取图形,并提供url连接 将下面脚本中#注意修改下面的zabbix地址 修改到你实际的zabbix server地址哦! #注意修改日志路径 修改到你实际日志的路径
代码语言:javascript
复制
#! /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
wKioL1QRH_rTIN1VAAOVFEhlAto285.jpg
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档