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. 点击创建媒体类型,并关联默认动作报警
  1. 为用户启用报警脚本
  1. 修改第一步关联的报警动作,让其使用脚步发送报警,注意修改仅发送到的报警方式,还要修改报警的触发模版中带上Itemid这个参数(为脚本报警提供参数)
  1. 最后,准备工作都已完成,将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("xa3xba")      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'] = "[email protected]"      #msg['To'] = "[email protected]"      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('htinnsqinlaw','~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'  #xa3xba代表中文的冒号  #以后要加上异常处理,如果没有找到ID或者图片  #itemid=getvalue(data,"^ITEMIDxa3xba[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")

补上效果图: