分散式監控系統之Zabbix基礎使用

1874發表於2020-11-20

  前文我們瞭解了分散式監控系統zabbix的相關元件的作用和zabbix的部署,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/13997582.html;今天我們來了解下zabbix的基礎使用;

  在開始使用zabbix之前,我們先來了解下zabbix的一些術語

  1、監控項(item):什麼是監控項?

  在zabbix中監控項(item)是一個核心的東西,所有監控都是圍繞監控項展開的,可以說沒有監控項就沒有我們想要的指標資料;所以簡單講監控項就是被監控物件的指標資料,通常這個被監控的物件我們稱為主機(host),它可以是一個網路裝置或一臺伺服器,用ip地址或dns域名指定;一臺主機可以是屬於一個或多個主機組(host group),所謂主機組就是多臺主機的相同集合,用來邏輯的將主機分組,方便統一標識和管理;比如一臺server它可以是tomcat主機組,也可以是nginx主機組,不同主機組可能有不同的監控項;同時對於監控項來講也有類似組的概念,在zabbix中多個監控項邏輯的劃分在一起就是監控項組,但通常我們不叫監控項組,而是叫application;所以application就是多個監控項的邏輯組,一個監控項通常屬於一個或多個application,這個和主機組的邏輯是一樣的;

  2、觸發器(trigger):什麼是觸發器?

  所謂觸發器就是一個表示式,這個表示式主要用來評判我們採集的資料是否處於合理範圍內?如果我們採集的資料是一個非合理範圍,則該表示式就返回true;所以在zabbix中觸發器就是用來定義我們採集到的資料的非合理區間,用於評估某監控物件的某些特定item內所接收到的資料是否在合理範圍內(即閾值),如果接收到的資料大於指定的閾值,此時觸發狀態就會從OK狀態轉變為problem狀態;當資料量再次迴歸到合理範圍時,此時觸發器又會從problem狀態迴歸ok狀態;簡單講觸發器就是用來評估某些監控項採集到資料是否合理,如果不合理,就生成一個觸發器事件(event),而這個事件會被其他元件監聽,一旦監聽到對應的事件產生,其他元件隨之就會採取一定的措施;比如發簡訊、發郵件或者重啟服務等等操作;

  3、動作(action):什麼是action?

  action指當特定的事件產生時,對應該採取的措施,比如當我們監控到nginx服務當機了,此時我們應該採取什麼措施?重啟服務,傳送簡訊通知管理員等等;所以action就是指對於特定事件事先定義的處理方法,通過包含操作(如傳送通知)和條件(何時執行操作);

  4、影像(graphs):什麼是graph?

  graph就是指把對應一個或多個監控項的歷史資料通過影像的方式展示出來,主要方便我們來檢視過去一段時間對應監控項的資料變化情況;我們把一個或多個監控項組合在一起顯示就叫做一個graph;多個graph組成一個螢幕(screen),多個screen組成一個slide show;

  瞭解了以上術語,接下來我們來新增一個主機到zabbix上

  複製zabbix yum倉庫檔案到被監控主機之上

[root@node03 ~]# scp /etc/yum.repos.d/zabbix.repo  node04:/etc/yum.repos.d/
zabbix.repo                                                                   100%  242    98.5KB/s   00:00    
[root@node03 ~]# 

  在被監控主機之上安裝zabbix-agent

[root@node04 ~]# yum install -y zabbix-agent 

  配置zabbix-agent 

