如何擴展Nagios,以實現自定義監控?
譯文【51CTO精選譯文】功能強大的Nagios網絡監控平臺讓你可以為其功能增添一系列可用插件。
如果你找不到可以滿足自身要求的一款插件,也很容易自行編寫,本文就介紹了如何自行編寫插件。
Nagios插件可以用任何一門編程語言來編寫,只要該編程語言在運行Nagios的平臺上得到支持。Bash是用來編寫Nagios插件的一門流行語言,因為它功能強大、使用簡單。
借助插件進行的每一次有效的Nagios檢查(Nagios check)都會生成一個數字表示的退出狀態。可能的狀態有:
- 0--各方面都正常,檢查成功完成。
- 1--資源處于警告狀態。某個地方不太妙。
- 2--資源處于臨界狀態。原因可能是主機宕機或服務未運行。
- 3--未知狀態,這未必表明就有問題,而是表明檢查沒有給出一個清楚明確的狀態。
插件還能輸出文本消息。默認情況下,該消息顯示在Nagios web界面和Nagios郵件警報信息中。盡管消息并不是硬性要求,你通常還是可以在可用插件中找到它們,因為消息告訴用戶出了什么岔子,而不會迫使用戶查閱說明文檔。
用Bash編寫的一個簡單的Nagios插件類似這樣。這個示例插件檢查一個指定的文件:
#!/bin/bash
#將***個實參($1)指定為文件名
filename=$1
#先檢查該文件是否存在。這是你應該開始的***個檢查,也是最基本的檢查。
if [ ! -e $filename ]; then
echo "CRITICAL status - file $filename doesn't exist"
exit 2 #返回臨界狀態,那是由于你的最糟糕情況是該文件根本就不存在。
#如果前一個條件通過(文件存在),那么接下來檢查該文件是否可讀:
elif [ ! -r $filename ]; then
echo "WARNING status - file $filename is not readable."
exit 1 #返回警告狀態,那是由于該狀態勝于根本不存在文件;
#如果前一個條件通過,檢查它是不是一個普通文件,而不是目錄或設備文件。
elif [ ! -f $filename ]; then
echo "UNKNOWN status - file $filename is not a file."
exit 3 #返回未知狀態;
#如果所有上述檢查均通過,那么表明它正常:
else
echo "OK status - file is OK"
exit 0 #Return OK status
fi
注釋(Bash中以#開始)解釋了代碼;如果你需要更清晰的解釋,或者想進一步了解Bash的文件測試操作符,請查閱說明文檔(http://tldp.org/LDP/abs/html/fto.html)。
盡管這個實例很簡單,但它清楚地表明了如何實現Nagios插件邏輯。始終首先要尋找最糟糕的情況。只有當所有檢查均通過,腳本退出時才會顯示狀態正常。確保在退出之前指定明確消息。
使用插件
默認情況下,所有的Nagios插件均存放在用$USER1宏命令定義的目錄中,具體在文件/etc/nagios/private/resource.cfg中定義。在來自EPEL存儲庫(http://fedoraproject.org/wiki/EPEL)的典型Nagios安裝環境下,$USER1被定義為/usr/lib/nagios/plugins。你對插件應該做的頭一件事就是,把它拷貝到用$USER1宏命令定義的目錄中。插件通常歸root所有,其權限設置為755。Nagios在屬于nagios群組的用戶nagios下工作,所以腳本需要讀取和執行其他群組的權限。
一旦你把腳本放在/usr/lib/nagios/plugins目錄中,就要在文件/etc/nagios/objects/commands.cfg里面把它定義成Nagios命令。假設你將腳本命名為check_file.sh,添加下列命令定義:
#我們的自定義文件檢查命令:
define command{
command_name check_file
command_line $USER1$/check_file.sh $ARG1$
}
這應當相當清楚。變量$ARG1$代表傳遞給Nagios命令的***個實參;在本例中,這***個實參應該是文件名稱。如果你想傳遞更多的實參,可以將$ARG2$用作第二個實參,將$ARG3$用作第三個實參,以此類推。
想開始使用你的插件,應在你的nagios配置文件(比如service.cfg)中將其定義成一項服務:
define service{
use local-service
host_name localhost
service_description Check the file /etc/passwd
check_command check_file!/etc/passwd
}
上述服務是為本地主機(host_name localhost)定義的,為本地服務使用模板(使用local-service),詳見文明文檔的對象繼承部分(http://nagios.sourceforge.net/docs/3_0/objectinheritance.html),即可了解模板及模板的工作原理。最重要的部分是check_command指令。它指定了命令check_file,然后是作為分隔符的感嘆號,后面是作為實參的文件名稱。如果你的插件有不止一個實參,可以用另外的感嘆號來分隔。
遠程運行Nagios插件
示例check_file plugin存在的一個明顯缺點是它本地運行,這意味著無法檢查遠程服務器上的文件。你有許多辦法可以解決這個問題。
***個辦法就是使用ssh命令,遠程執行代碼。這需要你把腳本拷貝到遠程服務器上,并利用ssh可以運行遠程命令的功能。這還需要你為Nagios服務器及其nagios用戶配置無密碼密鑰登錄。如果這方面你不太確信如何操作,可以參閱本文http://www.techrepublic.com/blog/opensource/remotely-monitor-servers-with-the-nagios-checkbyssh-plugin/321,了解所有的相關細節。
這***個辦法的優點是,你擁有了針對被監控的服務器,本地運行命令所具有的功能和靈活性。缺點就是,Nagios服務器必須能夠借助密鑰,無密碼登錄到遠程服務器。這是個安全問題,不推薦敏感環境使用。
第二個比較安全的辦法是,使用SNMP擴展功能。這要求你已在遠程服務器上安裝和配置好了net-snmp程序包(面向CentOS)。
想使用SNMP擴展命令,先將check_file.sh腳本拷貝到遠程服務器上。比如說,你可以把該腳本放在目錄/usr/bin/中。
接下來,將配置指令extend check_passwd_file /usr/bin/check_file.sh /etc/passwd添加到遠程服務器上的文件/etc/snmp/snmpd.conf。語法是extend some_alias command argument。下面是這種方法存在的主要不便之處:你得為每一次獨立的檢查定義一個別名,在本例中這意味著為我們想要測試的每一個獨立文件定義一個別名,因為無法通過SNMP來傳送實參。
文件/etc/snmp/snmpd.conf只要出現變化,都需要你用service snmpd reload命令(面向CentOS),重新裝入snmpd服務。之后,你可以用snmpget命令來測試新的檢查,就跟在snmpget -v2c -c public -OvQ 10.0.0.2 NET-SNMP-EXTEND-MIB::nsExtendOutputFull.\"check_passwd_file\"中一樣。這個示例snmpget命令通過SNMP版本2c,以"public"共用字符串查詢服務器10.0.0.2。自定義SNMP擴展命令的對象標識符(OID)是NET-SNMP-EXTEND-MIB::nsExtendOutputFull.\"some_alias\"。
遺憾的是,上面這個命令無法直接用Nagios來實現。如果snmpget正常工作,可以連接至遠程主機,它總是會返回狀態0,這表明每方面都正常,因為程序snmpget本身退出時沒有錯誤。因而,即使某個文件不存在,檢查腳本也會返回狀態0,不過它會輸出文件不存在的正確消息。
你可以解決這個問題,只要充分利用針對Nagios的名為check_snmp_extend.sh的特殊插件。這個插件取得狀態消息的***個單詞后,根據該單詞來設定狀態。由于預計使用這個插件,我們在示例腳本check_file.sh中設定了消息,以便從OK(正常)、CRITICAL(臨界)、WARNING(警告)和UNKNOWN(未知)開始。
想開始使用check_snmp_extend.sh插件,先下載該插件(http://www.logix.cz/michal/devel/nagios/check_snmp_extend.sh),然后把它放到Nagios服務器上的目錄/usr/lib/nagios/plugins($USER1宏命令)。在CentOS上,你得編輯腳本check_snmp_extend.sh,并把/usr/local/nagios/libexec/utils.sh換成/usr/lib/nagios/plugins/utils.sh,這是utils.sh腳本的正確路徑。
之后,你就可以像使用其他任何插件那樣使用check_snmp_extend.sh。首先,把它定義為一個命令:
define command{
command_name check_snmp_extend
command_line $USER1$/check_snmp_extend.sh $HOSTADDRESS$ $ARG1$
}
之后,定義一項服務:
define service{
use generic-service
host_name somehost.example.org
service_description Check For /etc/passwd
check_command check_snmp_extend!check_passwd_file
}
使用SNMP的擴展選項就跟你的SNMP配置一樣安全。這個辦法只需要在遠程主機上進行極少的改動,又確保了標準的設置環境符合安全方面的***實踐。你可以找到用于類似用途的其他Nagios插件,比如nrpe,但是它們要求遠程安裝額外服務,從安全和兼容性的角度來看這并非總是一個好主意。
如你所見,很容易用自行編寫的插件來擴展Nagios。Nagios允許這種擴展,這一點正是許多管理員青睞它、而不是青睞其他監控解決方案的原因之一。
原文鏈接:http://www.openlogic.com/wazi/bid/256126/how-to-extend-nagios-for-custom-monitoring