zabbix實現Python郵件報警
- 2020 年 1 月 7 日
- 筆記
zabbix是個非常強大的監控工具,可以監控linux和windows的伺服器數據,也可以通過自定義key來擴展默認的監控項,但是自帶的郵件報警提供的資訊卻不太友善。本文想通過自定腳本的方式,實現在報警郵件的同時發送對應的影像和url連接。
步驟如下:
- 創建一個腳本媒體報警:修改zabbix腳本報警配置路徑:AlertScritpPath為存放腳本的路徑
- ### Option: AlertScriptsPath # AlertScriptsPath=${datadir}/zabbix/alertscripts #AlertScriptsPath=/usr/lib/zabbix/alertscripts AlertScriptsPath=/etc/zabbix/alert
- 點擊創建媒體類型,並關聯默認動作報警


- 為用戶啟用報警腳本

- 修改第一步關聯的報警動作,讓其使用腳步發送報警,注意修改僅發送到的報警方式,還要修改報警的觸發模版中帶上Itemid這個參數(為腳本報警提供參數)



- 最後,準備工作都已完成,將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")
補上效果圖:
