一,Zabbix Web操作深入
1.1 Zabbix Web下的主機和模版以及監控項的添加方式
(1)創建一個模版
我們所有的功能幾乎都是在模版中定義的
我們再點進新創建的模版查看
模版里幾乎可以設定我們需要的所有功能
(2)在模版里創建應用集
應用集的作用就是將眾多的監控項進行一個分類,方便我們的管理
(3)在模版里創建一個zabbix自帶的監控項
(4)監控項里的鍵值我們到底要如何寫?我們需要學會照葫蘆畫瓢
我們選擇一個系統模版Template OS Linux查看
(5)當然我們也可以自定義監控項的鍵值,但是並不推薦這樣。因為,都是自己寫太慢了。系統自帶了很多鍵值我們要學會利用
自定義系統監控項的鍵值創建,請參考前一節的知識
1.2 Zabbix Web下觸發器與表達式的編寫方法
(1)avg
參數:秒或#num
支持類型:float,int
作用:返回一段時間的平均值
舉例:
avg(5):最后5秒的平均值
avg(#5):表示最近5次得到值的平均值
avg(3600,86400):表示一天前的一個小時的平均值
如果僅有一個參數,表示指定時間的平均值,從現在開始算起,如果有第二個參數,表示漂移,從第二個參數前開始算時間,#n表示最近n次的值
(2)last
參數:秒或#num
支持值類型:float,int,str,text,log
作用:最近的值,如果為秒,則忽略,#num表示最近第N個值,請注意當前的#num和其他一些函數的#num的意思是不同的。
last(0)等價於last(#1)
last(#3)表示最近第3個值(並不是最近的三個值)
本函數也支持第二個參數time_shift,例如last(0,86400)返回一天前的最近的值。
如果在history中同一秒中有多個值存在看,Zabbix不保證值的精確順序#num從Zabbix1.6.2起開始支持,timeshift從1.8.2起開始支持,可以查詢avg()函數獲取它的使用方法
(3)max
參數:秒或#num
支持值類型:float,int
描述:返回指定時間間隔的最大值。時間間隔作為第一個參數可以是秒或收集值的數目(前綴為#)。從Zabbix1.8.2開始,函數支持第二個可選參數time_shift,可以查看avg()函數獲取它的使用方法。
例如:max(#3)=0 返回3次值如果都是0則觸發告警
(4)min
參數:秒或#num
支持值類型:float,int
描述:返回指定時間間隔的最小值。時間間隔作為第一個參數可以是秒或收集值的數目(前綴為#)。從Zabbix1.8.2開始,函數支持第二個可選參數time_shift,可以查看avg()函數獲取它的使用方法。
(5)nodata
參數:秒
支持值類型:any
描述:當返回值為1表示指定的間隔(間隔不應小於30秒)沒有接收到數據,0表示獲取到了。
例:nodata(5m)=1 ===>5分鍾之內獲取不到數據就告警
(6)prev
參數:忽略
支持值類型:float,int,str,text,log
描述:返回之前的值,類似於last(#2)
(7)sum
參數:秒或#num
支持值類型:float,int
描述:返回指定時間間隔中收集到的值的總和,時間間隔作為第一個參數支持秒或收集值的數目(以#開始).從Zabbix1.8.2開始,本函數支持time_shift作為第二個參數。可以查看avg函數獲取它的用法。
(8)change
參數:忽略
支持類型:float,int,str,text,log
作用:返回最近獲得值與之前獲得值的差值,對於字符串0表示相等,1表示不同
change(0)>n:忽略參數一般輸入0,表示最近得到的值與上一個值的差值大於n
(9)diff
參數:忽略
支持值類型:float,init,str,text,log
作用:返回值為1,表示最近的值與之前的值不同,0為相同。
例如:diff(0)>0 ===>表示現在獲取的值如果和之前的不同就告警
例如:
1.3 Zabbix Web創建觸發器過程以及觸發器與監控項對應關系
(1)創建一個觸發器
我們之前已經創建了一個檢測內存剩余大小的監控項,現在我們給這個監控項加一個觸發器。當內存小於20M時,觸發報警
(2)進行表達器測試
表達式測試成功后,我們創建完畢即可
(3)在服務端進行監控項數據獲取測試
監控項表達式說明
{aaaa:vm.memory.size[available].last()}<20M
aaaa:模版名
vm.memory.size:zabbix監控端向被監控端發送的代號
.last()<20 :last()<=>last(0)<=>last(#1)
[root@localhost ~]# zabbix_get -s 192.168.0.220 -k "vm.memory.size"
1028517888 #獲取對應IP的全部內存總量
[root@localhost ~]# zabbix_get -s 192.168.0.220 -k "vm.memory.size[available]"
794337280 #獲取對應IP的剩余內存總量
1.4 為了讓同學們體會深刻,我們再創建一個監控項同時創建它的觸發器
(1)快速創建一個Agent_ping監控項
(2)在監控端測試監控項的鍵值
[root@localhost ~]# zabbix_get -s 192.168.0.220 -k "agent.ping"
1
[root@localhost ~]# zabbix_get -s 192.168.0.221 -k "agent.ping"
1
[root@localhost ~]# zabbix_get -s 192.168.0.222 -k "agent.ping"
zabbix_get [11715]: Get value error: cannot connect to [[192.168.0.222]:10050]: [113] No route to host
我們發現如果對方服務器IP能ping通,則返回值是1。反之不是1就有問題
(3)創建監控項的告警觸發器
到這里就創建完畢了,請同學們仔細體會這個過程。
二,Zabbix常用模版與觸發器功能詳解
(1){Template App Zabbix Agent:agent.version.diff(0)}>0
解釋:
如果當前獲取的agent客戶端的版本號大於前一次的不同,那么觸發告警
(2){Template App Zabbix Agent:agent.ping.nodata(5m)}=1
解釋:
如果ping客戶端在5分鍾內都沒有數據,那么觸發告警
(3){Template OS AIX:vm.memory.size[available].last(0)}<20M
解釋:
如果最后一次獲取的空閑內存大小得值小於20M,那么觸發告警
(4){Template App SSH Service:net.tcp.service[ssh].max(#3)}=0
解釋:
如果ssh遠程連接連續獲取的3次值的最大值都是0,那么觸發告警
(5){Template ICMP Ping:icmppingloss.min(5m)}>20
解釋:
如果連續5分鍾里獲取的最小值都大於20,那么觸發告警
(6){Template ICMP Ping:icmppingsec.avg(5m)}>0.15
解釋:
如果連續5分鍾內的平均值大於0.15,那么觸發告警
三,Zabbix報警媒介類型設置和告警動作、頻率設置
3.1 QQ郵件告警平台
3.1.1 安裝sendmail
[root@localhost ~]# wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz
[root@localhost ~]# yum -y install perl-Net-SSLeay perl-IO-Socket-SSL
[root@localhost ~]# tar xf sendEmail-v1.56.tar.gz -C /usr/local/
[root@localhost ~]# cd /usr/local/sendEmail-v1.56/
[root@localhost sendEmail-v1.56]# /bin/cp -ra sendEmail /usr/local/bin/
[root@localhost sendEmail-v1.56]# chmod +x /usr/local/bin/sendEmail
[root@localhost sendEmail-v1.56]# which sendmail
/usr/sbin/sendmail
3.1.2 sendmail命令使用說明
命令/參數 | 內容 | 解釋說明 |
---|---|---|
/usr/local/bin/sendEmail | 無 | 命令主程序 |
-f | from@163.com | 發件人郵箱 |
-t | to@163.com | 收件人郵箱 |
-s | smtp.163.com | 發件人郵箱的smtp服務器 |
-u | "我是郵件主題" | 郵件的標題 |
-o | message-content-type=html | 郵件內容的格式,html表示它是html格式 |
-o | message-charset=utf8 | 郵件內容編碼 |
-xu | from@163.com | 發件人郵箱的用戶名 |
-xp | 123456 | 發件人郵箱密碼(授權碼) |
-m | "我是郵件內容" | 郵件的具體內容 |
3.1.3 調整QQ郵箱設置
測試郵件發送
[root@localhost sendEmail-v1.56]# sendEmail -f 215379068@qq.com -t 215379068@qq.com -u "zabbix_server" -s smtp.qq.com -o message-content-type=html -o message-charset=utf8 -xu 215379068@qq.com -xp rtqnwthiqajdbihd -m "郵件發送成功"
Jan 19 18:09:10 localhost sendEmail[2403]: Email was sent successfully!
3.1.4 編寫QQ郵件平台報警腳本
[root@localhost alertscripts]# pwd
/usr/local/zabbix/share/zabbix/alertscripts
[root@localhost alertscripts]# cat sendmail.sh
#!/bin/bash
# author:Mr.chen
to=$1
subject=$2
body=$3
from=215379068@qq.com
smtp=smtp.qq.com
passwd=rtqnwthiqajdbihd
/usr/local/bin/sendEmail -f "$from" -t "$to" -s "$smtp" -u "$subject" -o message-content-type=html -o message-charset=utf8 -xu "$from" -xp "$passwd" -m "$body"
[root@localhost alertscripts]# chmod +x sendmail.sh
[root@localhost alertscripts]# chown zabbix.zabbix sendmail.sh
3.1.5 腳本測試
[root@localhost alertscripts]# sh sendmail.sh 215379068@qq.com "hello world" "新的一天"
Jan 19 18:20:32 localhost sendEmail[2478]: Email was sent successfully!
3.1.6 修改zabbix_server.conf配置文件
[root@localhost alertscripts]# cat -n /usr/local/zabbix/etc/zabbix_server.conf | grep "447"
447 # AlertScriptsPath=${datadir}/zabbix/alertscripts
#將上述內容修改成如下所示
[root@localhost alertscripts]# cat -n /usr/local/zabbix/etc/zabbix_server.conf | grep "447"
447 AlertScriptsPath=/usr/local/zabbix/share/zabbix/alertscripts
#重啟zabbix_server服務
[root@localhost zabbix]# /etc/init.d/zabbix_server restart
Shutting down zabbix_server: [ OK ]
Starting zabbix_server: [ OK ]
3.1.7 創建報警媒介
3.1.8 創建報警動作
步驟1-3也就是從1開始到3結束。一旦發生故障,就是執行sendmail.sh腳本發生報警郵件給zabbix用戶。
假如故障持續了1個小時,它也只發送3次,第1-3次(即前3次)郵箱發送給zabbix用戶,時間間隔為0秒。
如果改成1-0,0是表示不限制,無限發送。
3.1.9 QQ郵件報警測試
給自定義監控項nginx.avtive創建一個觸發器,如下
利用Web進行訪問,增加活動連接數,觸發報警
3.2 微信報警平台
3.2.1 注冊微信報警平台並綁定微信號
企業號注冊連接:https://qy.weixin.qq.com/cgi-bin/loginpage
3.2.2 編寫微信平台報警腳本
編寫腳本前,我們需要先記住3個關鍵的參數
(1)企業的CorpID
(2)企業的Secret
(3)部門ID號
然后我們就可以編寫微信告警腳本了,如下:
[root@Zabbix_Server alertscripts]# cat weixin.sh
#!/bin/bash
# author:Mr.chen
CropID="########" #這里填寫我們的應用的CropID
Secret="#######" #這里是應用的Secret
#下面的GURL和PURL地址無需改變,不用做任何變動
GURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CropID&corpsecret=$Secret"
Gtoken=`/usr/bin/curl -s -G $GURL | awk -F\" '{print $10}'`
PURL="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$Gtoken"
function body() {
local int AppID=1000002 #這里是創建的應用ID
local UserID=$1 #接收消息用戶,系統傳參
local PartyID=1 #接收消息的部門ID
local Msg=`echo "$@" | cut -d" " -f3-`
printf '{\n'
printf '\t"touser": "'"$UserID"\"",\n"
printf '\t"toparty": "'"$PartyID"\"",\n"
printf '\t"msgtype": "text",\n'
printf '\t"agentid": "'" $AppID "\"",\n"
printf '\t"text": {\n'
printf '\t\t"content": "'"$Msg"\""\n"
printf '\t},\n'
printf '\t"safe":"0"\n'
printf '}\n'
}
/usr/bin/curl --data-ascii "$(body $1 $2 $3)" $PURL
3.2.3 腳本測試
[root@Zabbix_Server alertscripts]# chmod +x weixin.sh
[root@Zabbix_Server alertscripts]# chown zabbix.zabbix weixin.sh
[root@Zabbix_Server alertscripts]# sh weixin.sh yinsendemogui "題目" "報警內容"
{"errcode":0,"errmsg":"ok","invaliduser":"#######"}
3.2.4 創建微信報警媒介類型
3.2.5 設定報警動作
3.2.6 微信平台報警測試
3.3 自定義自動報警的內容
(1)自定義內容樣例
如果不修改報警的內容格式,看起來太亂了。我們可以按照如下方式修改
#告警通知格式樣例
#題目
A故障:{TRIGGER.STATUS},服務器:{HOSTNAME1}發生:{TRIGGER.NAME}故障!
#內容
告警主機: ;{HOSTNAME1}<br/>
告警時間: ;{EVENT.DATE} {EVENT.TIME}<br/>
告警等級: ;{TRIGGER.SEVERITY}<br/>
告警信息: ;{TRIGGER.NAME}<br/>
告警項目: ;{TRIGGER.KEY1}<br/>
問題詳情: ;{ITEM.NAME} {ITEM.VALUE}<br/>
當前狀態: ;{TRIGGER.STATUS} {ITEM.VALUE1}<br/>
事件ID: ;{EVENT.ID}
(2)樣例測試
四,用戶參數User parameters
4.1 概述
有時候當我們監控的項目在Zabbix預定義的key中沒有定義時,這時候我們可以通過編寫Zabbix的用戶參數的方法來監控我們要求的項目item。形象一點說Zabbix代理端配置文件中的User parameters就相當於通過腳本獲取要監控的值,然后把相關的腳本或者命令寫入到配置文件中的User parameter中,然后Zabbix server讀取配置文件中的返回值通過處理前端的方式返回給用戶。
用戶參數的語法
UserParameter=<key>,<command>
其中,Userparameter為關鍵字,key為用戶自定義key名字可以隨便起,
為我們要運行的命令或者腳本。
一個簡單的例子:
UserParameter=ping,echo 1
代理程序將會永遠的返回1,當我們在服務器端添加item的key為ping的時候。
稍微復雜的例子:
UserParameter=mysql.ping,/usr/local/mysql/bin/mysqladmin ping | grep -c alive
- 當我們執行mysqladmin -uroot ping命令的時候如果mysql存活要返回mysqld is alive,我們通過grep -c來計算mysqld is alive的個數,如果mysql存活着,則個數為1,如果不存活很明顯mysqld is alive的個數為0,通過這種方法我們可以來判斷mysql的存活狀態。
- 當我們在服務器端添加item的key為mysql.ping時候,對於Zabbix代理程序,如果mysql存活,則狀態將返回1,否則,狀態將返回0。
4.2 讓key接受參數
讓key也接受參數的方法使item添加時更具備了靈活性,例如系統預定義key:vm.memory.size[
],其中的mode模式就是用戶要接受的參數,當我們填寫為free時則返回的為內存的剩余大小,如果我們填入的為userd時這返回的是內存已經使用的大小。
相關語法:
UserParameter=key[*],command
#描述:
key:key的值在主機系統中必須是唯一的,其中*代表命令中接受的參數
command:客戶端系統中可執行的命令
#舉例:
UserParameter=ping[*],echo $1
ping[0]:此時0就是*,也就是傳入參數是0,$1也就是0,因此表達式將一直返回‘0’
ping[aaa]:此時aaa就是*,也就是傳入參數是aaa,$1也就是aaa,因此表達式將一直返回‘aaa’
4.3 讓我們自定義一個可以傳遞參數的監控項
我們做一個可以根據條件獲取內存數值大小的監控項mem_check
當我們鍵值為mem_check[free]時,獲取剩余可用內存大小
當我們鍵值為mem_check[used]時,獲取實際占用內存大小
當我們鍵值為mem_check時,獲取總內存大小
4.3.1 我們先制作一個獲取數據的腳本
[root@Zabbix_Server ~]# mkdir -p /server/scripts
[root@Zabbix_Server ~]# cd /server/scripts/
[root@Zabbix_Server scripts]# cat mem_check
#!/bin/bash
# author:Mr.chen
case $1 in
free)
echo "`free | awk 'NR==3{print $4}'`"
;;
used)
echo "`free | awk 'NR==3{print $3}'`"
;;
*)
echo "`free | awk 'NR==2{print $2}'`"
;;
esac
4.3.2 測試腳本
[root@Zabbix_Server scripts]# chmod +x mem_check
[root@Zabbix_Server scripts]# chown zabbix.zabbix mem_check
[root@Zabbix_Server scripts]# sh mem_check
1004412
[root@Zabbix_Server scripts]# sh mem_check free
782492
[root@Zabbix_Server scripts]# sh mem_check used
221912
4.3.3 后台自定義一個監控項的鍵值
[root@Zabbix_Server ~]# cd /etc/zabbix/zabbix_agentd.d/
[root@Zabbix_Server zabbix_agentd.d]# cat mem_check.conf
UserParameter=mem.check[*],/server/scripts/mem_check $1
4.3.4 測試自定義的鍵值
#重啟zabbix-agent客戶端
[root@Zabbix_Server zabbix_agentd.d]# /etc/init.d/zabbix-agent restart
Shutting down Zabbix agent: [ OK ]
Starting Zabbix agent: [ OK ]
[root@Zabbix_Server zabbix_agentd.d]# zabbix_get -s 192.168.0.220 -p 10050 -k "mem.check"
1004412
[root@Zabbix_Server zabbix_agentd.d]# zabbix_get -s 192.168.0.220 -p 10050 -k "mem.check[free]"
782676
[root@Zabbix_Server zabbix_agentd.d]# zabbix_get -s 192.168.0.220 -p 10050 -k "mem.check[used]"
221744
4.3.5 前台自定義一個監控項及觸發器
過程略,此時我相信同學們已經會了。請同學們自己嘗試創建完整。
五,Agentd主動模式與被動模式
默認情況下,zabbix server會直接去每個agent上抓取數據,這對於agent來說,是被動模式,也是默認的一種獲取數據的方式,但是,當zabbix server監控主機數量過多的時候,由server端去抓取agent上的數據,zabbix server會出現嚴重的性能問題,主要表現如下:
- [x] :Web操作很卡,容易出現502
- [x] :圖層斷裂
- [x] :開啟的進程(Pollar)太多,即使減少item數量,以后加入一定量的機器也會有問題
所以,下面主要往兩個優化方向考慮:
- [x] :用Proxy或者Node模式做分布式監控
- [x] :調整Agentd為主動模式
5.1 Agentd的配置調整
修改zabbix_agentd.conf配置文件,注意是打開如下參數:
ServerActive=192.168.0.220
Hostname=192.168.0.220
StartAgents=1
ServerActive是指定Agentd收集的數據往哪里發送,Hostname是必須要和zabbix web端添加主機時的主機名對應起來,這樣zabbix server端接收到數據才能找到對應關系,這里為了兼容被動模式,沒有把StartAgents設為0,如果一開始就是使用主動模式的話建議把StartAgents設為0,關閉被動模式。
5.2 zabbix Server端配置調整
如果開啟了agent端的主動發送數據模式,需要在zabbix Server端修改如下兩個參數,保證性能。
StartPollers=10 #把這個zabbix Server主動收集數據進程減少一些。
StartTrappers=200 #把這個負責處理Agentd推送過來的數據的進程開大一些。
5.3 調整模版
- 因此收集數據的模式發生了變化,因此需要把所有的監控項的類型由原來的“zabbix客戶端”改成“zabbix客戶端(主動式)”。
- 這樣,只需要簡單的幾步,就完成了主動模式的切換,調整之后服務器不卡了,圖層不裂了,進程也少了。