前兩天接到一個需求,要求對現(xiàn)有網(wǎng)域中的關鍵業(yè)務主機進行時鐘監(jiān)控,若發(fā)現(xiàn)時鐘偏移超過規(guī)定秒數(shù)則自動發(fā)警告給管理員。
創(chuàng)新互聯(lián),為您提供網(wǎng)站建設公司、重慶網(wǎng)站制作、網(wǎng)站營銷推廣、網(wǎng)站開發(fā)設計,對服務酒店設計等多個行業(yè)擁有豐富的網(wǎng)站建設及推廣經(jīng)驗。創(chuàng)新互聯(lián)網(wǎng)站建設公司成立于2013年,提供專業(yè)網(wǎng)站制作報價服務,我們深知市場的競爭激烈,認真對待每位客戶,為客戶提供賞心悅目的作品。 與客戶共同發(fā)展進步,是我們永遠的責任!
閱讀微軟官方的NTP服務相關文檔得知,windows網(wǎng)域環(huán)境中維持每臺客戶端主機與DC之間時鐘同步的一個關鍵服務就是w32time,我們在cmd下下如下指令可以看到:
關于時鐘同步的原理這里就不多講了,反正最終所有網(wǎng)域主機其實都是與域中的根PDC進行同步。在上面的輸出中我們可以看到指定主機的時鐘與本地主機間的時鐘時差為+0.0109190s,關鍵點來了。試想,如果能將指令中的computers指向根PDC(這個不難做到),然后將此命令輸出內(nèi)容中的時差值抓取出來與我們自定的時鐘偏移閾值進行比較,超過則告警(透過Nagios郵件、短信等),反之則顯示正常。這樣問題不就明了:如有哪一臺主機的w32time服務未正常啟動,或啟動了但未發(fā)揮作用讓時鐘自動與PDC同步,那么就會造成時差,當時差超過某個點時就告警。
想到了我們就開干,由于之前用過一段時間vbs,能寫一小點vbs腳本,故找出vbs參考手冊,查以下以下幾個關鍵點:
1、如何從用vbs截取出cmd命令的輸出內(nèi)容?
2、如何從指定內(nèi)容中搜尋出需要的字符串?如上圖我們要在w32tm命令的輸出中找出時差值。
3、如何讓vbs讀取我們設定的參數(shù)列?Nagios中配置命令時需要。
4、如何設定Nagios和NSClient將vbs腳本的執(zhí)行結果傳回Nagios并觸發(fā)警告?
以上是大的思考方向。
下面給出我的解決方法,不講原理,只寫步驟,因為原理太多了,本人口拙,一兩句說不清楚。
我用的環(huán)境是Centos Nagios-3.x NSClient-0.4.1.101 windows基本所有版本都有
注意:對于win7以前的系統(tǒng)比如xp,win2003和以后如win2008R2,此w32tm的用法會稍有不同的,建議用之前先w32tm/?一下看看幫助文檔。
1、google上找到一個check_time.vbs的腳本,弄下來研究了一下,基本符合我們上面的需求,稍加改寫:
源碼下載地址,源碼對win7前的系統(tǒng)兼容有問題,就是上面提到的注意。
改寫后:將下面代碼拷貝下來,另存為check_time.vbs文件,以下代碼對win7前后系統(tǒng)均兼容。
Set Args = WScript.Arguments If WScript.Arguments.Count < 3 Then Err = 3 WScript.Echo "check_time.vbs V1.01" WScript.Echo "Usage: cscript /NoLogo check_time.vbs serverlist warn crit [biggest]" Wscript.Echo "" Wscript.Echo "Options:" Wscript.Echo " serverlist (required): one or more server names, coma-separated" Wscript.Echo " warn (required): warning offset in seconds, can be partial" Wscript.Echo " crit (required): critical offset in seconds, can be partial" Wscript.Echo " biggest (optional): if multiple servers, else use default least offset" Wscript.Echo "" Wscript.Echo "Example:" Wscript.Echo "cscript /NoLogo check_time.vbs myserver1,myserver2 0.4 5 biggest" Wscript.Quit(Err) '如果參數(shù)數(shù)量小于3,則返回錯誤碼Err=3 End If serverlist = Args.Item(0) ' one or more server names, coma-separated warn = Args.Item(1) ' warning offset in seconds, can be partial crit = Args.Item(2) ' if multiple servers, else use default least offset If WScript.Arguments.Count > 3 Then criteria = Args.Item(3) Else criteria = least '等于3則取最小值 End If Set objShell = CreateObject("Wscript.Shell") strCommand = "%SystemRoot%\System32\w32tm.exe /monitor /computers:" & serverlist set objProc = objShell.Exec(strCommand) input = "" strOutput = "" Do While Not objProc.StdOut.AtEndOfStream input = objProc.StdOut.ReadLine If InStr(input, "NTP") Then 'input中不包含“NTP”字符串,則InStr返回值0,跳到End If strOutput = strOutput & input End If Loop Set myRegExp = New RegExp myRegExp.IgnoreCase = True myRegExp.Global = True myRegExp.Pattern = " NTP: ([+-][0-9]+\.[0-9]+)s" Set myMatches = myRegExp.Execute(strOutput) result = "" If myMatches(0).SubMatches(0) <> "" Then result = myMatches(0).SubMatches(0) End If For Each myMatch in myMatches If myMatch.SubMatches(0) <> "" Then If criteria = "biggest" Then If abs(result) < Abs(myMatch.SubMatches(0)) Then result = myMatch.SubMatches(0) End If Else If abs(result) > Abs(myMatch.SubMatches(0)) Then result = myMatch.SubMatches(0) End If End If End If ' Wscript.Echo myMatch.SubMatches(0) & " -debug" Next If result = "" Then Err = 3 Status = "UNKNOWN" ElseIf Abs(result) > Abs(crit) Then Err = 2 status = "CRITICAL" ElseIf Abs(result) > Abs(warn) Then Err = 1 status = "WARNING" Else Err = 0 status = "OK" End If Wscript.Echo "NTP " & status & ": Offset " & result & " secs|offset=" & result & "s;" & warn & ";" & crit & ";" Wscript.Quit(Err)
2、將上面的check_time.vbs腳本放到NSClient安裝目錄的:
C:\Program Files\NSClient++\scripts\lib
3、修改NSClient的配置文件nsclient.ini,加上以下內(nèi)容:
[/settings/external scripts/scripts] timevbs = cscript.exe //T:30 //NoLogo scripts\\lib\\check_time.vbs 10.40.1.190 5 10
這個配置文件的寫法還是很講究的,此處花了我相當多的時間進行調(diào)試,汗。最終官網(wǎng)找到以下兩篇文章,參考解決:
http://nsclient.org/nscp/wiki/CheckExternalScripts
http://www.nsclient.org/nscp/discussion/topic/1079
4、寫一個vbs腳本,每臺主機上執(zhí)行腳本后就會自動拷貝修改好的nsclient.ini和check_time.vbs到指定目錄。當然可以批量派發(fā)執(zhí)行。
Dim fso Set fso = CreateObject("Scripting.FileSystemObject") fso.CopyFile "\\10.40.1.129\ShareFolder\Linux\check_time.vbs","C:\Program Files (x86)\NSClient++\scripts\lib\",True fso.CopyFile "\\10.40.1.129\ShareFolder\Linux\nsclient.ini","C:\Program Files (x86)\NSClient++\",True '對于32位的系統(tǒng),此路徑設置會稍有不同 Set objShell = CreateObject("Wscript.Shell") objShell.Run"cmd /k net stop nscp && net start nscp",vbhide
5、以上都是針對被監(jiān)控端進行的配置,完成后我們建議先到Nagios中進行測試,如下
[root@pcnnagios libexec]# ./check_nrpe -H 10.40.1.106 -c timevbs NTP OK: Offset -0.3144475 secs|'offset'=-0.31444s 'Warning'=5 'Critical'=10
沒問題,可以看到測試OK,輸出結果也符合我們vbs腳本編寫的預期。
6、萬事俱備,那下面就該進行Nagios的命令和服務配置了,此處直接貼配置,細節(jié)上可以因人而異進行微調(diào)。
command.cfg內(nèi)添加以下:
# 'check_time' command definition define command{ command_name check_time command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c timevbs }
service.cfg下添加以下:
define service{ use generic-service,srv-pnp hostgroup_name windows-servers service_description Check Time Sync check_command check_time }
7、以上所有步驟弄完后,可以到我們的Nagio服務監(jiān)控界面檢驗成果了,
如上service.cfg的配置中,我們有設定用pnp4nagios進行繪圖:
8、擴散一下思維:參考此方法,那么我們以后想透過nagios利用Windows中的腳本,如vbs、bat、powershell等監(jiān)控windows主機的其他應用或功能也水道渠成了。前提是要會寫對應功能的腳本,至少要看得懂吧。。。
網(wǎng)站題目:Nagios利用vbs腳本監(jiān)控windows主機舉例之NTP
標題路徑:http://www.rwnh.cn/article32/jcjppc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、小程序開發(fā)、定制網(wǎng)站、云服務器、域名注冊、網(wǎng)站維護
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)