zabbix 定義觸發器,並使用郵件,微信消息報警。

觸發器可根據監控項獲取到的值來進行一些操做,如監控項獲取到的values爲0,觸發器可判斷爲正常,若是獲取到了1,就觸發報警。html

定義報警方式比較簡單,可是用shell腳本實現起來,老是有格式問題,因此我用python語言寫了簡單的程序[發郵件,發到微信號上],zabbix運行python程序時,傳入幾個參數,便可根據參數內容定義發送的介質。python

 

環境信息nginx

zabbix server:
hostname=Zabbix server

ip:192.168.100.7

 

zabbix agent:

hostname=host3

ip:192.168.100.3

 

 

目標shell

對目前存在的監控建立觸發器,根據監控項的值來判斷要作的操做(查看這個監控項的建立過程:https://www.cnblogs.com/xiaodai12138/p/10159217.html)。vim

nginx_status    當nginx正常運行時返回0,若是不正常則反饋非0的數字微信

 

 

個性化發信配置過程概述併發

1.一個監控項ide

2.觸發器匹配監控項的值,判斷值符合觸發條件,則觸發報警。   #何時該發快遞了工具

3.定義報警媒介類型               #一個快遞單,上面固定了快遞運輸方式,可是發件人收件人,發的東西不是快遞單定義的,可是快遞單子上已經有了那幾個空行,須要有人在空行裏面填寫發件人等信息。fetch

4.定義用戶報警媒介               #一個用戶,他隨時準備發快遞,而且是他知道該發送給誰的。

5.定義觸發器觸發後的動做    #第二2項觸發,發快遞,本身包裝快遞內容,讓誰發送這個快遞(那我的知道快遞該發給誰),並告訴那我的,你要把快遞用順豐(多個報警媒介類型,可定義不一樣的發信方式)發走。

 

 

建立觸發器

#根據監控項的值作判斷,觸發錯誤

對nginx_status進行監控

 下圖是點擊上圖add後出現的頁面,添加觸發條件頁面

建立完後保存便可。

 

報警媒介類型

#定義發信方式

*編輯server端配置文件,添加下方內容,並重啓server端

#發信方式,咱們使用腳本發信,腳本更靈活,沒有限制,zabbix只須要將參數傳給腳本,而不須要管腳本怎麼作。

[root@123 zabbix]# cat etc/zabbix_server.conf |grep ^AlertScriptsPath
AlertScriptsPath=/usr/local/zabbix/shells/

 

 

#定義使用郵箱發信報警信息,那麼使用郵箱發信,須要動態定義的必須有3個東西分別是:接收方,標題,內容,在下圖中對應的分別是{ALERT.SENDTO},  {ALERT.SUBJECT},{ALERT.MESSAGE}

#使用此報警媒介類型,最終會執行send_mail.py腳本,並按照由上至下順序給腳本傳入3個位置參數,腳本內容以下

#send_mail.py  鏈接我的163郵箱,發送郵件至位置參數中的郵箱

#文中有部分區域,是須要本身填寫的,填寫你的發件郵箱。還有一些頭部的信息。

#腳本須要chmox  +x 給可執行權限。

 1 [root@123 shells]# vim /usr/local/zabbix/shells/send_mail.py 
 2 
 3 #!/usr/bin/python3
 4 import smtplib,sys
 5 from email.mime.text import MIMEText
 6 from email.header import  Header
 7 server=smtplib.SMTP(host='smtp.163.com')
 8 server.set_debuglevel(1)
 9 server.login(user='1821114****@163.com',password='twgdhbtz****')
10 
11 
12 send_to=sys.argv[1]
13 title=sys.argv[2]
14 input_msg=sys.argv[3]
15 
16 
17 
18 msg=MIMEText(input_msg,'plain','utf-8')
19 msg['Subject'] = Header(title, 'utf-8')
20 msg['From'] ='from_zabbix<1821114****@163.com>'
21 msg['To'] = send_to
22 
23 server.sendmail('1821114****@163.com',send_to,msg.as_string())
24 server.quit()
send_mail.py

 

 

 

用戶報警媒介

#定義一個用戶,定義這個用戶的聯繫人,凡是須要此用戶發信的時候,都發信給對應聯繫人地址。

 

 

 

 

 

動做

#觸發器被觸發後,作什麼"動做"

#實際做用:定義錯誤內容,關聯發信方,使用哪一種方式發信。

#默認定義的動做,是對全部的觸發器生效的,若是想讓某個觸發器觸發某個動做,須要在動做內根據粗發起名稱作條件判斷,本文不講這個。

 

 

 

 保存後讓觸發器條件不經過,從而觸發動做。

[root@host3 [12:02:31]~]#service nginx stop
中止 nginx:                                               [肯定]

 

觸發後,腳本執行成功。

 

而後啓動nginx,在觀察下錯誤狀態。

[root@host3 [12:02:35]~]#service nginx start
正在啓動 nginx:                                           [肯定]

 

恢復了

查看是否收到錯誤郵件和恢復郵件。

#3封錯誤郵件,每過1分鐘發一次,還有一個恢復通知郵件。

 

 

 

 

到此,正常狀況,你已經能夠經過郵件發信了(若是不行,能夠留言),我在使用郵件發信時,遇到了個問題,就是,我發郵件太頻繁了,被屏蔽了,說我是垃圾郵件,那這種狀況怎麼處理,自建郵件服務成本過高,又不想去作郵箱提供商那所謂的充值提升信譽啥的,那就用微信來接收消息吧,主流聊天工具,天天看微信看得比郵箱次數還多,還能更快發現錯誤呢(須要必定的技術能力)。

 

 

 

更改報警媒介類型

 

#send_wechat.py腳本工做模式:獲取zabbix傳入的值,整合成爲一個字符串,並放入mq中。

#放入mq中的話實現瞭解耦效果,沒有更多的依賴性,zabbix只管放,另外一個程序只管讀,讀取mq中內容併發送到微信好友微信上。

#標紅區域修改過,避免機密信息泄露

#腳本須要chmox  +x 給可執行權限。

 1 [root@123 shells]# vim /usr/local/zabbix/shells/send_wechat.py 
 2 
 3 #!/usr/bin/python3
 4 import pika,time,sys
 5 title=sys.argv[1]
 6 input_msg=sys.argv[2]
 7 messages="""Zabbix
 8 
 9 title:%s
10 messages:%s
11 """%(title,input_msg)

12 username = 'xiaodai12138' 13 pwd = 'twgdhbtzhy****' 14 user_pwd = pika.PlainCredentials(username, pwd) 15 connect=pika.BlockingConnection(pika.ConnectionParameters( 16 '47.94.133.***',credentials=user_pwd 17 )) 18 channel=connect.channel() 19 channel.queue_declare(queue="zabbix_warning",durable=True) 20 channel.basic_publish(exchange="", 21 routing_key="zabbix_warning", 22 body=messages, 23 properties=pika.BasicProperties(delivery_mode=2), 24 ) 25 connect.close()

 

 

 

讀取mq中內容發送到微信上的程序內容,咱們簡稱wechat.py

#紅色區域修改過

 

#python itchat模塊,使用前須要使用  itchat.auto_login(hotReload=True) 來登陸微信,執行到此時,你的桌面會顯示出來一個二維碼,用你的微信掃描二維碼便可登陸,同時,你電腦端登陸的微信將會被擠下去。

 

 

#解耦的優勢又來了,當你用微信掃描二維碼,而後此程序會一直運行着,等待mq中有數據,若是有數據了,就自動發送,不用再次掃描二維碼了,若是你直接讓zabbix執行發送信息到微信的話,zabbix每次報警都會執行一次你的程序,你每次都要掃描二維碼,若是不掃就登陸不上,並且我還沒試過在linxu上放下面這個程序。

 

#此程須要一直運行着,你隨便把這個程序放在哪兒,沒有限制,只要保證這個程序不down,當zabbix上有報警時,這個程序就會發送到微信上面。

import  pika,time
import  itchat
##wechat itchat.auto_login(hotReload
=True) users=itchat.search_friends(name='夢醒龍') #搜索朋友 username_chat=users[0]['UserName'] #獲取朋友在微信底層中存在的用戶名
#mq username
= 'xiaodai12138' pwd = 'twgdhbtzhy****' user_pwd = pika.PlainCredentials(username, pwd) connect=pika.BlockingConnection(pika.ConnectionParameters( '47.94.133.***',credentials=user_pwd )) channel=connect.channel() channel.queue_declare(queue="zabbix_warning",durable=True) def callback(ch, method, properties, body): warning_messages=body.decode('utf-8') print("recv:",warning_messages) print(username_chat) itchat.send(warning_messages, toUserName=username_chat) #發送消息給朋友 print(itchat.get_friends(username_chat)) ch.basic_ack(delivery_tag=method.delivery_tag) channel.basic_qos(prefetch_count=1) channel.basic_consume(callback, queue='zabbix_warning', ) print(' [*] Waiting for messages.') channel.start_consuming()

 

 

 

 

運行wechat.py,中止nginx,過1分鐘後啓動nginx,查看效果。

#會顯示二維碼

 

 掃描登陸後重啓nginx,而後等待查看報警通知。

 

 

 

相關文章
相關標籤/搜索