如何编写 Nagios 插件 (http://zener.blog.51cto.com/937811/727685)
如何編寫(xiě) Nagios 插件
Nagios 的最激動(dòng)人心的方面是可以輕松地編寫(xiě)您自己的插件,只需要了解一些簡(jiǎn)單的指導(dǎo)原則即可。為了管理插件,Nagios 每次在查詢一個(gè)服務(wù)的狀態(tài)時(shí),產(chǎn)生一個(gè)子進(jìn)程,并且它使用來(lái)自該命令的輸出和退出代碼來(lái)確定具體的狀態(tài)。退出狀態(tài)代碼的含義如下所示:
- OK?—退出代碼 0—表示服務(wù)正常地工作。
- WARNING?—退出代碼 1—表示服務(wù)處于警告狀態(tài)。
- CRITICAL?—退出代碼 2—表示服務(wù)處于危險(xiǎn)狀態(tài)。
- UNKNOWN?—退出代碼 3—表示服務(wù)處于未知狀態(tài)。
最后一種狀態(tài)通常表示該插件無(wú)法確定服務(wù)的狀態(tài)。例如,可能出現(xiàn)了內(nèi)部錯(cuò)誤。
下面提供了一個(gè) Python 示例腳本,用于檢查 UNIX? 平均負(fù)載。它假定 2.0 以上的級(jí)別表示警告狀態(tài),而 5.0 以上的級(jí)別表示危險(xiǎn)狀態(tài)。這些值都采用了硬編碼的方式,并且始終使用最近一分鐘的平均負(fù)載。
清單 5. Python 插件—示例工作插件
| #!/usr/bin/env python import os,sys (d1, d2, d3) = os.getloadavg() if d1 >= 5.0: print "GETLOADAVG CRITICAL: Load average is %.2f" % (d1) sys.exit(2) elif d1 >= 2.0: print "GETLOADAVG WARNING: Load average is %.2f" % (d1) sys.exit(1) else: print "GETLOADAVG OK: Load average is %.2f" % (d1) sys.exit(0) |
?
在編寫(xiě)了這個(gè)小的可執(zhí)行插件之后,接下來(lái)是使用 Nagios 注冊(cè)該插件,并創(chuàng)建一個(gè)檢查平均負(fù)載的服務(wù)定義。
這項(xiàng)工作也是非常簡(jiǎn)單的:使用下面的內(nèi)容創(chuàng)建一個(gè)名為?/etc/nagios-plugins/config/mygetloadavg.cfg?的文件,根據(jù)下面的示例,向?services.cfg?文件添加一個(gè)服務(wù)。請(qǐng)記住,必須在?hosts.cfg?配置文件中定義?localhost。
清單 6. 示例插件—使用 Nagios 進(jìn)行注冊(cè)
| define command{ command_name check_mygetloadavg command_line /path/to/check_getloadavg } |
清單 7. 創(chuàng)建一個(gè)使用示例插件的服務(wù)
| define service{ use service-template host_name localhost service_description LoadAverage check_period 24x7 contact_groups server-admins notification_options c,r check_command check_mygetloadavg } |
?
編寫(xiě)一個(gè)完整的插件
前面的示例說(shuō)明了一個(gè)采用“硬編碼”方式插件的限制,它不支持運(yùn)行時(shí)配置。在實(shí)際中,通常最好的方式是創(chuàng)建一個(gè)可配置的插件。通過(guò)這種方式,您可以創(chuàng)建和維護(hù)一個(gè)插件,使用 Nagios 將其注冊(cè)為單個(gè)插件,并且傳遞參數(shù)以便為特定的情況自定義警告和危險(xiǎn)水平。下一個(gè)示例還包括一則使用消息;經(jīng)過(guò)證實(shí),對(duì)于由幾個(gè)不同的開(kāi)發(fā)人員或者管理員所使用或維護(hù)的插件,這是非常有價(jià)值的。
另一個(gè)好的實(shí)踐是捕獲所有的異常,并后退以報(bào)告 UNKNOWN 服務(wù)狀態(tài),以便 Nagios 能夠正確地管理有關(guān)這個(gè)情況的通知。那些允許異常“失敗”的插件通常會(huì)退出,并返回值 1;對(duì)于 Nagios,這表示一個(gè) WARNING 狀態(tài)。請(qǐng)確保您的插件能夠正確地區(qū)分 WARNING 和 UNKNOWN。請(qǐng)注意,例如,在將其作為 UNKNOWN 結(jié)果處理可能出現(xiàn)錯(cuò)誤的情況下,通常可以禁用至少某些 WARNING 通知。
用 Python 編寫(xiě)一個(gè)插件
上述的建議—運(yùn)行時(shí)參數(shù)化、一則使用消息,以及經(jīng)過(guò)改進(jìn)的異常處理—將得到示例插件的源代碼,這段代碼要比前面的長(zhǎng)幾倍。但是您可以更安全地對(duì)錯(cuò)誤進(jìn)行處理,并且能夠在更廣泛的范圍內(nèi)重用該插件。
清單 8. Python 插件—獲取平均負(fù)載的完整插件
| #!/usr/bin/env python import os import sys import getopt def usage(): print """Usage: check_getloadavg [-h|--help] [-m|--mode 1|2|3] \ [-w|--warning level] [-c|--critical level]" Mode: 1 - last minute ; 2 - last 5 minutes ; 3 - last 15 minutes" Warning level defaults to 2.0 Critical level defaults to 5.0""" sys.exit(3) try: options, args = getopt.getopt(sys.argv[1:], "hm:w:c:", "--help --mode= --warning= --critical=", ) except getopt.GetoptError: usage() sys.exit(3) argMode = "1" argWarning = 2.0 argCritical = 5.0 for name, value in options: if name in ("-h", "--help"): usage() if name in ("-m", "--mode"): if value not in ("1", "2", "3"): usage() argMode = value if name in ("-w", "--warning"): try: argWarning = 0.0 + value except Exception: print "Unable to convert to floating point value\n" usage() if name in ("-c", "--critical"): try: argCritical = 0.0 + value except Exception: print "Unable to convert to floating point value\n" usage() try: (d1, d2, d3) = os.getloadavg() except Exception: print "GETLOADAVG UNKNOWN: Error while getting load average" sys.exit(3) if argMode == "1": d = d1 elif argMode == "2": d = d2 elif argMode == "3": d = d3 if d >= argCritical: print "GETLOADAVG CRITICAL: Load average is %.2f" % (d) sys.exit(2) elif d >= argWarning: print "GETLOADAVG WARNING: Load average is %.2f" % (d) sys.exit(1) else: print "GETLOADAVG OK: Load average is %.2f" % (d) sys.exit(0) |
?
為了使用這個(gè)新的插件,需要使用下面的方法來(lái)注冊(cè)?/etc/nagios-plugins/config/mygetloadavg2.cfg:
清單 9. Python 插件—使用 Nagios 進(jìn)行注冊(cè)
| define command{ command_name check_mygetloadavg2 command_line /path/to/check_getloadavg2 -m $ARG1$ -w $ARG2$ -c $ARG3$ } |
?
另外,根據(jù)下面的示例,在?services.cfg?文件中添加或者更改服務(wù)條目。請(qǐng)注意,使用感嘆號(hào)?!?來(lái)分隔插件參數(shù)。與前面一樣,必須在?hosts.cfg?配置文件中定義?localhost。
清單 10. 創(chuàng)建一個(gè)使用 Python 插件的服務(wù)
| define service{ use service-template host_name localhost service_description LoadAverage2 check_period 24x7 contact_groups server-admins notification_options c,r check_command check_mygetloadavg2!1!3.0!6.0 } |
?
用 Tcl 編寫(xiě)一個(gè)插件
最后的示例是使用 Tcl 編寫(xiě)的一個(gè)插件,它使用簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議 (SOAP) 和 Web 服務(wù)描述語(yǔ)言 (WSDL) 檢查 xmenthods.net 的匯率。SOAP 為該插件提供了匯率的當(dāng)前值,并將這些值與配置的范圍進(jìn)行比較。如果該值不屬于警告的范圍,那么它將被認(rèn)為是 OK。如果該值大于或者小于警告級(jí)別,但是并沒(méi)有超過(guò)危險(xiǎn)極限,則將狀態(tài)設(shè)置為 WARNING。否則將其設(shè)置為 CRITICAL,除非出現(xiàn)了網(wǎng)絡(luò)錯(cuò)誤,在這種情況下將狀態(tài)設(shè)置為 UNKNOWN。
該插件可以識(shí)別不同的可配置參數(shù),以便能夠檢查不同范圍的匯率。它還可以用于檢查各個(gè)國(guó)家的各種匯率。
清單 11. Tcl 插件—驗(yàn)證當(dāng)前匯率
| #!/usr/bin/env tclsh # parse arguments package require cmdline set options { {country1.arg "" "Country 1"} {country2.arg "" "Country 2"} {lowerwarning.arg "" "Lower warning limit"} {upperwarning.arg "" "Upper warning limit"} {lowercritical.arg "" "Lower critical limit"} {uppercritical.arg "" "Upper critical limit"} } array set opt [cmdline::getoptions argv $options {: [options]}] # if the user did not supply all arguments, show help message for each necessary [array names opt] { if {$opt($necessary) == ""} { set argv "-help" catch {cmdline::getoptions argv $options {: [options]}} usage puts stderr $usage exit 3 } } # load TclWebServices package package require WS::Client if {[catch { # download WSDL WS::Client::GetAndParseWsdl \ http://www.xmethods.net/sd/2001/CurrencyExchangeService.wsdl \ {} currency # create stub commands WS::Client::CreateStubs currency # download the actual exchange rate set result [lindex \ [currency::getRate "England" "Japan"] 1] } error]} { # if downloading the rate failed for some reason, report it puts "EXCHANGERATE UNKNOWN: $error" exit 3 } if {($result < $opt(lowercritical)) || ($result > $opt(uppercritical))} { puts "EXCHANGERATE CRITICAL: rate is $result" exit 2 } if {($result < $opt(lowerwarning)) || ($result > $opt(upperwarning))} { puts "EXCHANGERATE WARNING: rate is $result" exit 1 } puts "EXCHANGERATE OK: rate is $result" exit 0 |
?
現(xiàn)在,您需要注冊(cè)這個(gè)命令,以便 Nagios 知道如何調(diào)用它。為了完成這項(xiàng)工作,可以使用與前面類似的配置和命令定義來(lái)創(chuàng)建一個(gè)名為?/etc/nagios-plugins/config/exchangerate.cfg?的文件:
| command_line /path/to/check_exchangerate -country1 $ARG1$ -country2 $ARG2$ -lowercritical \ $ARG3$ -lowerwarning $ARG4$ -upperwarning $ARG5$ -uppercritical $ARG6$ |
?
在下面的示例中,假定該命令的名稱為?check_exchangerate。
接下來(lái),創(chuàng)建一個(gè)使用剛剛創(chuàng)建的插件來(lái)監(jiān)視匯率的服務(wù)。下面是服務(wù)定義,它將該服務(wù)與?localhost?服務(wù)器關(guān)聯(lián)起來(lái)。盡管這個(gè)檢查并不真正地關(guān)聯(lián)于任何物理主機(jī),但是需要將它綁定到一臺(tái)主機(jī)。如果這個(gè)檢查涉及到調(diào)用受信任的網(wǎng)絡(luò)中的服務(wù)器的 SOAP 方法,那么您可以添加需要進(jìn)行監(jiān)視的實(shí)際服務(wù)器,并且在這個(gè)示例中,應(yīng)該將服務(wù)綁定到該服務(wù)器。清單 12?中的代碼檢查 英鎊對(duì)日元的匯率,并驗(yàn)證匯率位于 225 到 275 之間。
清單 12. 添加 Tcl 插件作為一個(gè)新的服務(wù)
| define service{ use service-template host_name localhost service_description EXCHANGERATE check_period 24x7 contact_groups other-admins notification_options c,r check_command check_exchangerate!England!Japan!200!225!275!300 } |
?
結(jié)束語(yǔ)
您可以使用 Nagios 監(jiān)視所有類型的硬件和軟件。您可以編寫(xiě)自己的插件,這使得能夠監(jiān)視與 Nagios 服務(wù)器進(jìn)行通信的各種對(duì)象。正如您可以使用管理命令行參數(shù)和退出狀態(tài)的任何計(jì)算語(yǔ)言一樣,存在各種各樣的可能性。
高級(jí)系統(tǒng)管理員可以使用 Tcl 或者任何其他語(yǔ)言來(lái)擴(kuò)展 SOAP 示例,以便與內(nèi)部網(wǎng) Web 服務(wù)進(jìn)行通信,并編寫(xiě)插件以驗(yàn)證該服務(wù)行為的正確性。
還可以使用 C 插件或者將 C 嵌入到您最喜歡的動(dòng)態(tài)語(yǔ)言中(對(duì)于 Python,使用?Pyinline;對(duì)于 Perl,使用?Inline?;或者對(duì)于 Tcl,使用?Critcl),以便將您的操作系統(tǒng)的 C API 與您的插件(使用高級(jí)語(yǔ)言編寫(xiě))組合在一起。
轉(zhuǎn)載于:https://www.cnblogs.com/JemBai/archive/2012/05/10/2493785.html
總結(jié)
以上是生活随笔為你收集整理的如何编写 Nagios 插件 (http://zener.blog.51cto.com/937811/727685)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: dl是什么意思?
- 下一篇: PHP输出缓存(output_buffe