溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Nagios利用vbs腳本監(jiān)控windows主機舉例之NTP

發(fā)布時間:2020-07-13 11:40:07 來源:網(wǎng)絡(luò) 閱讀:1433 作者:freehei 欄目:移動開發(fā)

    前兩天接到一個需求,要求對現(xiàn)有網(wǎng)域中的關(guān)鍵業(yè)務(wù)主機進行時鐘監(jiān)控,若發(fā)現(xiàn)時鐘偏移超過規(guī)定秒數(shù)則自動發(fā)警告給管理員。

    閱讀微軟官方的NTP服務(wù)相關(guān)文檔得知,windows網(wǎng)域環(huán)境中維持每臺客戶端主機與DC之間時鐘同步的一個關(guān)鍵服務(wù)就是w32time,我們在cmd下下如下指令可以看到:

Nagios利用vbs腳本監(jiān)控windows主機舉例之NTP

    關(guān)于時鐘同步的原理這里就不多講了,反正最終所有網(wǎng)域主機其實都是與域中的根PDC進行同步。在上面的輸出中我們可以看到指定主機的時鐘與本地主機間的時鐘時差為+0.0109190s,關(guān)鍵點來了。試想,如果能將指令中的computers指向根PDC(這個不難做到),然后將此命令輸出內(nèi)容中的時差值抓取出來與我們自定的時鐘偏移閾值進行比較,超過則告警(透過Nagios郵件、短信等),反之則顯示正常。這樣問題不就明了:如有哪一臺主機的w32time服務(wù)未正常啟動,或啟動了但未發(fā)揮作用讓時鐘自動與PDC同步,那么就會造成時差,當(dāng)時差超過某個點時就告警。

想到了我們就開干,由于之前用過一段時間vbs,能寫一小點vbs腳本,故找出vbs參考手冊,查以下以下幾個關(guān)鍵點:

1、如何從用vbs截取出cmd命令的輸出內(nèi)容?

2、如何從指定內(nèi)容中搜尋出需要的字符串?如上圖我們要在w32tm命令的輸出中找出時差值。

3、如何讓vbs讀取我們設(shè)定的參數(shù)列?Nagios中配置命令時需要。

4、如何設(shè)定Nagios和NSClient將vbs腳本的執(zhí)行結(jié)果傳回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

這個配置文件的寫法還是很講究的,此處花了我相當(dāng)多的時間進行調(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到指定目錄。當(dāng)然可以批量派發(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),此路徑設(shè)置會稍有不同
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,輸出結(jié)果也符合我們vbs腳本編寫的預(yù)期。

 

6、萬事俱備,那下面就該進行Nagios的命令和服務(wù)配置了,此處直接貼配置,細節(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服務(wù)監(jiān)控界面檢驗成果了,

Nagios利用vbs腳本監(jiān)控windows主機舉例之NTP

如上service.cfg的配置中,我們有設(shè)定用pnp4nagios進行繪圖:

Nagios利用vbs腳本監(jiān)控windows主機舉例之NTP

 

 

8、擴散一下思維:參考此方法,那么我們以后想透過nagios利用Windows中的腳本,如vbs、bat、powershell等監(jiān)控windows主機的其他應(yīng)用或功能也水道渠成了。前提是要會寫對應(yīng)功能的腳本,至少要看得懂吧。。。

 

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI