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")

補上效果圖: