一、 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 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 ***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脚本等)写成插件。