運維監控Nagios的原理與基本配置

 

一、Nagios概述
 
1、簡介
 
Nagios是插件式的結構,它本身沒有任何監控功能,所有的監控都是通過插件進行的,因此其是高度模塊化和富於彈性的。Nagios監控的對象可分爲兩類:主機和服務。主機通常指的是物理主機,如服務器、路由器、工作站和打印機等,這裏的主機也可以是虛擬設備,如xen虛擬出的Linux系統;而服務通常指某個特定的功能,如提供http服務的httpd進程等。而爲了管理上的方便,主機和服務還可以分別被規劃爲主機組和服務組等。
 
Nagios不監控任何具體數值指標(如操作系統上的進程個數),它僅用四種抽象屬性對被監控對象的狀態進行描述:OK、WARNING, CRITICAL和UNKNOWN。於是,管理員只需要對某種被監控對象的WARNING和CRITICAL狀態的閾值進行關注和定義即可。Nagios通過將WARTING和CRTICAL的閾值傳遞給插件,並由插件負責某具體對象的監控及結果分析,其輸出信息爲狀態信息(OK,WARNING,CRITICAL或UNKOWN)以及一些附加的詳細說明信息。
 
2、特性
 
由上述說明可以,Nagios是極富彈性的,其監控功能完全可以按照管理員的期望進行。此外,它外提供了對問題的自動響應能力和一個功能強大的通知系統。所有這些功能的實現是基於一個結構明晰的對象定義系統和少數幾個對象類型實現的。
 
1) 命令(Commands)
 
“命令”用於定義Nagios如何執行某特定的監控工作。它是基於某特定的Nagios插件定義出的一個抽象層,通常包含一組要執行的操作。
 
2)時段(Time periods)
 
“時段”用於定義某“操作”可以執行或不能執行的日期和時間跨度,如工作日內的每天8:00-18:00等;
 
3)聯繫人和聯繫人組(Contacts and contact groups)
 
“聯繫人”用於定義某監控事件的通知對象、要通知的信息以及這些接收通知者何時及如何接收通知;一個或多個聯繫人可以定義爲聯繫人組,而一個聯繫人也可以屬於多個組;
 
4) 主機和主機組(host and host groups)
 
“主機”通常指某物理主機,其包括此主機相關的通知信息的接收者(即聯繫人)、如何及何時進行監控的定義。主機也可以分組,即主機組(host groups),一個主機可同時屬於多個組;
 
5) 服務(Services)
 
“服務”通常指某主機上可被監控的特定的功能或資源,其包括此服務相關的通知信息的接收者、如何及何時進行監控等。服務也可以分組,即服務組(Service groups),一個服務可同時屬於多個服務組;
 
3、依賴關係
 
Nagios的強大功能還表現在其成熟的依賴關係系統上。比如,某路由設備故障必然會導致關聯在其上的其它主機無法被正常訪問,如果不能定義這些設備間的依賴關係,那麼監控系統上必然會出現大量的設備故障信息。而Nagios則通過依賴關係來描述網絡設備的拓撲結構,並能夠實現在某設備故障時不再對依賴於此設備的其它設備進行檢測,從而避免了無謂的故障信息,方便管理員及時定位並排除故障。此外,Nagios的依賴關係還可以在服務級別上實現,如果某服務依賴於其它服務時,也能實現類似主機依賴關係的功能。
 
4、宏
 
Nagios還能夠使用宏,並且宏的定義在整個Nagios系統中具有一致性。宏是能夠用於對象定義中的變量,其值通常依賴於上下文。在“命令”中定義的宏,相對於主機、服務或其它許多參數來說,其值會隨之不同。比如,某命令可以根據向其傳遞的IP地址的不同來監控不同的主機。
 
5、計劃中宕機
 
Nagios還提供了調度性計劃中的宕機機制,管理員可以週期性的設定某主機或服務爲計劃中的不可用狀態。這種功能可以阻止Nagios在調度宕機時段通知任何信息。當然,這也可以讓Nagios自動通知管理員該進行主機或服務維護了。
 
6、軟狀態和硬狀態(Soft and Hard States)
 
如上所述,Nagios的主要工作是檢測主機或服務的狀態,並將其存儲下來。某一時刻,主機或服務狀態僅可以是四種可用狀態之一,因此,其狀態能夠正確反映主機或服務的實際狀況就顯得特別關鍵。爲了避免某偶然的臨時性或隨機性問題,Nagios引入了軟狀態和硬狀態。在實際的檢測中,Nagios一旦發現某主機或服務的狀態爲UNKOWN或不同於上一次檢測時的狀態,其將會對此主機或服務進行多次測試以確保此狀態的變動是非偶然性的。具體共要做出幾次測試是可以配置的,在這個指定次數的測試時段內,Nagios假設此變化後的狀態爲軟件狀態。一旦測試完成後狀態仍然爲新變的狀態時,此狀態就成了硬狀態。
 
7、Nagios的結構與特點
 
      從結構上講,Nagios可以分爲核心和插件兩個部分。Nagios的核心部分只是提供了很少的監控功能,因此要搭建一個完善的IT監控管理系統,用戶還需要爲Nagios安裝相應的插件。
     Nagios的主要功能特點:
1、監視本地或者遠程主機資源(內存、進程、磁盤等)
2、監視網絡服務資源(HTTP/PING/FTP/SMTP/POP3等)
3、允許用戶編寫自己的插件來監控特定的服務。
4、當被監控對象出現異常時,可以通過郵件、短信等方式通知管理人員
5、可以事先定義事件處理程序,當主機或者服務出現故障時自動調用指定的處理程序。
6、可以通過web界面來監控各個主機或服務的運行狀態。
 
二、安裝配置Nagios
 
1、Nagios程序簡介
 
Nagios通常由一個主程序(Nagios)、一個插件程序(Nagios-plugins)和四個可選的ADDON(NRPE、NSCA、NSClient++和NDOUtils)組成。Nagios的監控工作都是通過插件實現的,因此,Nagios和Nagios-plugins是服務器端工作所必須的組件。而四個ADDON中,NRPE用來在監控的遠程Linux/Unix主機上執行腳本插件以實現對這些主機資源的監控;NSCA用來讓被監控的遠程Linux/Unix主機主動將監控信息發送給Nagios服務器(這在冗餘監控模式中特別要用到);NSClient++是用來監控Windows主機時安裝在Windows主機上的組件;而NDOUtils則用來將Nagios的配置信息和各event產生的數據存入數據庫,以實現這些數據的快速檢索和處理。這四個ADDON(附件)中,NRPE和NSClient++工作於客戶端,NDOUtils工作於服務器端,而NSCA則需要同時安裝在服務器端
目前,Nagios只能安裝在Linux系統主機上,其編譯需要用到gcc。同時,如果打算使用web界面的管理工具的話,還需要有apache服務器和GD圖形庫的支持。
2、安裝前的準備工作
 
(1)解決安裝Nagios的依賴關係:
 
Nagios基本組件的運行依賴於httpd、gcc和gd。可以通過以下命令來檢查nagios所依賴的rpm包是否已經完全安裝:
# yum -y install httpd gcc glibc glibc-common gd gd-devel php php-mysql mysql mysql-devel mysql-server
 
說明:以上軟件包您也可以通過編譯源代碼的方式安裝,只是後面許多要用到的相關文件的路徑等需要按照您的源代碼安裝時的配置逐一修改。此外,您還得按需啓動必要的服務,如httpd等。
 
(2)添加nagios運行所需要的用戶和組:
 
# groupadd nagcmd
# useradd -G nagcmd nagios
# passwd nagios
 
把apache加入到nagcmd組,以便於在通過web Interface操作nagios時能夠具有足夠的權限:
# usermod -a -G nagcmd apache
 
3、編譯安裝nagios
 
# tar zxf nagios-3.3.1.tar.gz
# cd nagios-3.3.1
# ./configure --with-command-group=nagcmd --enable-event-broker
# make all
# make install
# make install-init
# make install-commandmode
# make install-config
 
 
爲email指定您想用來接收nagios警告信息的郵件地址,默認是本機的nagios用戶:
# vim /usr/local/nagios/etc/objects/contacts.cfg
email        nagios@localhost       #這個是默認設置
 
在httpd的配置文件目錄(conf.d)中創建Nagios的Web程序配置文件:
# make install-webconf
 
創建一個登錄nagios web程序的用戶,這個用戶帳號在以後通過web登錄nagios認證時所用:
# htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin
 
以上過程配置結束以後需要重新啓動httpd:
# service httpd restart
 
4、編譯、安裝nagios-plugins
 
nagios的所有監控工作都是通過插件完成的,因此,在啓動nagios之前還需要爲其安裝官方提供的插件。
 
# tar zxf nagios-plugins-1.4.15.tar.gz
# cd nagios-plugins-1.4.15
# ./configure --with-nagios-user=nagios --with-nagios-group=nagios
# make
# make install
 
5、配置並啓動Nagios
 
(1)把nagios添加爲系統服務並將之加入到自動啓動服務隊列:
# chkconfig --add nagios
# chkconfig nagios on
 
(2)檢查其主配置文件的語法是否正確:
# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
 
(3)如果上面的語法檢查沒有問題,接下來就可以正式啓動nagios服務了:
# service nagios start
 
(4)配置selinux
如果您的系統開啓了selinux服務,則默認爲拒絕nagios web cgi程序的運行。您可以通過下面的命令來檢查您的系統是否開啓了selinux:
#getenforce
 
如果上面命令的結果顯示開啓了selinux服務,您可以通過下面的命令暫時性的將其關閉:
#setenforce 0
 
如果您想在以後完全關閉selinux,可以通過編輯/etc/sysconfig/selinux文件,將其中的selinux後面的值“force”修改爲“disable”即可。
 
當然,您也可以通過以下方式將nagios的CGI程序運行於SELinux/targeted模式而不用關閉selinux:
# chcon -R -t httpd_sys_content_t /usr/local/nagios/sbin
# chcon -R -t httpd_sys_content_t /usr/local/nagios/share
 
(5)通過web界面查看nagios:
http://your_nagios_IP/nagios
 
登錄時需要指定前面設定的web認證帳號和密碼。
 
注意:爲了nagios系統的安全,建議您使用信息摘要強認證模式(如MD5),強制使用web的TSL/SSL安全通訊模式,並且通過訪問控制列表設定能訪問nagios的web界面的客戶端地址。
 
四、配置Nagios
 
1、Nagios的主配置文件
 
Nagios的主配置文件爲nagios.cfg,其語法非常簡潔,通常#開頭的行爲註釋行,而參數的設置格式爲<parameter>=<value>;其中,有些參數是可以重複出現的。其中常用的參數說明如下:
 
log_file: 設定Nagios的日誌文件;
cfg_file: Nagios對象定義的相關文件,此參數可重複使用多次以指定多個文件;
cfg_dir: 設定Nagios對象定義的相關文件所在的目錄,此目錄中的所有文件都會被作爲對象定義的文件;此參數可重複使用多次以指定多個目錄;
resource_file: 設定Nagios附加的宏定義的相關文件;
status_file: 設定Nagios存儲所有主機和服務當前狀態信息的文件;
status_update_interval: 設定status_file指定的文件中狀態信息的更新頻率;
service_check_timeout: 設定服務檢測的超時時間,默認爲60秒;
host_check_timeout: 設定主機檢測的超時時間,默認爲30秒;
notification_timeout: 設定通知信息發送嘗試的超時時間,默認爲30秒;
 
2、resource_file和宏定義
 
在主配置文件中,參數resource_file用於定義所有用戶變量(即“宏”)的存儲文件,它用於存儲對象定義中的可以訪問的額外信息,如訪問某服務的密碼等;因此,這些信息通常都是些敏感數據,一般不允許通過Web接口來訪問。此文件中可以定義的宏可多達32個,它們分別爲$USER1$,$USER2$...$USER32,這些宏一般在check命令中引用。通常情況下$USER1$用於引用Nagios插件所在目錄這個路徑信息,因此,一般不建議修改其值。
 
Nagios事先定義了許多宏,它們的值通常依賴於其上下文。如下:
 
HOSTNAME: 用於引用host_name指定所定義的主機的主機名;每個主機的主機名都是唯一的;
HOSTADDRESS: 用於引用host對象中的address指令的值,它通常可以爲IP地址或主機名;
HOSTDISPLAYNAME: 用於引用host對象中alias指令的值,用以描述當前主機,即主機的顯示名稱;
HOSTSTATE:某主機的當前狀態,爲UP,DOWN,UNREACHABLE三者之一;
HOSTGROUPNAMES: 用於引用某主機所屬的所有主機組的簡名,主機組名稱之間以逗號分隔;
LASTHOSTCHECK:用於引用某主機上次檢測的時間和日期,Unix時間戳格式;
LISTHOSTSTATE:用於引用某主機前一次檢測時的狀態,爲UP,DOWN或UNREACHABLE三者之一;
SERVICEDESC: 用於引用對應service對象中的desccription指令的值;
SERVICESTATE: 用於引用某服務的當前狀態,爲OK,WARNING,UNKOWN或CRITICAL四者之一;
SERVICEGROUPNAMES: 用於引用某服務所屬的所有服務組的簡名,服務組名稱之間以逗號分隔;
CONTACTNAME: 用於引用某contact對象中contact_name指令的值;
CONTACTALIAS: 用於引用某contact對象中alias指令的值;
CONTACTEMAIL: 用於引用某contact對象中email指令的值;
CONTACTGROUPNAMES: 用於引用某contact所屬的所有contact組的簡名,contact組名稱之間以逗號分隔;
 
Nagios 3還支持自定義宏,只是它的定義和使用方式比較獨特。管理員可以在某類型對象的定義中使用額外的指令,並能夠在命令中使用特別格式的宏來引用此指令的值。其引用方式根據對象類型的不同也有所不同,具體如下:
 
       $_HOST<variable>$ – 引用在主機對象中定義的指令的值;
       $_SERVICE<variable>$ – 引用在服務對象中定義的指令的值;
       $_CONTACT<variable>$ – 引用在聯繫人對象中定義的指令的值;
 
一個簡單的例子如下:
 
如某主機定義爲:
       define host
 {
    host_name somemachine
    address 10.0.0.1
    _MAC 12:34:56:78:90:ab
    check_command check-host-by-mac
 }
 
對應的檢測命令則可以定義爲:
 define command
 {
    command_name check-host-by-mac
    command_line $USER1$/check_hostmac -H $HOSTADDRESS$ -m $_HOSTMAC$
 }
 
3、定義主機對象
 
“主機”指的是被監控的機器,可是物理主機,也可以是虛擬設備。一個主機對象的定義至少應該包含一個簡名(short name)、一個別名、一個IP地址和用到的檢測命令。此外,很多時候,其定義中還應該包含監控時段、聯繫人及要通知的相關問題、檢測的頻率、重試檢測的方式、發送通知的頻率等。具體的各指令及說明請參見官方文檔:http://nagios.sourceforge.net/docs/3_0/objectdefinitions.html#host。
 
一個主機定義的例子:
       define host
       {
              host_name webserver1
              hostgroups webservers
              alias www.magedu.com
              address 172.16.100.11
              check_command check-host-alive
              check_interval 5
              retry_interval 1
              max_check_attempts 5
              check_period 24x7
              contact_groups linux-admins
              notification_interval 30
              notification_period 24x7
              notification_options d,u,r
       }
 
其中的notification_options用於指定當主機處於什麼狀態時應該發送通知。其各狀態及其表示符如下:
              d —— DOWN
              u —— UNREACHABLE
              r —— UP(host recovery)
              f —— flapping
              s —— 調試宕機時間開始或結束
             
主機可以被劃分成組,這些組即主機組。每一個主機組對象一般包含一個全局唯一的簡名、一個描述名以及屬於這個組的成員。此外,一個主機組的成員也可以是其它主機組。主機組的定義例子如下:
 
       define hostgroup
       {
              hostgroup_name webservers
              alias Linux web servers
              members webserver1
       }
 
4、定義服務對象
 
“服務”即某“主機”所提供的功能或資源對象,如HTTP服務、存儲空間資源或CPU負載等。服務附屬於主機,每一個服務使用服務名來標識,此服務名要求在特定的主機上具有唯一性。每一個服務對象還通常定義一個檢測命令及如何進行問題通知等。
 
       define service
       {
              host_name webserver1
              service_description www
              check_command check_http
              check_interval 10
              check_period 24x7
              retry_interval 3
              max_check_attempts 3
              notification_interval 30
              notification_period 24x7
              notification_options w,c,u,r
              contact_groups linux-admins
       }
 
其中的notification_options用於指定當服務處於什麼狀態時應該發送通知。其各狀態及其表示符如下:
              w —— WARNING
              u —— UNKNOWN
              c —— CRITICAL
              r —— OK(recovery)
              f —— flapping
              s —— 調試宕機時間開始或結束
             
與主機對象有所不同的是,有時個,多個主機可能會提供同樣的服務,比如多臺服務器同時提供Web等。因此,在定義服務對象時,其host_name可以爲逗號隔開的多個主機。
 
服務可以被劃分成組,這些組即服務組。每一個服務組對象一般包含一個全局唯一的簡名、一個描述名以及屬於這個組的成員。此外,一個服務組的成員通常是某主機上的某服務,其指定時使用<host>,<service>的格式,多個服務也使用逗號分隔。服務組的定義例子如下:
 
       define servicegroup
       {
              servicegroup_name webservices
              alias All services related to web
              members webserver1,www,webserver2,www
       }
 
5、定義命令對象
 
“命令”用於描述如何對主機或服務進行狀態檢測。服務對象的定義包含兩個指令:名字(command_name)和命令行(command_line);名字用於標識此命令對象,命令行則是執行檢測時真正要執行的命令。
 
當命令對象用於檢測其它對象時,其通常需要用到額外的參數以標識要檢測的某特定對象,此時,命令對象需要以command_name[!arg1][!arg2][...]的語法格式進行引用。因此,命令對象的定義中,命令行指令中通常會用到宏$ARG1$, $ARG2$...,對應用於接收[!arg1][!arg2][...]傳遞而來的參數。
 
如下命令對象的定義:
       define command
       {
              command_name check_local_swap
              command_line     $USER1$/check_swap -w $ARG1$ -c $ARG2$
       }
 
如下的服務中使用上面定義的命令對象來檢測服務對象:
 
       define service
       {
    host_name localhost
    service_description Swap Usage
              check_command check_local_swap!20!10
 }
 
6、定義“時段”對象
 
“時段”用於定義某“操作”可以執行或不能執行的日期和時間跨度,如工作日內的每天8:00-18:00等,其可以在多個不同的操作中重複引用。一個時段對象的定義包含一個全局唯一的名稱標識及一個或多個時間跨度。例如:
 
       define timeperiod
       {
              timeperiod_name workinghours
              alias Working Hours, from Monday to Friday
              monday 09:00-17:00
              tuesday 09:00-17:00
              wednesday 09:00-17:00
              thursday 09:00-17:00
              friday 09:00-17:00
       }
 
其中,時間的指定格式有許多方式:
       日曆時間:格式爲YYYY-MM-DD,如2012-04-21;
       日期:如 April 21;
       每月的某一天:如 day 21,指每月的21號;
       每月的第幾個周幾:如 saturday 1,指每月的第一個星期六;
       星期幾:如monday, tuesday等;
      
7、定義聯繫人對象
 
“聯繫人”對象用於定義某主機設備的擁有者或某問題出現時接受通知者。聯繫人對象的定義包含一個全局唯一的標識名稱、一個描述名及一個或多個郵件地址等。此外,其通常還應該包括對相應的主機或服務出現故障時所用到的通知命令。例如:
 
       define contact
       {
              contact_name mageedu
              alias Mage Education
              email [email protected]
              host_notification_period workinghours
              service_notification_period workinghours
              host_notification_options d,u,r
              service_notification_options w,u,c,r
              host_notification_commands     host-notify-by-email
              service_notification_commands   notify-by-email
       }
 
聯繫人也可劃分爲組,即聯繫人組。一個聯繫人組對象包含一個全局惟一的標識名稱,一個描述名稱和屬於此聯繫人組的聯繫人成員(members)或其人聯繫人組成員(contactgroup_members)。例如:
 
       define contactgroup
       {
              contactgroup_name linux-admins
              alias Linux Administrators
              members magedu, mageedu
       }
 
在主機或服務對象的定義中,既可以指定聯繫人,也可以指定聯繫人組。當然,某主機的問題聯繫人與其上運行的服務的聯繫人也可以不同。
 
8、模板及對象繼承
 
Nagios通過功能強大的繼承引擎來實現基於模板的對象繼承。這就意味着可以定義將某類型的對象的通用屬性組織起來定義爲對象模板,並在定義其類型中的對象時直接從此模板繼承其相關屬性的定義。定義對象模板的方法很簡單,通常只需要在定義某類型對象時使用register指令並將其值設定爲0即可。對象模板的名稱通常使用name指令定義,這與某特定類型對象使用的指令也有所不同。而定義此種類型的對象時,只需要使用use指令並將其值設定爲對應模板的名稱即可。例如:
 
       define host
       {
              name generic-server
              check_command check-host-alive
              check_interval 5
              retry_interval 1
              max_check_attempts 5
              check_period 24x7
              notification_interval 30
              notification_period 24x7
              notification_options d,u,r
              register 0
       }
 
       define host
       {
              use generic-server
              name webserver1
              alias Web Server 01
              address 172.16.100.11
              contact_groups linux-admins
       }
 
一個對象在定義時也以同時繼承多個模板,此時只需要爲use指令指定以逗號分隔的多個模板名稱即可。同時,Nagios也支持模板的多級繼承。
 
9、依賴關係
 
爲了描述Nagios對象間的依賴關係,這裏要用到兩個術語:master(被依賴的主機或服務)和dependent(依賴關係中的依賴於master的Nagios對象)。Nagios可以定義對象間的彼此依賴性,也可以爲某對象定義其父對象,甚至也可以指定此依賴關係生效的時段。下面是一個關於依賴關係定義的例子:
 
       define hostdependency
       {
              dependent_host_name backuphost
              host_name ***server1
              dependency_period maintenancewindows
       }
 
其中host_name用於定義master主機,dependent_host_name定義dependent主機。而在依賴關係的定義中,通常還會用到execution_failure_criteria定義master主機爲何種狀態時不再對依賴於此master的主機進行檢測,notification_failure_criteria用於定義master處於何種狀態時不會發送dependent相關的主機問題通知到聯繫人。
 
服務間依賴關係的定義類似於主機間的依賴關係,例如:
 
       define servicedependency
       {
              host_name mysqlserver
              service_description mysql
              dependent_hostgroup_name apacheservers
              dependent_service_description webservice
              execution_failure_criteria c,u
              notification_failure_criteria c,u,w
       }
 
 
三、基於NRPE監控遠程Linux主機
 
1、NRPE簡介
 
Nagios監控遠程主機的方法有多種,其方式包括SNMP、NRPE、SSH和NCSA等。這裏介紹其通過NRPE監控遠程Linux主機的方式。
 
NRPE(Nagios Remote Plugin Executor)是用於在遠端服務器上運行檢測命令的守護進程,它用於讓Nagios監控端基於安裝的方式觸發遠端主機上的檢測命令,並將檢測結果輸出至監控端。而其執行的開銷遠低於基於SSH的檢測方式,而且檢測過程並不需要遠程主機上的系統帳號等信息,其安全性也高於SSH的檢測方式。
 
2、安裝配置被監控端
 
1)先添加nagios用戶
# useradd -s /sbin/nologin nagios
 
2)NRPE依賴於nagios-plugins,因此,需要先安裝之
 
# tar zxf nagios-plugins-1.4.15.tar.gz
# cd nagios-plugins-1.4.15
# ./configure --with-nagios-user=nagios --with-nagios-group=nagios
# make all
# make instal
 
3)安裝NRPE
 
# tar -zxvf nrpe-2.12.tar.gz
# cd nrpe-2.12
# ./configure --with-nrpe-user=nagios \
     --with-nrpe-group=nagios \
     --with-nagios-user=nagios \
     --with-nagios-group=nagios \
     --enable-command-args \
     --enable-ssl
# make all
# make install-plugin
# make install-daemon
# make install-daemon-config
 
4)配置NRPE
 
# vim /usr/local/nagios/etc/nrpe.cfg
 
log_facility=daemon
pid_file=/var/run/nrpe.pid
server_address=172.16.100.11
server_port=5666
nrpe_user=nagios
nrpe_group=nagios
allowed_hosts=172.16.100.1
command_timeout=60
connection_timeout=300
debug=0
 
上述配置指令可以做到見名知義,因此,配置過程中根據實際需要進行修改即可。其中,需要特定說明的是allowed_hosts指令用於定義本機所允許的監控端的IP地址。
 
5)啓動NRPE
 
# /usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg –d
 
爲了便於NRPE服務的啓動,可以將如下內容定義爲/etc/init.d/nrped腳本:
vim /etc/init.d/nrped
#!/bin/bash
# chkconfig: 2345 88 12
# description: NRPE DAEMON
 
NRPE=/usr/local/nagios/bin/nrpe
NRPECONF=/usr/local/nagios/etc/nrpe.cfg
 
case "$1" in
       start)
              echo -n "Starting NRPE daemon..."
              $NRPE -c $NRPECONF -d
              echo " done."
              ;;
       stop)
              echo -n "Stopping NRPE daemon..."
              pkill -u nagios nrpe
              echo " done."
       ;;
       restart)
              $0 stop
              sleep 2
              $0 start
              ;;
       *)
              echo "Usage: $0 start|stop|restart"
              ;;
       esac
exit 0
 
或者,也可以在/etc/xinetd.d目錄中創建nrpe文件,使其成爲一個基於非獨立守護進程的服務,文件內容如下:
# vim /etc/xinet.d/nrpe
 
service nrpe
{
       flags = REUSE
       socket_type = stream
       wait = no
       user = nagios
       group = nagios
       server = /opt/nagios/bin/nrpe
       server_args = -c /etc/nagios/nrpe.cfg -i
       log_on_failure += USERID
       disable = no
}
 
此種情況下啓動NRPE進程需要通過重啓xinetd來實現。
 
6)配置允許遠程主機監控的對象
 
在被監控端,可以通過NRPE監控的服務或資源需要通過nrpe.cfg文件使用命令進行定義,定義命令的語法格式爲:command[<command_name>]=<command_to_execute>。比如:
 
command[check_rootdisk]=/usr/local/nagios/libexec/check_disk -w 20 -c 10 -p /
command[check_swap]=/usr/local/nagios/libexec/check_disk -w 40 -c 20
command[check_sensors]=/usr/local/nagios/libexec/check_sensors
command[check_users]=/usr/local/nagios/libexec/check_users -w 10 -c 20
command[check_load]=/usr/local/nagios/libexec/check_load -w 10,8,5 -c 20,18,15
command[check_zombies]=/usr/local/nagios/libexec/check_procs -w 5 -c 10 -s Z
command[check_all_procs]=/usr/local/nagios/libexec/check_procs -w 150 -c 200
 
3、配置監控端
 
1)安裝NRPE
 
# tar -zxvf nrpe-2.12.tar.gz
# cd nrpe-2.12
# ./configure --with-nrpe-user=nagios \
     --with-nrpe-group=nagios \
     --with-nagios-user=nagios \
     --with-nagios-group=nagios \
     --enable-command-args \
     --enable-ssl
# make all
# make install-plugin
 
2)定義如何監控遠程主機及服務:
 
安裝完成後,在/usr/local/nagios/libexec下就好生成check_nrpe插件。通過NRPE監控遠程Linux主機要使用check_nrpe插件進行,其語法格式如下:
check_nrpe -H <host> [-n] [-u] [-p <port>] [-t <timeout>] [-c <command>] [-a <arglist...>]
 
[root@localhost libexec]# ./check_nrpe -H 172.16.29.4
NRPE v2.12(意味着雙方可以通信)
 
使用示例1:
 
# cd /etc/nagios
# cd objects/
# ls
commands.cfg localhost.cfg switch.cfg     timeperiods.cfg contacts.cfg printer.cfg    templates.cfg windows.cfg
 
# vim commands.cfg
定義監控遠程Linux主機swap資源的命令:
       define command
       {
              command_name check_swap_nrpe
              command_line $USER1$/check_nrpe –H "$HOSTADDRESS$" -c "check_swap"
       }
 
 
 
定義遠程Linux主機的swap資源:
       define service
       {
              use generic-service
              host_name linuxserver1,linuxserver2
              hostgroup_name linux-servers
              service_description SWAP
              check_command check_swap_nrpe
              normal_check_interval 30
       }
 
使用示例2:
 
如果希望上面的command定義更具有通用性,那麼上面的定義也可以修改爲如下:
 
定義監控遠程Linux主機的命令:
       define command
       {
              command_name check_nrpe
              command_line $USER1$/check_nrpe –H "$HOSTADDRESS$" -c $ARG1$
       }
 
重新建一個文件:
[root@localhost objects]# vim linuxhost.cfg
定義遠程Linux主機的swap資源:
       define service
       {
              use generic-service
              host_name linuxserver1,linuxserver2
              hostgroup_name linux-servers
              service_description SWAP
              check_command check_nrpe!check_swap
              normal_check_interval 30
       }
 
使用示例3:
 
如果還希望在監控遠程Linux主機時還能向其傳遞參數,則可以使用類似如下方式進行:
 
定義監控遠程Linux主機disk資源的命令:
       define command
       {
              command_name check_swap_nrpe
              command_line $USER1$/check_nrpe –H "$HOSTADDRESS$" -c "check_swap" -a $ARG1$ $ARG2$
       }
 
定義遠程Linux主機的swap資源:
       define service
       {
              use generic-service
              host_name linuxserver1,linuxserver2
              hostgroup_name linux-servers
              service_description SWAP
              check_command check_swap_nrpe!20!10
              normal_check_interval 30
       }
 
 
 
五、基於NSClinet++監控Windows主機
 
1、基於check_nt
 
Windows端要啓用的模塊:
[modules]
CheckSystem.dll
CheckDisk.dll
FileLogger.dll
NSClientListener.dll
 
[settings]
allowed_hosts =
 
修改配置後要重啓服務:
 
nsclient++ /stop
nsclient++ /start
 
 
 
在nagios端使用如下命令測試:
 
check_nt -H <client ip> -p <port> -v <command> ...
 
# check_nt -H 172.16.100.66 -p 12489 -v CPULOAD -w 80 -c 90 -l 5,80,90
 
 
 
 
 
# vim /usr/local/nagios/etc/objects/windows.cfg
 
 
define host
       use         windows-server  
       host_name           winserver
       alias              My Windows machine
       address         172.16.100.66
}
 