[root@node04 ~]# grep -Ei ^[^#] /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=192.168.0.43
ListenPort=10050
ListenIP=0.0.0.0
StartAgents=3
ServerActive=192.168.0.43
HostnameItem=system.hostname
Include=/etc/zabbix/zabbix_agentd.d/*.conf
[root@node04 ~]# 

  啟動zabbix-agent

[root@node04 ~]# systemctl start zabbix-agent.service 
[root@node04 ~]# ss -tnl
State      Recv-Q Send-Q           Local Address:Port                          Peer Address:Port              
LISTEN     0      128                          *:22                                       *:*                  
LISTEN     0      100                  127.0.0.1:25                                       *:*                  
LISTEN     0      128                          *:10050                                    *:*                  
LISTEN     0      128                         :::22                                      :::*                  
LISTEN     0      100                        ::1:25                                      :::*                  
[root@node04 ~]# 

  提示:請確保10050正常監聽並能夠和zabbix正常通訊;

  建立主機組

  提示:登入zabbix web,找到configuration選單---->Host groups ----> create host group;

  提示:填寫對應要建立的主機組名稱,點選add即可;

  新增主機

  提示:找到configuration選單---->Hosts---->create host;預設zabbix把zabbixserver是新增了的,這個也是我們為什麼要在zabbixserver上裝zabbix agent的原因;

  提示:填寫要新增主機的主機名,選擇要歸屬地主機組,以及使用哪種通道去採集資料;在zabbix支援4中通道去採集資料,第一種是agent,就是用zabbix agen採集資料;第二種是snmp,這種常用於那些不能安裝agent的場景中,比如監控網路裝置;第三種是jmx,這種專用於監控java虛擬機器的專有通道;第四種是ipmi,這個必須得硬體支援ipmi協議;選擇對應的通道填寫對應的資訊即可;當然一個主機也可以通過多個通道去採集資料;同一種型別的通道也可以新增多個;填寫好以上內容點選add就把node04新增到zabbix監控系統中了;

  提示:新增好主機以後,在hosts列表中就能看到我們剛才新增到主機,但是它上面的4個通道沒有顯示為綠色;這是因為在我們新增到主機上沒有任何的監控項,所以沒有資料採集,對應的通道也不會變綠,只有新增了監控項,有資料採集了,對應通道就會變綠;

  新增item

  提示:在configuration--->Hosts找到對應主機的items,然後點選進去,找到create item;

  提示:在zabbix中內建了很多item,每個item對應有一個key,這個key就是用來標識監控項的,不同的監控項對應使用的採集方式不同,所以監控項就是定義如何去採集資料,怎麼採集資料的一個函式,我們在應用時,只需要指定key名,以及傳遞必要的引數即可;內建監控項的使用說明請檢視官方文件https://www.zabbix.com/documentation/4.0/manual/config/items/itemtypes/zabbix_agent;填寫了對應的資訊以後,這裡需要注意對應監控項採集到資料到底是一個什麼資料,是一個不斷累加的值?還是變化值?我們要怎麼顯示它?對於cpu上下文切換次數這個監控項採集到的是一個不斷累加的值,相比我們不是想了解這個監控項採集到資料是多少,而是想要它顯示和上一次資料的變化值,所以我們還可設定監控項預處理方案;

  點選左上角的preprocessing

  提示:選擇好對應預處理方式以後,點選最下面的add就可以成功將對應監控項新增到對應主機上;

  檢視對應監控項是否採集到資料?

  提示:在monitoring---->Latest data 選擇對應主機名稱點選apply查詢;如果對應主機上的監控項在指定時間內採集的有資料,則說明我們配置的監控項沒有問題;從上面圖片可以看到對應主機cpu上下文切換次數,最新一次資料是26次,比上一次少一次;

  檢視對應監控項圖形

  點選對應監控項後面的graph按鈕即可顯示對應監控項的影像

  到此,一個監控項就這樣定義好了;要新增第二個監控項也是以上的步驟;

  克隆監控項

  在對應主機的item列表中點選要克隆的監控項

  提示:找到最下面的clone點選即可;

  提示:修改對應名稱和key,點選新增即可;

  提示:監控項克隆主要針對監控同類資料的不同指標用到比較多,像上面就是監控ens33這張網路卡的進站報文數和出站報文數;這也是一種快速新增監控項的方式;

  新增觸發器

  提示:在configuration--->Hosts找到對應主機的Triggers,點選進去,然後找到create trigger按鈕,點選進入建立觸發器的頁面;

  提示:觸發器就是一個表示式,該表示式主要來評判對應item採集到資料是否在合理範圍,如果不在合理範圍該表示式返回true;書寫觸發器表示式可以點選後面的add來選擇;如下

  提示:這個主要用於輔助我們生存觸發器表示式;首先選擇一個item,然後選擇評判的函式,這個函式有很多,預設是last{}函式,這個函式表示取最近幾次或某個時間段的資料來做評判標準,如果是次數,在last of (T) 填寫對應的次數即可;如果是時間,在time shift填寫時間,預設是秒為單位;result是對應評判的標準,比如500,就表示對應觸發器表示式會把item採集的資料和500做對比,如果大於500 就會觸發一個觸發器事件;選擇好條件以後點選inset 就可以自動生成我們定義的觸發器表示式,定義好觸發器以後,點選最下面的add即可新增觸發器到指定主機上;

  檢視對應監控項的graph,看看是否有觸發器呢?

  提示:可以看到對應的item上就可以看到有一個水平線,超過這個線就表示採集到資料不在合理區間,此時就會產生觸發器事件;

  檢視觸發器事件

  提示:在Monitoring--->Problems中就能檢視到對應觸發器事件,這裡顯示該事件已經恢復了;

  新增action

  為了演示能看出效果,先在node04上新增一個監控nginx是否存活的監控項

  新增nginx down觸發器

  提示:以上表示式表示監控nginx狀態最近3次都是down的狀態就生成觸發器事件;

  新增action

 

  提示:action是針對整個zabbix全域性而設定的,只要有對應事件產生,監聽該事件的action就會執行相應的操作,常用的操作有發郵件和遠端執行命令;

  zabbix監控nginx是否啟動,如果沒有啟動就遠端執行命令,讓其啟動

  提示:action常用的操作有兩個,第一個是當觸發器從ok狀態到problem狀態,第二個是從problem到ok狀態

  定義operations操作

  提示:選擇remote command,新增targetlist為當前主機,type為ssh,填寫對應的ssh使用者密碼埠以及執行的命令,點選add,最後點選add;這裡需要注意一點,通常我們使用ssh遠端執行命令,不建議直接使用root執行,如果是其他普通使用者需要注意執行命令是否有許可權,如果沒有還需要注意授權問題;

  到此一個遠端執行命令的action就定義好了;

  測試:在node04上把nginx停掉,看看它是否會自動執行命令將nginx啟動起來呢?

[root@node04 ~]# systemctl stop nginx
[root@node04 ~]# ss -tnl
State      Recv-Q Send-Q           Local Address:Port                          Peer Address:Port              
LISTEN     0      128                          *:22                                       *:*                  
LISTEN     0      100                  127.0.0.1:25                                       *:*                  
LISTEN     0      128                          *:10050                                    *:*                  
LISTEN     0      128                         :::22                                      :::*                  
LISTEN     0      100                        ::1:25                                      :::*                  
[root@node04 ~]# 

  到zabbix上檢視對應監控項的狀態

  檢視是否產生了觸發器事件呢?

  提示:可以看到對應觸發器時間已經產生;我們等待3個檢查週期,看看它是否會觸發我們定義的action呢

  提示:再次檢視該事件已經恢復;

  在node04上檢視nginx是否啟動?

[root@node04 ~]# ss -tnl
State      Recv-Q Send-Q           Local Address:Port                          Peer Address:Port              
LISTEN     0      128                          *:80                                       *:*                  
LISTEN     0      128                          *:22                                       *:*                  
LISTEN     0      100                  127.0.0.1:25                                       *:*                  
LISTEN     0      128                          *:10050                                    *:*                  
LISTEN     0      128                         :::80                                      :::*                  
LISTEN     0      128                         :::22                                      :::*                  
LISTEN     0      100                        ::1:25                                      :::*                  
[root@node04 ~]# 

  提示:可以看到80埠已經正常處於監聽狀態;這說明我們剛才定義的action生效了;

  定義action傳送郵件

  新增傳送郵件的媒介

  提示:預設有3個媒介,這三個媒介是zabbix預設的,建議不使用,直接自己新增;

  提示:這個郵箱的密碼填寫開啟smtp後自動生成的密碼;填寫好對應的郵箱相關資訊後點選add即可;

  編輯admin使用者,配置接收郵件地址

  提示:這裡要選擇我們剛才新增媒介型別;

  編輯nginx down action

  提示:選擇send massage,新增郵件接收人,以及傳送郵件的媒介點選update,最後點選最下面的update;

  測試:在node04上把nginx服務停掉,看看是否會給linux-1874@qq.com傳送郵件呢?

[root@node04 ~]# systemctl stop nginx
[root@node04 ~]# ss -tnl
State      Recv-Q Send-Q           Local Address:Port                          Peer Address:Port              
LISTEN     0      128                          *:22                                       *:*                  
LISTEN     0      100                  127.0.0.1:25                                       *:*                  
LISTEN     0      128                          *:10050                                    *:*                  
LISTEN     0      128                         :::22                                      :::*                  
LISTEN     0      100                        ::1:25                                      :::*                  
[root@node04 ~]# 

  檢視是否產生了觸發器事件?

  提示:可以看到對應的事件已經產生,也執行了郵件傳送;

  登入對應接收郵件的郵箱,檢視是否有收到郵件呢?

  提示:可以看到在對應接收郵件裡有一份zab_server@126.com傳送過來的郵件,告訴我們說node04上的nginx down掉了;我上面只是配置了觸發器從ok到problem狀態時傳送郵件,從problem到ok狀態沒有配置傳送郵件,生產中可以配置上;

  除了以上通過配置媒介的方式使用網際網路郵箱發郵件,還可以使用指令碼方式發郵件

  檢視zabbix server存放告警指令碼路徑

  提示:預設存放告警路徑為:/usr/lib/zabbix/alertscripts/目錄下

  在zabbixserver的/usr/lib/zabbix/alertscripts/目錄下建立sendmail.py指令碼

[root@node03 ~]# cat /usr/lib/zabbix/alertscripts/sendmail.py 
#!/usr/bin/python
#coding:utf-8

import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.utils import parseaddr,formataddr
import sys

def formatAddr(s):
    name,addr = parseaddr(s)
    return formataddr((Header(name,'utf-8').encode(),addr))

def send_mail(to_list,subject,content):
    mail_host = 'smtp.126.com'
    mail_user = 'zab_server@126.com'
    mail_pass = 'XIAEYNSCRHLYFADN'
    msg = MIMEText(content,'','utf-8')
    msg['Subject'] = Header(subject,'utf-8')
    msg['From'] = formatAddr('zabbix監控<%s>' %mail_user).encode()
    msg['to'] = to_list

    try:
        s = smtplib.SMTP()
        s.connect(mail_host)
        s.login(mail_user,mail_pass)
        s.sendmail(mail_user,to_list,msg.as_string())
        s.close()
        return True
    except Exception,e:
        print str(e)
        return False
if __name__ == "__main__":
    send_mail(sys.argv[1],sys.argv[2],sys.argv[3])

[root@node03 ~]# 

  提示:呼叫此指令碼時需要傳遞三個引數給指令碼,第一個引數是接收人的郵件地址,在zabbix中用內建巨集{ALERT.SENDTO}表示,第二個引數是郵件標題,內建巨集為{ALERT.SUBJECT};第三個引數是郵件正文,內建巨集{ALERT.MESSAGE};

  賦予指令碼執行許可權

[root@node03 alertscripts]# chmod +x sendmail.py 
[root@node03 alertscripts]# ll
total 4
-rwxr-xr-x 1 root root 909 Nov 19 23:31 sendmail.py
[root@node03 alertscripts]# 

  測試:手動傳遞引數,看看指令碼是否能夠正常給我們發郵件?

[root@node03 alertscripts]# python sendmail.py 'linux_test01@126.com' 'test' 'this is test mail'
[root@node03 alertscripts]# 

  登入linux_test01@126.com,看看是否有收到郵件?

  提示:在測試郵箱裡能夠看到我們傳送到郵件,說明指令碼沒有問題;

  建立指令碼媒介

  提示:建立媒介型別時,選擇script,寫上指令碼名稱和指令碼需要傳遞引數內建巨集,然後點選add即可;有關zabbix內建巨集的說明請參考官方文件說明https://www.zabbix.com/documentation/4.0/manual/appendix/macros/supported_by_location

  編輯nginx down action,呼叫指令碼來傳送郵件

  更改admin使用者的媒介型別為我們建立的sendmail_script

  測試:停掉node04上的nginx,看看是否會產生觸發器事件?

[root@node04 ~]# systemctl stop nginx
[root@node04 ~]# ss -tnl
State      Recv-Q Send-Q           Local Address:Port                          Peer Address:Port              
LISTEN     0      128                          *:22                                       *:*                  
LISTEN     0      100                  127.0.0.1:25                                       *:*                  
LISTEN     0      128                          *:10050                                    *:*                  
LISTEN     0      128                         :::22                                      :::*                  
LISTEN     0      100                        ::1:25                                      :::*                  
[root@node04 ~]#

  檢視是否有觸發器事件產生?

  檢視對應接收郵箱裡是否收到郵件呢?

  提示:這個郵件可能收到會有延遲,如果上面顯示已經傳送成功,基本上都可以收到;

  配置graph

  提示:configuration---> Hosts找到對應主機中的Graphs,點選進去,找到create graph按鈕進入graph建立介面

  提示:選擇好對應item和其他顯示選項,點選add即可;

  預覽graph

  新增多個item到一個graph中

  預覽

  新增多個graph為一個screen

  提示:預設點選Monitoring --->Screens它顯示的是zabbix server預設的螢幕,我們需要點選allscreens回到上圖位置;點選create screen進入建立螢幕頁面;

  點選建立好的螢幕,編輯screen,新增graph

  提示:按照以上示例,新增其他graph到其他位置即可;

  預覽screen

  建立slide show 

  預覽

  到此,zabbix基礎使用就到此結束了!!

相關文章