1. 程式人生 > >Zabbix自動執行Shell指令碼報警

Zabbix自動執行Shell指令碼報警

Zabbix 3.4.4預設自帶3種報警方式,SMTP郵件服務報警,Jabber報警,GSM調變解調器(簡訊)報警。這裡面除了SMTP郵件服務報警比較實用以外,其他的報警方式用的並不多。Jabber在國內用的就不多,也很少有人會為Zabbix搞一個Jabber服務,而且給Zabbix伺服器在新增一個GSM外設裝置的人就更少了。但是僅僅使用郵件報警是很單薄的,一般的企業都會有自己的簡訊介面,推送介面,甚至電話介面。所以需要更方便適配更廣泛的報警方式。


所以比較好的一種報警方式就是當觸發器被啟用時,自動執行Zabbix Server上的一個shell指令碼,Zabbix服務在執行這個指令碼的同時傳遞幾個引數,這些引數包含了報警資訊,時間,報警主機等等訊息,而有了shell指令碼之後,我們就可以通過程式設計的方式實現各種各樣五花八門的報警工具,包括簡訊報警,微信報警,燈光聲音報警等等。

我這裡實現了一個簡訊報警,簡訊傳送平臺是第三方的一個產品,這個簡訊傳送平臺的介面是基於Socket通訊的,直接使用shell對接是不可行的,因為用shell做套接字程式設計很麻煩。所以這裡我使用tomcat搭建了一個小型的轉發平臺。shell指令碼通過curl或者wget命令,使用HTTP的GET請求,把報警資訊寫在URL當中(如"http://x.x.x.x/sms?msg=xxxx&receiver=xxxx"),把報警資訊傳送給tomcat伺服器,tomcat根據URL解析出報警資訊,然後拼接xml報文,並通過Socket程式設計傳送到第三方的簡訊平臺。然後接受者就可以收到相關簡訊了。

下面介紹一下具體的實現方法,總共分四個步驟

1、根據業務需要編寫shell指令碼

2、建立新的報警媒介並關聯上一步的shell指令碼

3、建立新的Zabbix使用者,錄入使用者的號碼

4、建立新的“動作”關聯上面的報警媒介和使用者

首先我們寫一個shell指令碼,這個指令碼會接收4個引數,zabbix伺服器報警後會執行一個“動作”,然後自動執行這個指令碼,我這裡使用Zabbix服務端的版本是3.4.4,使用的是Docker容器版,Docker容器的作業系統是alpine,是一個很精簡的linux系統,沒有curl,只有wget所以我只能使用wget傳送HTTP請求。好在這個alpine內部預裝了python 2.7.5,可以使用python指令碼實現一些複雜的操作。

這個shell指令碼非常的簡單,就是接收引數,然後進行urlencode(因為使用wget傳送URL時,URL中不能出現中文、特殊符號等,必須進行轉換,比如空格要轉換成%20,做過前端的同學應該都知道,這個urlencode我使用python進行實現)

下面是這個報警shell指令碼,檔名為oaalert.sh

#!/bin/bash

PHONE=$1
MSG1=$(/home/urlencode.py "$(date +"%Y-%m-%d %H:%M:%S")")
MSG2=$(/home/urlencode.py "$2")
MSG3=$(/home/urlencode.py "$3")
MSG4=$(/home/urlencode.py "$4")

cd /home
/usr/bin/wget -O result.txt -c "http://192.166.1.194:8089/sms?msg=$MSG1%0A$MSG2%0A$MSG3%0A$MSG4&receiver=$PHONE"

上面指令碼中需要傳入4個引數,第一個是傳送的電話號碼,第二個是簡訊標題,第三個是簡訊內容,第四個是落款,這四個引數都是在Zabbix 的“報警媒介”中配置的,可以根據業務需要增加或者減少引數數量。我們把shell報警指令碼放到/usr/lib/zabbix/alertscripts/這個目錄下,這個目錄在zabbix的docker已經給我們建好,我們直接把shell指令碼放進去並增加可執行許可權即可。

引數傳入之後,可能會有中文,所以需要進行URL編碼轉換,下面貼出urlencode的python指令碼,適用於python2.7

#!/usr/bin/python  
#coding=utf-8
from urllib import quote
import sys
import string
#print sys.argv[1]
url = sys.argv[1]
#url_encode = quote(url, safe=string.printable)
url_encode = quote(url).replace('/','%2F')
print url_encode

然後我們到Zabbix網頁後臺增加一個新的報警媒介,與郵件、SMS、Jabber報警並列。這個步驟需要到“管理”-“報警媒介型別”頁面中,點選右上角的“建立報警媒介型別”按鈕


這裡的名稱可以隨便填,指令碼名稱填寫你指令碼檔案的檔名。型別選擇“指令碼”

引數這裡可以參考其他三種媒介來填寫,這裡{ALERT.SENDTO}是Zabbix使用者中維護的聯絡方式,下文會細講,{ALERT.SUBJECT}是預設接收人,但是我把它做成簡訊標題來使用了,{ALERT.MESSAGE}是報警的內容,由“動作”的配置決定,第四個引數是一個落款,讓簡訊接受者瞭解是誰發出的。

然後點選下方的儲存,然後觀察一下是否是啟用狀態,我們的媒介就會變成四個


右邊的“選項”選項卡保持預設即可,預設是指令碼執行不成功後嘗試重新執行三次。Zabbix很好的一點是執行指令碼能在Web介面直接觀察是否執行成功,如果沒有執行成功還能在Web頁面看到指令碼的stderr輸出,分析指令碼失敗原因非常方便。這裡要大大的給Zabbix點個贊。

然後我們把簡訊接受者的電話號碼也配置到Zabbix中,這裡我們需要到“管理”-“使用者”介面中建立一個新使用者或者使用現有的使用者,一般建立新使用者比較方便

我們建立一個新使用者,基本資訊簡單填填就可以了,如下


重點是中間那個選項卡“報警媒介”,這裡我們選擇我們上一步建立的指令碼,啟用時間就是周幾到周幾,幾點到幾點,一般使用預設的7x24h就可以,除非你晚上不想收到報警。如下圖


然後點選新增,並觀察是否啟用


最後不要忘了點選“更新”按鈕

注:因為我上面的shell指令碼中電話號碼是通過引數傳入的,所以需要在使用者中新增“收件人”的號碼,如果你是寫死在shell指令碼中,或者寫死在報警媒介型別裡,就不需要在“使用者”中維護電話號碼。

然後最後一步,我們只需在觸發器報警時關聯一個“動作”即可。這一步需要到“配置”-“動作”中,點選右上角的建立動作,然後選擇需要監控的主機作為動作的出發條件


重點是後面幾個標籤頁,其中“操作”是觸發器啟用時的動作,“恢復操作”是問題修復後的動作,“確認操作”是觸發器被手動確認後的動作,一般“操作”和“恢復操作”各發送一條簡訊


這裡根據前面我們建立“報警媒介”時的配置來對比觀察,前面寫的{ALERT.SUBJECT}就是這裡的“預設接收人”,{ALERT.MESSAGE}就是訊息的內容,這裡我把接收人的手機號寫到了“使用者”中去,所以這裡接收人我就換成了簡訊標題內容。

下面的操作就需要關聯“使用者”和“報警媒介”,我的配置如下。主要就是設定“傳送到使用者”和“僅送到”為我們前兩步配置的專案。


這裡還可以實現更加複雜的報警模式,比如分步驟,分遞進關係等等,這裡就不再贅述。

然後就全部配置完畢了。可以讓嘗試讓一臺主機報一次警試試,並在Zabbix上觀察指令碼的執行情況