define service{
       use generic-service
       host_name winserver
       service_description NSClient++ Version
       check_command check_nt!CLIENTVERSION
}
 
define service {
       use                generic-service
       host_name                  winserver
       service_description    Uptime
       check_command        check_nt!UPTIME
}
 
define service {
       use                generic-service
       host_name                  winserver
       service_description    CPU Load
       check_command        check_nt!CPULOAD!-l 5,80,90
}
 
define service{
       use                generic-service
       host_name                  winserver
       service_description    Memory Usage
       check_command        check_nt!MEMUSE!-w 80 -c 90
}
 
Password Protection
 
 
 
If you specified a password in the NSClient++ configuration file on the Windows machine, you'll need to modify the check_nt command definition to include the password. Open the commands.cfg file for editing.
 
 
vim /usr/local/nagios/etc/objects/commands.cfg
 
Change the definition of the check_nt command to include the "-s <PASSWORD>" argument (where PASSWORD is the password you specified on the Windows machine) like this:
 
 
define command{
       command_name check_nt
       command_line     $USER1$/check_nt -H $HOSTADDRESS$ -p 12489 -s PASSWORD -v $ARG1$ $ARG2$
       }
 
Save the file.
 
2、基於NRPE
 
NSClient++要啓用如下模塊:
[modules]
CheckSystem.dll
CheckDisk.dll
CheckExternalScripts.dll
FileLogger.dll
NRPEListener.dll
 
 
NRPE specific setting in NSClient++
       use_ssl
       allow_arguments
       allow_nasty_meta_chars
 
 
check_nrpe語法:
check_nrpe ... -c <command> [-a <argument> <argument> <argument>]
 
 
check_nrpe的內置命令:
· CheckAlwaysCRITICAL (check)
· CheckAlwaysOK (check)
· CheckAlwaysWARNING (check)
· CheckCPU (check)
· CheckCRITICAL (check)
· CheckCounter (check)
· CheckEventLog/CheckEventLog (check)
· CheckFile (check)
· CheckFileSize (check)
· CheckMem (check)
· CheckMultiple (check)
· CheckOK (check)
· CheckProcState (check)
· CheckServiceState (check)
· CheckTaskSched/CheckTaskSched (check)
· CheckUpTime (check)
· CheckVersion (check)
· CheckWARNING (check)
· CheckWMI/CheckWMI (check)
· CheckWMIValue (check)
 
用法如:
# check_nrpe ... -c CheckCPU -a warn=80 crit=90 time=20m time=10s time=4
 
 
 
 
Nagios端的配置:
 
1) Template
 
define host{
       name tpl-windows-servers
       use generic-host
       check_period 24x7
       check_interval 5
       retry_interval 1
       max_check_attempts 10
       check_command check-host-alive
       notification_period 24x7
       notification_interval 30
       notification_options d,r
       contact_groups admins
       register 0
}
 
2) 定義主機:
define host{
       use tpl-windows-servers
       host_name windowshost
       alias My First Windows Server
       address 172.16.100.66
}
 
3) 定義服務:
 
define service{
       use generic-service
       host_name windowshost
       service_description CPU Load
       check_command check_nrpe!alias_cpu
}
 
define service{
       use generic-service
       host_name windowshost
       service_description Free Space
       check_command check_nrpe!alias_disk
}
 
 
3、基於NSCA
 
[modules]
CheckSystem.dll
CheckDisk.dll
CheckExternalScripts.dll
CheckHelpers.dll
FileLogger.dll
NSCAAgent.dll
 
NSClient++配置
 
interval
encryption_method
password
nsca_host
 
修改配置後要重啓服務
 
 
1) 模板
define host{
       name tpl-windows-servers ; Name of this template
       use generic-host ; Inherit default values
       check_period 24x7
       check_interval 5
       retry_interval 1
       max_check_attempts 10
       check_command check-host-alive
       notification_period 24x7
       notification_interval 30
       notification_options d,r
       contact_groups admins
       register 0 ; DONT REGISTER THIS - ITS A TEMPLATE
}
 
2)主機配置
define host{
       use tpl-windows-servers
       host_name windowshost
       alias My First Windows Server
       address 172.16.100.66
       active_checks_enabled 0
       passive_checks_enabled 1
}
 
3)服務配置
 
define service{
       use generic-service
       host_name windowshost
       service_description CPU Load
       check_command check_nrpe!alias_cpu
       active_checks_enabled 0
       passive_checks_enabled 1
}
 
define service{
       use generic-service
       host_name windowshost
       service_description Free Space
       check_command check_nrpe!alias_disk
       active_checks_enabled 0
       passive_checks_enabled 1
}
 
 
 
 
Nagios的插件介紹
 
Nagios的插件介紹:
 
如果想給Nagios增加一個自己的插件,請訪問:Nagios插件項目官方網站、Nagios插件開發的官方指南。
 
一、插件概覽
 
作爲Nagios插件的腳本或執行程序必須(至少)要做兩件事:
 
退出時給出幾種可能的返回值中的一個;
 
至少要給出一條輸出內容到標準輸出設備(STDOUT)。
 
