觸發器可根據監控項獲取到的值來進行一些操做,如監控項獲取到的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()
用戶報警媒介
#定義一個用戶,定義這個用戶的聯繫人,凡是須要此用戶發信的時候,都發信給對應聯繫人地址。
動做
#觸發器被觸發後,作什麼"動做"
#實際做用:定義錯誤內容,關聯發信方,使用哪一種方式發信。
#默認定義的動做,是對全部的觸發器生效的,若是想讓某個觸發器觸發某個動做,須要在動做內根據粗發起名稱作條件判斷,本文不講這個。
保存後讓觸發器條件不經過,從而觸發動做。
[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,而後等待查看報警通知。