圍繞Zabbix打造面向應用的自動監控系統
原創目前開源網絡監控系統Zabbix在不少企業得到了應用,但是Zabbix自身所能監控的粒度和深度都難以滿足企業運維管理的深層次需求,特別是對于應用系統的可用性監控方面存在較大的缺陷。本文結合某公司的IT基礎架構,通過對Zabbix監控系統實施二次開發和改造,實現了對部分應用系統可用性狀態的實時監控;本文對具體的改造方法和思路進行了詳細闡述,并給出了改造后的自動監控系統的運行效果,希望對各位同行在企業IT基礎設施監控方面有所啟發。
一.背景
Zabbix是一個較為成熟的基于WEB界面的提供分布式系統監控以及網絡監視功能的企業級開源解決方案。相信了解Linux和開源監控系統的運維管理人員對Zabbix并不陌生,由于Zabbix部署的靈活性以及開源的特征,目前不少企業已經部署Zabbix來對自身的IT基礎設施的運行狀態進行實時監控;筆者所在的公司也不例外,兩年前就已經嘗試部署Zabbix,目前已經將公司大部分服務器和網絡設備納入了Zabbix監控范圍,使Zabbix成為運維管理人員最為倚仗的故障監控利器。
但是目前Zabbix僅僅只能對一些比較常規的CPU利用率、端口狀態、流量、進程使用等項目進行監控,難以針對應用和服務的可用性進行實時監控,即使是最新的2.2版本,面向應用的監控方面仍然沒有大的改進。而當前隨著各類應用復雜性的提高,導致各類應用出現故障的原因越來越難以排查,如果和過去一樣,僅僅只是針對服務器的CPU、內存、進程等常規項目實施監控,在某些情況下就難以發現應用的異常,不能起到實時監控的效果;因為一個應用出現異常,很多時候并不是CPU、內存等一些常規問題所引起的,而是系統自身的BUG或負載有限等一些隱秘的原因所引起的,所以有時候Zabbix顯示常規的監控項目狀態都正常,但是應用實際已經不可用,這樣就失去了自動監控的意義。
為了彌補Zabbix針對應用監控方面的不足,本文圍繞Zabbix監控系統做了深入的研究,結合運維自動化的思想,開發出一套能夠支持部分常見應用的自動監控系統;該系統是在已有Zabbix系統的基礎上進行二次開發所形成的,并不影響之前針對服務器和網絡設備的監控效果。該系統已經在本公司范圍內得到應用,目前能夠針對DHCP、Radius認證、Wins以及SSLVPN系統實施可用性的自動監控。
二.系統設計思路
既然傳統的Zabbix監控項目難以反映出各類應用系統是否正常,只有親自使用系統才能真正判斷出應用系統是否可用,但是要做到實時監控,就必須用到運維自動化的相關技術了,否則單憑人工操作是無法保證監控的時效性的。本文正是利用運維自動化的核心技術-腳本編程技術來實現,我們采用腳本程序來模擬客戶端或用戶訪問應用系統的流程,將該流程自動化、程序化,利用Zabbix監控系統的接口將系統狀態傳遞給Zabbix,通過Zabbix系統的Trigger判斷,將應用系統的可用狀態的變更以頁面、郵件或者短信的方式展示給運維管理人員,以達到實時監控的目的。
本監控系統可分為兩大模塊:模擬用戶行為模塊和應用狀態感知模塊。這兩大模塊彼此關聯協作,由模擬用戶行為模塊不斷循環獲取應用的狀態,然后將狀態傳遞給應用狀態感知模塊,應用狀態感知模塊經過判斷,將狀態信息以多種方式展示給運維管理人員。下面將對這兩大模塊分別進行介紹。
1. 模擬用戶行為模塊
該模塊會根據提取出的用戶操作流程,將用戶使用應用系統的一系列操作利用程序來自動實現,然后將程序的操作結果記錄下來,提供給后續的應用狀態感知模塊進行判斷,下圖1為該模塊的詳細流程圖:
圖1 模擬用戶行為模塊流程圖
2. 應用狀態感知模塊
該模塊接受模擬用戶行為模塊所傳遞的應用系統狀態的信息,分析該狀態信息,然后將信息展示給運維管理人員;若出現服務狀態的變更,還會以短信、郵件等多種方式實時通知管理員。該模塊的功能均由Zabbix監控系統自身承擔;下圖2即為應用狀態感知模塊的詳細流程圖:
圖2 應用狀態感知模塊流程圖
三.系統的具體實現
本系統目前已經實現了對公司的DHCP、Radius認證、Wins服務及SSLVPN應用系統的可用性的實時監控,下面將分別進行闡述。
1. DHCP應用狀態的監控
本公司所使用的DHCP服務是由Windows server 2003下提供的,自動實時監控DHCP服務的關鍵在于程序需要不停去模擬用戶利用DHCP服務器獲取IP地址的過程,這個過程可以利用兩條BAT命令"ipconfig /release"和"ipconfig /renew"來表示,即釋放IP和重新獲取IP,如果DHCP應用出現故障,那么主機將無法通過上述兩條命令獲取IP地址,那么其他同網段的主機將無法ping通該主機。我們采用一臺Windows server 2003的主機來作為運行腳本程序的測試主機,該程序采用BAT腳本實現,起到模擬用戶行為的作用,具體BAT腳本程序如下所示:
- @echo off
- :des
- ipconfig /release
- ipconfig /renew
- echo "程序正在運行,勿關閉此窗口!"
- choice /c yn /n /t 10 /d y
- goto des
上述程序代碼將每隔10秒循環執行"ipconfig /release"和"ipconfig /renew"去重新從DHCP服務器獲取IP地址,那么測試主機能否獲得正確的IP地址就代表了DHCP應用是否可用,下一步就需要將該狀態信息傳遞給應用狀態感知模塊,即Zabbix監控系統。
在Zabbix監控系統中我們將會做如下幾步工作:
(1)將DHCP服務器納入監控,安裝Zabbix agent,然后在DHCP server的items中添加一項監控項,各屬性設置如下:Name為"DHCP service test",Key為"icmpping[測試主機的IP,3]",Interval設置為10秒,其他的時間屬性可按照自己的需求進行設置,該監控項的意思是每隔10秒Zabbix服務器將會向測試主機發送3個icmpping包,以此來確認能否與該主機通訊,如果能夠ping通,則返回值為1,否則返回值為0 ;這樣就能判斷該主機是否獲得了正確的IP地址,也就實現了對于DHCP應用狀態的實時監控。
(2)設置一個Trigger,用于判斷DHCP應用狀態是否發生變化,如果發生變化,將在頁面展示報警信息;Trigger屬性設置如下:Name為"DHCP service on DHCPSVR is down"Expression為"{DHCPSVR:icmpping[測試主機的IP,3].last(0)}=0&{DHCPSVR:icmpping[測試主機的IP,3].prev(0)}=0",表示如果程序連續兩次探測DHCP應用均不可用的話,則可以判定DHCP應用出現故障,通過將兩次檢測結果進行與操作,可以有效減少誤報的概率。
(3)設置一個Action,用于設置當event觸發Trigger時,Zabbix應該做出的動作,包括給運維管理人員發送郵件、短信等。Action的主要屬性設置如下:Name為"DHCP Service monitoring",觸發條件Conditions為前面所設置的Trigger"DHCPSVR:DHCP service on DHCPSVR is down",Operations為"Send message to users:管理員",Delay為"Immediately"。該Action的意思是當觸發對應Trigger時,立即向管理員發送報警短信,短信的內容也可以自己定制,在此不再贅述。
2.Radius認證應用狀態的監控
Radius認證服務在很多公司有廣泛應用,用于應用系統和設備登錄的AAA認證;本公司的Radius服務的一項重要應用就是網絡設備的登錄認證。實現Radius認證應用狀態的自動實時監控的關鍵點仍然是提取出用戶使用Radius應用的流程,然后以腳本程序去實現該流程,然后將檢測結果傳遞給Zabbix。本文采用基于SecureCRT平臺的VBScript語言編寫模擬用戶登錄Cisco交換機行為的腳本程序,登錄后會先后出現輸入username和password的提示,利用程序控制輸入合法的用戶名和密碼,,然后回車,如果Radius應用正常,則會進入交換機的配置頁面,如果Radius應用出現故障,則會在一段時間后出現"time out"的提示。我們仍然利用上述那臺Windows server 2003的主機作為測試機,具體的VBScript腳本程序如下所示:
- # $language = "VBScript"
- # $interface = "1.0"
- '該腳本用于探測公司Radius服務的狀態
- Sub Main
- Dim fso,f1
- Set fso=CreateObject("Scripting.FileSystemObject")
- Do While (1)
- crt.Screen.Synchronous=True
- crt.Session.Connect("/telnet 172.19.39.248")
- crt.Screen.WaitForString "Username:"
- crt.Screen.Send "ishare" & vbcr
- crt.Screen.WaitForString "Password:"
- crt.Screen.Send "123456" & vbcr
- crt.Screen.WaitForString ">",2
- judgeString=crt.Screen.Get(12,1,12,20)
- Set f1=fso.OpenTextFile("C:\Radius監控腳本\cosbulk\judge.txt",2,True)
- f1.writeline(judgeString)
- f1.Close()
- 'crt.sleep 500
- crt.Screen.Synchronous=False
- crt.Session.Disconnect
- crt.Sleep 5000
- Loop
- End Sub
上述程序中,172.19.39.248是測試交換機的管理IP,ishare和123456分別為測試用的用戶名和密碼;該腳本程序控制每隔5秒鐘去telnet一下測試交換機,如果輸入用戶名和密碼后能夠正常進入交換機配置界面,那么說明Radius應用是可用的,將顯示的交換機名稱寫入judge.txt文件中;反之,說明Radius應用出現故障,將"time out"信息寫入judge.txt文件中。文件中不同的內容代表了Radius應用的狀態。下一步就需要該狀態信息傳遞給Zabbix監控系統。
在Zabbix監控系統中我們需要做如下幾個方面的操作:
(1)在測試主機的items中加入一項監控項,各屬性如下:Name為"Radius Service status",Key為"vfs.file.regmatch[judge.txt,測試交換機名稱]",Interval為10秒,其他時間屬性可以按照自己需求設置。該監控項的意思是每隔10秒去檢測judge.txt中的內容,如果是測試交換機的名稱,則返回值為1;否則返回0,這樣就能判斷Radius應用是否可用,實現了對其可用性的實時監控。
(2)創建一個Trigger,用于判斷Radius應用狀態是否發生變化,如果發生變化,將在頁面展示報警信息;Trigger屬性設置如下:Name為"Radius Service is down",Expression為"{vfs.file.regmatch[judge.txt,測試交換機名稱].last(0)}=0&{vfs.file.regmatch[judge.txt,測試交換機名稱].prev(0)=0",表示如果程序連續兩次探測Radius應用均不可用的話,則可以判定Radius應用出現故障,通過兩次檢測結果的與操作,可以有效減少誤報的概率。
(3)創建一個Action。Action的主要屬性設置如下:Name為"Radius Service monitoring",觸發條件Conditions為前面所設置的Trigger"Radius service is down",Operations為"Send message to users:管理員",Delay為"Immediately"。該Action的意思是當觸發對應Trigger時,Zabbix將立即向管理員發送報警短信。
3.Wins應用狀態的監控
本公司使用的Wins服務是由Windows server 2003提供的,可以通過"nblookup"這個BAT命令來測試Wins應用是否可用,如果Wins應用正常,則可以將主機名解析為正常的IP地址;反之,則會解析失敗。本文首先將利用nblookup命令解析主機名的腳本程序嵌入Zabbix已有的腳本庫中,以方便后面的調用;具體方式如下:在測試主機上打開Zabbix agent的配置文件"zabbix_agentd.conf",在文件最后加入"UnsafeUserParameters=1"和"UserParameter= service.wins,C:\WINDOWS\system32\nblookup /s Wins服務器IP netsqlsvr | find "主機netsqlsvr的IP"",這樣就將對應的腳本程序以"service.wins"的形式嵌入Zabbix系統中了。在Zabbix系統中所需的設置如下:
(1)在測試主機的items中加入對應監控項,監控項的屬性如下:Name為"Service Wins status",Key為"service.wins",Interval為15秒,其他時間屬性可以按照自己需求設置。該監控項的意思是每隔15秒使用nblookup命令去測試Wins的應用狀態,如果Wins應用狀態正常,則返回netsqlsvr主機的正確IP,否則一段時間后會返回"time out"信息,這樣就實現了對Wins應用狀態可用性的實時監控。
(2)創建一個Trigger,用于判斷Wins應用狀態是否發生變化,如果發生變化,將在頁面展示相應的報警信息;Trigger屬性設置如下:Name為"Wins Service is down",Expression為"{service.wins.strlen(0)}=0",表示如果程序如果沒有獲得正確的解析IP,則判定Radius應用出現故障。
(3)創建一個Action。Action的主要屬性設置如下:Name為"Wins Service monitoring",觸發條件Conditions為前面所設置的Trigger"Wins service is down",Operations為"Send message to users:管理員",Delay設為"Immediately"。該Action的意思是當觸發對應Trigger時,Zabbix將立即向管理員發送報警短信。
4.SSLVPN系統狀態的監控
本公司所使用SSLVPN設備是Juniper SA 6500,該設備為外網用戶提供遠程接入內網辦公的功能,是我司極為重要的網關設備。之前只能利用Zabbix系統對該設備的一些常規參數進行監控,無法獲知該系統的真實可用狀態;下面將介紹對SSLVPN應用系統實現可用性實時監控的方法,目前該方法已經在我司得到應用,收到了良好的效果。我們仍然采用腳本程序來模擬用戶訪問SSLVPN系統,訪問流程如下圖3所示:
圖3 用戶訪問SSLVPN系統流程圖
對于上述流程,本文采用VBScript腳本語言來實現,具體程序代碼如下所示:
- Set WshShell=WScript.CreateObject("WScript.Shell") '創建對象,可以實現虛擬鍵盤
- Set fso=CreateObject("Scripting.FileSystemObject") '創建文件對象
- Set objWMIService = GetObject ("winmgmts:\\.\root\cimv2")
- Sub Close_Process(ProcessName) '強制結束進程函數
- Dim objShell
- Set objShell = wscript.CreateObject("wscript.shell")
- objShell.Run "ntsd -c q -pn " & ProcessName, 0, True
- End Sub
- On Error Resume Next
- Do while(1)
- Set ie=WScript.CreateObject("InternetExplorer.Application") '創建對象,打開IE
- ie.visible=true 'IE轉至前臺
- ie.navigate "http://192.168.103.1" '打開網頁
- Wscript.Sleep 4000
- if ie.busy=false And ie.readystate = 4 then'如果頁面加載成功,則可以進行下一步,
- '如果不能顯示,說明出現問題
- Wscript.Sleep 1000
- WshShell.appactivate"Junos Pulse Secure Access Service"
- Wscript.Sleep 2000
- if instr(1,ie.document.body.innerText,"username",1)>0 Then '如果存在該標簽,表明已經成功顯示登錄頁面
- ie.document.getElementById("Username").value="ishare" '輸入賬號、密碼
- ie.document.getElementById("Password").value="%rdx5tgB"
- Wscript.Sleep 3000 '等3s然后回車,虛擬觸發。
- WshShell.SendKeys "{ENTER}"
- Wscript.Sleep 20000
- '搜索網頁中是否存在內網主頁關鍵字,判斷是否登錄成功
- if ie.busy=false And ie.readystate = 4 then '網頁內容加載完畢
- WshShell.appactivate"Junos Pulse Secure Access Service - 主頁"
- Wscript.Sleep 2000
- strContent=ie.document.body.innerText '讀取網頁內容
- if instr(1,strContent,"內網主頁",1)>0 Then '如果存在該標簽,表明已經成功登錄
- '將1寫入文件
- Set f1=fso.OpenTextFile("C:\SSLVPN監控腳本\cosbulk\judge.txt",2,True)
- f1.writeline(1)
- f1.Close()
- Wscript.Sleep 2000
- WshShell.appactivate"Junos Pulse Secure Access Service - 主頁"
- Wscript.Sleep 2000
- WshShell.SendKeys "{TAB 9}"
- Wscript.Sleep 2000
- WshShell.SendKeys "{ENTER}"
- elseif instr(1,strContent,"已經有其它用戶會話正在進行中:",1)>0 Then
- WshShell.SendKeys "{TAB 2}"
- Wscript.Sleep 2000
- WshShell.SendKeys "{ENTER}" '點擊繼續運行
- Wscript.Sleep 20000
- if ie.busy=false And ie.readystate = 4 then '網頁內容加載完畢
- WshShell.appactivate"Junos Pulse Secure Access Service - 主頁"
- Wscript.Sleep 2000
- strContent=ie.document.body.innerText '讀取網頁內容
- if instr(1,strContent,"內網主頁",1)>0 Then '如果存在該標簽,表明已經成功登錄
- Set f1=fso.OpenTextFile("C:\SSLVPN監控腳本\cosbulk\judge.txt",2,True)
- f1.writeline(1)
- f1.Close()
- Wscript.Sleep 2000
- WshShell.appactivate"Junos Pulse Secure Access Service - 主頁"
- Wscript.Sleep 2000
- WshShell.SendKeys "{TAB 9}"
- Wscript.Sleep 2000
- WshShell.SendKeys "{ENTER}"
- else
- '將0寫入文件
- Set f1=fso.OpenTextFile("C:\SSLVPN監控腳本\cosbulk\judge.txt",2,True)
- f1.writeline(0)
- f1.Close()
- end if
- else
- Set f1=fso.OpenTextFile("C:\SSLVPN監控腳本\cosbulk\judge.txt",2,True)
- f1.writeline(0)
- f1.Close()
- end if
- else
- '將0寫入文件
- Set f1=fso.OpenTextFile("C:\SSLVPN監控腳本\cosbulk\judge.txt",2,True)
- f1.writeline(0)
- f1.Close()
- end if
- else
- Set f1=fso.OpenTextFile("C:\SSLVPN監控腳本\cosbulk\judge.txt",2,True)
- f1.writeline(0)
- f1.Close()
- end if
- else
- Set f1=fso.OpenTextFile("C:\SSLVPN監控腳本\cosbulk\judge.txt",2,True)
- f1.writeline(0)
- f1.Close()
- end if
- else
- Set f1=fso.OpenTextFile("C:\SSLVPN監控腳本\cosbulk\judge.txt",2,True)
- f1.writeline(0)
- f1.Close()
- end if
- ie.quit
- Set ie=nothing
- Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process where Name='dsNcService.exe'")
- For Each objProcess In colProcessList
- Set list = GetObject("winmgmts:").execquery("Select * from Win32_Process where Name='dsNcService.exe'")
- if list.count > 0 then '檢測進程是否存在
- Close_Process "dsNcService.exe"
- end if
- Next
- Wscript.Sleep 5000
- Loop
上述腳本程序將每次檢測SSLVPN系統可用性的結果寫入judge.txt中,1表示系統正常,0表示系統出現故障,下面需要將該狀態信息傳送給Zabbix,由Zabbix做出判斷和展示;在Zabbix需要進行如下設置:
(1)在測試主機的items中加入對應監控項,監控項的屬性如下:Name為"The availability of SSLVPN",Key為"vfs.file.regmatch[judge.txt,1]",Interval為30秒,其他時間屬性可以按照自己需求設置。該監控項的意思是每隔30秒去檢測judge.txt中的內容,如果文件內容是1,則返回值為1;否則返回0,這樣就能判斷SSLVPN系統是否可用,實現了對其可用性的實時自動監控。
(2)創建一個Trigger,用于判斷SSLVPN應用狀態是否發生變化,如果發生變化,將在頁面展示報警信息;Trigger屬性設置如下:Name為"SSLVPN Service is unavailable",Expression為"{vfs.file.regmatch[judge.txt,1].last(0)}=0&{vfs.file.regmatch[judge.txt,1].prev(0)=0";該Trigger表示如果程序連續兩次檢測SSLVPN系統為不可用狀態,則判定SSLVPN應用出現故障。
(3)創建一個Action。Action的主要屬性設置如下:Name為"The SSLVPN monitorning",觸發條件Conditions為前面所設置的Trigger"SSLVPN Service is unavailable",Operations為"Send message to users:管理員",Delay為"Immediately"。該Action的意思是當觸發對應Trigger時,Zabbix會立即向管理員發送報警短信。
四.成果展示
下面將對本系統對于DHCP、Radius認證、Wins和SSLVPN應用系統的自動監控效果進行展示:
(1)DHCP應用的自動監控測試
為測試需要,本文選擇在非工作時間暫停一下DHCP應用,大約20秒以后,Zabbix監控頁面就會出現如下圖4所示的報警信息:
圖4 DHCP應用故障的報警信息
同時,手機也會收到報警短信,但手機不方便截圖,此處省略。然后再恢復DHCP應用,大約20秒后,Zabbix監控頁面的報警信息就會消失,同時手機也會收到DHCP應用恢復的短信。
(2)Radius認證應用的自動監控測試
對于Radius認證應用的監控測試,本文采用同樣的方式暫停一下Radius應用,大約15秒后,Zabbix監控頁面會出現如下圖5所示的報警信息:
圖5 Radius應用故障的報警信息
同時手機也會收到Radius應用故障的報警短信。恢復Radius應用大約15秒后,Zabbix監控頁面的報警信息會消失,手機同樣也能收到Radius應用恢復正常的短信。
(3)Wins應用的自動監控測試
對于Wins應用的監控測試,暫停一下Wins應用后,大約15秒左右,Zabbix監控頁面會出現如下圖6所示的報警信息:
圖6 Wins應用故障的報警信息
同時手機也會收到Wins應用故障的報警短信。恢復Wins應用大約15秒后,Zabbix監控頁面的報警信息會消失,手機同樣也能收到Wins應用恢復正常的短信。
(4)SSLVPN應用的自動監控測試
造成SSLVPN系統不可用的原因有很多,如網絡不通、設備硬軟件故障、Radius認證服務異常(本SSLVPN系統的用戶認證方式采用的是Radius認證)等,本次測試采用模擬Radius認證服務異常來驗證系統的監控效果。暫停一下Radius認證服務之后,大約30秒后,Zabbix監控頁面會出現如下圖7所示的報警信息:
圖7 Radius應用故障和SSLVPN應用系統故障的報警信息
同時手機會收到Radius和SSLVPN應用故障的報警短信。待Radius應用恢復大約30秒后,Zabbix監控頁面的報警信息會消失,手機同樣也能收到Radius和SSLVPN應用恢復正常的短信。
五.總結與展望
本文介紹了開源網絡監控系統Zabbix在應用監控方面的缺陷,結合某公司自身的Zabbix應用實踐經驗,給出了解決Zabbix應用監控方面缺陷的一套方案,即通過二次開發的方式對Zabbix原型系統進行改造,打造一套支持針對應用狀態進行實時監控的自動監控系統。目前該自動監控系統已經在公司內部得到廣泛應用,支持對DHCP、Radius認證、Wins及SSLVPN應用系統狀態的實時監控,我們計劃后期將持續改造該監控系統,盡可能將所有應用系統納入實時監控的范圍。本文重在思路,未來其他有需求的企業可以按照這個思路,結合自身的實際網絡環境對Zabbix實施二次開發,形成符合自身需求的一體化自動監控系統。同時我們也應該持續關注Zabbix系統的版本變更,希望未來Zabbix能夠在應用狀態的實時監控方面有所突破。