對Nagios來說,插件裏面做什麼並不重要。自制插件可以是做TCP端口狀態檢測,運行某個數據庫查詢,檢查磁盤空閒空間,或其他需要檢測的內容。這取決於你想檢測什麼東西,這完全由你自己決定。
 
二、返回值
 
Nagios用插件的返回值來生成主機或服務的狀態。下表裏列出了合法的返回值以及對應的服務或主機狀態。
 
插件返回值服務狀態     主機狀態
0                正常(OK)    運行(UP)
1              告警(WARNING)運行(UP)或宕機(DOWN)/不可達(UNREACHABLE)*
2               緊急(CRITICAL)       宕機(DOWN)/不可達(UNREACHABLE)
3              未知(UNKNOWN)      宕機(DOWN)/不可達(UNREACHABLE)
注意:如果使能use_aggressive_host_checking選項,返回值1將使主機狀態要麼是宕機(DOWN)要麼是不可達(UNREACHABLE)。其他情況下,返回值1將使主機狀態是運行(UP)。
 
三、特定插件輸出
 
最小情況下,插件要返回一行文本輸出。自Nagios 3版本起,插件可以返回多行輸出文本。插件可以返回性能數據以讓外部應用來做後序處理。輸出文本的基本格式如下:
 
TEXT OUTPUT | OPTIONAL PERFDATA 
LONG TEXT LINE 1 
LONG TEXT LINE 2  
...  
LONG TEXT LINE N | PERFDATA LINE 2 
PERFDATA LINE 3  
...  
PERFDATA LINE N 
性能數據(用下劃線示意的部分)是可選的,如果插件輸出文本里有性能數據,必須用管道符(|)把性能數據與其他數據分開,額外的大段輸出行(用文字刪除符示意的部分)同樣也是可選的。
 
四、插件輸出樣例
 
下面看一下插件輸出的樣例...
 
案例1:只有一行文本輸出(不帶性能數據)
 
假定插件的輸出文本是這樣:
 
DISK OK - free space: / 3326 MB (56%); 
 
如果插件執行的是一個服務檢測,整行輸出都會保存在$SERVICEOUTPUT$宏裏。
 
案例2:一行輸出帶性能數據
 
插件的輸出文本中帶有性能數據可給外部應用來處理。性能數據要用管道符(|)分隔開,象是這樣:
 
DISK OK - free space: / 3326 MB (56%); | /=2643MB;5948;5958;0;5968 
 
如果插件執行的是一個服務檢測,分隔符左側的部分將保存在$SERVICEOUTPUT$宏裏並且右側(用下劃線示意)的部分將保存在$SERVICEPERFDATA$宏裏面。
 
案例3:多行輸出(正文和性能數據都有)
 
插件可以輸出多行文本,並且帶有正文輸出和性能數據,象是這樣:
 
DISK OK - free space: / 3326 MB (56%); | /=2643MB;5948;5958;0;5968 
 
/ 15272 MB (77%); 
 
/boot 68 MB (69%); 
 
/home 69357 MB (27%);  
 
/var/log 819 MB (84%); | /boot=68MB;88;93;0;98 
 
/home=69357MB;253404;253409;0;253414 
 
/var/log=818MB;970;975;0;980 
 
如果插件執行的是一個服務檢測,第一行分隔符左側的部分將保存在$SERVICEOUTPUT$宏裏,帶有下劃線標識的部分(帶空格)將保存在$SERVICEPERFDATA$宏裏,帶刪除符標識的部分(不帶換行符)的部分將保存在$LONGSERVICEOUTPUT$宏裏(以上的下劃線和刪除符只是爲標記文本段而用的,實際文本中不帶有符號格式--譯者注)。
 
每個宏的最終結果是這樣的:
 
   內容
$SERVICEOUTPUT$     DISK OK - free space: / 3326 MB (56%);
$SERVICEPERFDATA$ /=2643MB;5948;5958;0;5968./boot=68MB;88;93;0;98./home=69357MB;253404;253409;0;253414./var/log=818MB;970;975;0;980
$LONGSERVICEOUTPUT$ / 15272 MB (77%);\n/boot 68 MB (69%);\n/var/log 819 MB (84%);
利用多行輸出結果的機制,可以採取多種方式來返回性能數據:
 
無論什麼情況都沒有性能數據;
 
只返回一行性能數據;
 
只是在後序的行內返回性能數據(第一行不用的管道分隔符右側不填內容);
 
利用全部的輸出位置來帶出性能數據。
 
(看起來第一行右側部分有點"多餘",真的可以不用,但其實這是作者爲軟件向下兼容低版本使用的插件而特意這麼做的,很有必要這麼做,看一下源程序就明白了。)
 
五、插件輸出長度限制
 
Nagios只處理插件返回的前4KB數據內容。這樣是爲了防止插件返回一個上兆或上千兆的數據塊給Nagios處理。這個4K的限制很容易修改,如果你想改,可以編輯一下源代碼裏的MAX_PLUGIN_OUTPUT_LENGTH宏定義,在源程序包的include/nagios.h.in文件裏,重編譯一下Nagios就可以了,其他地方不用動!
 

 

如果想找點例子來學習開發插件,推薦去下載Nagios插件項目官方的軟件包,插件代碼使用多種語言(象C、Perl和SHELL腳本等)寫成插件。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章