一、Nagios概述
1、簡介
Nagios是插件式的結構,它本身沒有任何監(jiān)控功能,所有的監(jiān)控都是通過插件進行的,因此其是高度模塊化和富于彈性的。Nagios監(jiān)控的對象可分為兩類:主機和服務。主機通常指的是物理主機,如服務器、路由器、工作站和打印機等,這里的主機也可以是虛擬設備,如xen虛擬出的Linux系統(tǒng);而服務通常指某個特定的功能,如提供http服務的httpd進程等。而為了管理上的方便,主機和服務還可以分別被規(guī)劃為主機組和服務組等。
Nagios不監(jiān)控任何具體數值指標(如操作系統(tǒng)上的進程個數),它僅用四種抽象屬性對被監(jiān)控對象的狀態(tài)進行描述:OK、WARNING, CRITICAL和UNKNOWN。于是,管理員只需要對某種被監(jiān)控對象的WARNING和CRITICAL狀態(tài)的閾值進行關注和定義即可。Nagios通過將WARTING和CRTICAL的閾值傳遞給插件,并由插件負責某具體對象的監(jiān)控及結果分析,其輸出信息為狀態(tài)信息(OK,WARNING,CRITICAL或UNKOWN)以及一些附加的詳細說明信息。
2、特性
由上述說明可以,Nagios是極富彈性的,其監(jiān)控功能完全可以按照管理員的期望進行。此外,它外提供了對問題的自動響應能力和一個功能強大的通知系統(tǒng)。所有這些功能的實現是基于一個結構明晰的對象定義系統(tǒng)和少數幾個對象類型實現的。
1) 命令(Commands)
“命令”用于定義Nagios如何執(zhí)行某特定的監(jiān)控工作。它是基于某特定的Nagios插件定義出的一個抽象層,通常包含一組要執(zhí)行的操作。
2)時段(Time periods)
“時段”用于定義某“操作”可以執(zhí)行或不能執(zhí)行的日期和時間跨度,如工作日內的每天8:00-18:00等;
3)聯系人和聯系人組(Contacts and contact groups)
“聯系人”用于定義某監(jiān)控事件的通知對象、要通知的信息以及這些接收通知者何時及如何接收通知;一個或多個聯系人可以定義為聯系人組,而一個聯系人也可以屬于多個組;
4) 主機和主機組(host and host groups)
“主機”通常指某物理主機,其包括此主機相關的通知信息的接收者(即聯系人)、如何及何時進行監(jiān)控的定義。主機也可以分組,即主機組(host groups),一個主機可同時屬于多個組;
5) 服務(Services)
“服務”通常指某主機上可被監(jiān)控的特定的功能或資源,其包括此服務相關的通知信息的接收者、如何及何時進行監(jiān)控等。服務也可以分組,即服務組(Service groups),一個服務可同時屬于多個服務組;
3、依賴關系
Nagios的強大功能還表現在其成熟的依賴關系系統(tǒng)上。比如,某路由設備故障必然會導致關聯在其上的其它主機無法被正常訪問,如果不能定義這些設備間的依賴關系,那么監(jiān)控系統(tǒng)上必然會出現大量的設備故障信息。而Nagios則通過依賴關系來描述網絡設備的拓撲結構,并能夠實現在某設備故障時不再對依賴于此設備的其它設備進行檢測,從而避免了無謂的故障信息,方便管理員及時定位并排除故障。此外,Nagios的依賴關系還可以在服務級別上實現,如果某服務依賴于其它服務時,也能實現類似主機依賴關系的功能。
4、宏
Nagios還能夠使用宏,并且宏的定義在整個Nagios系統(tǒng)中具有一致性。宏是能夠用于對象定義中的變量,其值通常依賴于上下文。在“命令”中定義的宏,相對于主機、服務或其它許多參數來說,其值會隨之不同。比如,某命令可以根據向其傳遞的IP地址的不同來監(jiān)控不同的主機。
5、計劃中宕機
Nagios還提供了調度性計劃中的宕機機制,管理員可以周期性的設定某主機或服務為計劃中的不可用狀態(tài)。這種功能可以阻止Nagios在調度宕機時段通知任何信息。當然,這也可以讓Nagios自動通知管理員該進行主機或服務維護了。
6、軟狀態(tài)和硬狀態(tài)(Soft and Hard States)
如上所述,Nagios的主要工作是檢測主機或服務的狀態(tài),并將其存儲下來。某一時刻,主機或服務狀態(tài)僅可以是四種可用狀態(tài)之一,因此,其狀態(tài)能夠正確反映主機或服務的實際狀況就顯得特別關鍵。為了避免某偶然的臨時性或隨機性問題,Nagios引入了軟狀態(tài)和硬狀態(tài)。在實際的檢測中,Nagios一旦發(fā)現某主機或服務的狀態(tài)為UNKOWN或不同于上一次檢測時的狀態(tài),其將會對此主機或服務進行多次測試以確保此狀態(tài)的變動是非偶然性的。具體共要做出幾次測試是可以配置的,在這個指定次數的測試時段內,Nagios假設此變化后的狀態(tài)為軟件狀態(tài)。一旦測試完成后狀態(tài)仍然為新變的狀態(tài)時,此狀態(tài)就成了硬狀態(tài)。
二、安裝配置Nagios
1、Nagios程序簡介
Nagios通常由一個主程序(Nagios)、一個插件程序(Nagios-plugins)和四個可選的ADDON(NRPE、NSCA、NSClient++和NDOUtils)組成。Nagios的監(jiān)控工作都是通過插件實現的,因此,Nagios和Nagios-plugins是服務器端工作所必須的組件。而四個ADDON中,NRPE用來在監(jiān)控的遠程Linux/Unix主機上執(zhí)行腳本插件以實現對這些主機資源的監(jiān)控;NSCA用來讓被監(jiān)控的遠程Linux/Unix主機主動將監(jiān)控信息發(fā)送給Nagios服務器(這在冗余監(jiān)控模式中特別要用到);NSClient++是用來監(jiān)控Windows主機時安裝在Windows主機上的組件;而NDOUtils則用來將Nagios的配置信息和各event產生的數據存入數據庫,以實現這些數據的快速檢索和處理。這四個ADDON(附件)中,NRPE和NSClient++工作于客戶端,NDOUtils工作于服務器端,而NSCA則需要同時安裝在服務器端和客戶端。
目前,Nagios只能安裝在Linux系統(tǒng)主機上,其編譯需要用到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用戶:
# vi /usr/local/nagios/etc/objects/contacts.cfg
email nagios@localhost #這個是默認設置
在httpd的配置文件目錄(conf.d)中創(chuàng)建Nagios的Web程序配置文件:
# make install-webconf
創(chuàng)建一個登錄nagios web程序的用戶,這個用戶帳號在以后通過web登錄nagios認證時所用:
# htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin
以上過程配置結束以后需要重新啟動httpd:
# service httpd restart
4、編譯、安裝nagios-plugins
nagios的所有監(jiān)控工作都是通過插件完成的,因此,在啟動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添加為系統(tǒng)服務并將之加入到自動啟動服務隊列:
# 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
如果您的系統(tǒng)開啟了selinux服務,則默認為拒絕nagios web cgi程序的運行。您可以通過下面的命令來檢查您的系統(tǒng)是否開啟了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系統(tǒng)的安全,建議您使用信息摘要強認證模式(如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存儲所有主機和服務當前狀態(tài)信息的文件;
status_update_interval: 設定status_file指定的文件中狀態(tài)信息的更新頻率;
service_check_timeout: 設定服務檢測的超時時間,默認為60秒;
host_check_timeout: 設定主機檢測的超時時間,默認為30秒;
notification_timeout: 設定通知信息發(fā)送嘗試的超時時間,默認為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:某主機的當前狀態(tài),為UP,DOWN,UNREACHABLE三者之一;
HOSTGROUPNAMES: 用于引用某主機所屬的所有主機組的簡名,主機組名稱之間以逗號分隔;
LASTHOSTCHECK:用于引用某主機上次檢測的時間和日期,Unix時間戳格式;
LISTHOSTSTATE:用于引用某主機前一次檢測時的狀態(tài),為UP,DOWN或UNREACHABLE三者之一;
SERVICEDESC: 用于引用對應service對象中的desccription指令的值;
SERVICESTATE: 用于引用某服務的當前狀態(tài),為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、定義主機對象
“主機”指的是被監(jiān)控的機器,可是物理主機,也可以是虛擬設備。一個主機對象的定義至少應該包含一個簡名(short name)、一個別名、一個IP地址和用到的檢測命令。此外,很多時候,其定義中還應該包含監(jiān)控時段、聯系人及要通知的相關問題、檢測的頻率、重試檢測的方式、發(fā)送通知的頻率等。具體的各指令及說明請參見官方文檔: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用于指定當主機處于什么狀態(tài)時應該發(fā)送通知。其各狀態(tài)及其表示符如下:
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用于指定當服務處于什么狀態(tài)時應該發(fā)送通知。其各狀態(tài)及其表示符如下:
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、定義命令對象
“命令”用于描述如何對主機或服務進行狀態(tài)檢測。服務對象的定義包含兩個指令:名字(command_name)和命令行(command_line);名字用于標識此命令對象,命令行則是執(zhí)行檢測時真正要執(zhí)行的命令。
當命令對象用于檢測其它對象時,其通常需要用到額外的參數以標識要檢測的某特定對象,此時,命令對象需要以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、定義“時段”對象
“時段”用于定義某“操作”可以執(zhí)行或不能執(zhí)行的日期和時間跨度,如工作日內的每天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 linuxedu@magedu.com
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 vpnserver1
dependency_period maintenancewindows
}
其中host_name用于定義master主機,dependent_host_name定義dependent主機。而在依賴關系的定義中,通常還會用到execution_failure_criteria定義master主機為何種狀態(tài)時不再對依賴于此master的主機進行檢測,notification_failure_criteria用于定義master處于何種狀態(tài)時不會發(fā)送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監(jiān)控遠程Linux主機
1、NRPE簡介
Nagios監(jiān)控遠程主機的方法有多種,其方式包括SNMP、NRPE、SSH和NCSA等。這里介紹其通過NRPE監(jiān)控遠程Linux主機的方式。
NRPE(Nagios Remote Plugin Executor)是用于在遠端服務器上運行檢測命令的守護進程,它用于讓Nagios監(jiān)控端基于安裝的方式觸發(fā)遠端主機上的檢測命令,并將檢測結果輸出至監(jiān)控端。而其執(zhí)行的開銷遠低于基于SSH的檢測方式,而且檢測過程并不需要遠程主機上的系統(tǒng)帳號等信息,其安全性也高于SSH的檢測方式。
2、安裝配置被監(jiān)控端
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.tar.gz
# ./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.conf
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指令用于定義本機所允許的監(jiān)控端的IP地址。
5)啟動NRPE
# /usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg –d
為了便于NRPE服務的啟動,可以將如下內容定義為/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目錄中創(chuàng)建nrpe文件,使其成為一個基于非獨立守護進程的服務,文件內容如下:
service nrpe
{
flags = REUSE
socket_type = stream
wait = no
user = nagios
group = nagios
server = /usr/local/nagios/bin/nrpe
server_args = -c /etc/nagios/nrpe.cfg -i
log_on_failure += USERID
disable = no
}
此種情況下啟動NRPE進程需要通過重啟xinetd來實現。
6)配置允許遠程主機監(jiān)控的對象
在被監(jiān)控端,可以通過NRPE監(jiān)控的服務或資源需要通過nrpe.conf文件使用命令進行定義,定義命令的語法格式為: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、配置監(jiān)控端
1)安裝NRPE
# tar -zxvf nrpe-2.12.tar.gz
# cd nrpe-2.12.tar.gz
# ./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)定義如何監(jiān)控遠程主機及服務:
通過NRPE監(jiān)控遠程Linux主機要使用chech_nrpe插件進行,其語法格式如下:
check_nrpe -H <host> [-n] [-u] [-p <port>] [-t <timeout>] [-c <command>] [-a <arglist...>]
使用示例1:
定義監(jiān)控遠程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定義更具有通用性,那么上面的定義也可以修改為如下:
定義監(jiān)控遠程Linux主機的命令:
define command
{
command_name check_nrpe
command_line $USER1$/check_nrpe –H "$HOSTADDRESS$" -c $ARG1$
}
定義遠程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:
如果還希望在監(jiān)控遠程Linux主機時還能向其傳遞參數,則可以使用類似如下方式進行:
定義監(jiān)控遠程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++監(jiān)控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.
vi /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插件開發(fā)的官方指南。
一、插件概覽
作為Nagios插件的腳本或執(zhí)行程序必須(至少)要做兩件事:
退出時給出幾種可能的返回值中的一個;
至少要給出一條輸出內容到標準輸出設備(STDOUT)。
對Nagios來說,插件里面做什么并不重要。自制插件可以是做TCP端口狀態(tài)檢測,運行某個數據庫查詢,檢查磁盤空閑空間,或其他需要檢測的內容。這取決于你想檢測什么東西,這完全由你自己決定。
二、返回值
Nagios用插件的返回值來生成主機或服務的狀態(tài)。下表里列出了合法的返回值以及對應的服務或主機狀態(tài)。
插件返回值 服務狀態(tài) 主機狀態(tài)
0 正常(OK) 運行(UP)
1 告警(WARNING) 運行(UP)或宕機(DOWN)/不可達(UNREACHABLE)*
2 緊急(CRITICAL) 宕機(DOWN)/不可達(UNREACHABLE)
3 未知(UNKNOWN) 宕機(DOWN)/不可達(UNREACHABLE)
注意:如果使能use_aggressive_host_checking選項,返回值1將使主機狀態(tài)要么是宕機(DOWN)要么是不可達(UNREACHABLE)。其他情況下,返回值1將使主機狀態(tài)是運行(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%);
如果插件執(zhí)行的是一個服務檢測,整行輸出都會保存在$SERVICEOUTPUT$宏里。
案例2:一行輸出帶性能數據
插件的輸出文本中帶有性能數據可給外部應用來處理。性能數據要用管道符(|)分隔開,象是這樣:
DISK OK - free space: / 3326 MB (56%); | /=2643MB;5948;5958;0;5968
如果插件執(zhí)行的是一個服務檢測,分隔符左側的部分將保存在$SERVICEOUTPUT$宏里并且右側(用下劃線示意)的部分將保存在$SERVICEPERFDATA$宏里面。
案例3:多行輸出(正文和性能數據都有)
插件可以輸出多行文本,并且?guī)в姓妮敵龊托阅軘祿?,象是這樣:
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
如果插件執(zhí)行的是一個服務檢測,第一行分隔符左側的部分將保存在$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就可以了,其他地方不用動!
六、例子
如果想找點例子來學習開發(fā)插件,推薦去下載Nagios插件項目官方的軟件包,插件代碼使用多種語言(象C、Perl和SHELL腳本等)寫成插件。