之前把Nagios的基本安装和配置都讲完了,但是Nagios最有趣的地方才刚刚开始。就是“服务”-“命令”-“插件”这3者的关系,体现了Naigos在监测工作中的原理,这一话就是特别用来分析其中的关系了。


一.监测服务的定义:
首先看看在localhost.cfg中定义的一个本地系统根分区空间使用状况监测服务:
------------------------------------------------------------------
define service{
        use                              local-service        
        host_name                        localhost
        service_description              Root Partition
check_command    check_local_disk!20%!10%!/
        }
------------------------------------------------------------------
可以发现这个服务的定义名叫做Root Partition,而这个Root Partition的实际功能则是在于check_command这个配置项中指定的参数,在这里它后面的参数是“check_local_disk!20%!10%!/”,那么这一串到底是什么意思呢?其实它应该被分开成两部分,即“check_local_disk”和“!20%!10%!/”。


二.监测命令的定义:
先来说说前面的那个“check_local_disk”,这就是Nagios的监测服务所使用到的“命令”,而这个命令的具体内容是在commands.cfg文件中定义的,commands.cfg这个文件就是专门定义命令用的配置文件。而在localhost.cfg或者其他文件中定义服务的时候所用到的命令,都必须是在command.cfg中定义过的命令。在commands.cfg中“check_local_disk”是如下定义的:
------------------------------------------------------------------
define command{
        command_name     check_local_disk
        command_line     $USER1$/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$
        }
------------------------------------------------------------------
与其他的功能对象定义文件的格式相似:
------------------------------------------------------------------
define command{
通过define关键字command来表示一个命令定义段,定义内用在两个大括号内,并且一个属性必须占一行。如果要定义多个命令的话要写多个define command {}段。

        command_name     check_local_disk
通过command_name来定义命令的名字。在服务的定义当中,只能引用这种在commands.cfg中定义过的命令名。

       command_line     $USER1$/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$
通过command_line来定义该命令的所使用到的插件程序以及参数配置格式。
        }
------------------------------------------------------------------


三.Nagios的插件程序:
这里还要说明一下command_line后面的命令格式是怎么回事。command_line后面指定了定义命令时所使用到的Nagios插件程序以及相关的参数格式。那么,这些插件是如何指定的呢?
这些插件在安装了Nagios-plugins插件程序包后,就会在Nagios的主路径下的libexec里找到相应的插件程序。
浏览插件程序目录
[root@KCentOS5C ~]# ls /usr/local/nagios/libexec/
------------------------------------------------------------------
check_apt        check_flexlm         check_load       check_overcr    check_swap
check_breeze     check_ftp            check_log        check_ping      check_tcp
check_by_ssh     check_http           check_mailq      check_pop       check_time
check_clamd      check_icmp           check_mrtg       check_procs     check_udp
check_cluster    check_ide_smart      check_mrtgtraf   check_real      check_ups
check_dhcp       check_ifoperstatus   check_nagios     check_rpc       check_users
check_dig        check_ifstatus       check_nntp       check_sensors   check_wave
check_disk       check_imap           check_nntps      check_simap     negate
check_disk_smb   check_ircd           check_nt         check_smtp      urlize
check_dns        check_jabber         check_ntp        check_spop      utils.pm
check_dummy      check_ldap           check_nwstat     check_ssh       utils.sh
check_file_age   check_ldaps          check_oracle     check_ssmtp
------------------------------------------------------------------
这些就是Nagios-plugins的所有插件程序。之前在定义check_local_disk这个命令时所使用到的插件程序ckeck_disk也在其中。这些插件程序都是一个一个的独立的二进制可执行程序,也就是说,他们可以独立运行,有自己参数和选项,当然也有帮助。这里做一个示范:

察看check_disk插件程序的使用
[root@KCentOS5C ~]# /usr/local/nagios/libexec/check_disk -h
------------------------------------------------------------------
check_disk v1793 (nagios-plugins 1.4.10)
Copyright (c) 1999 Ethan Galstad <nagios@nagios.org>
Copyright (c) 1999-2006 Nagios Plugin Development Team
        <nagiosplug-devel@lists.sourceforge.net>
This plugin checks the amount of used disk space on a mounted file system
and generates an alert if free space is less than one of the threshold values

Usage: check_disk -w limit -c limit [-W limit] [-K limit] {-p path | -x device}
[-C] [-E] [-e] [-g group ] [-k] [-l] [-M] [-m] [-R path ] [-r path ]
[-t timeout] [-u unit] [-v] [-X type]
这个就是check_disk的使用格式。

Options:
-h, --help
    显示帮助信息。

-V, --version
    显示版本信息。

-w, --warning=INTEGER
    设定产生告警的磁盘个数的阀值,低于该磁盘数量则产生告警通知。

-w, --warning=PERCENT%
    设定产生告警的百分比阀值,可用空间低于该百分比值就产生告警通知。

-c, --critical=INTEGER
    设定产生严重告警的磁盘个数的阀值,低于该磁盘数量则产生严重告警通知。

-c, --critical=PERCENT%
    设定产生严重告警的百分比阀值,可用空间低于该百分比值就产生严重告警通知。
......
------------------------------------------------------------------


四.Nagios的资源文件:
通过上面的分析就一定能够了解后“$USER1$/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$”的大致意思了,就是调用check_disk插件程序,并且指定了调用该执行程序的选项-w、-c、-p,并且$ARG1$、$ARG2$、$ARG3$分别是这3个选项后面跟加的参数值,但是这些只是参数变量,那么具体的参数值在哪里设定呢?让我们回头再看看在服务中定义的“check_local_disk!20%!10%!/”后面的“20%!10%!/”,后半部分就是预先指定的参数值了,通过感叹号“!”来分隔参数。

这样看或许会相对容易理解:
------------------------------------------------------------------
            check_local_disk       !        20%       !         10%      !         /
        $USER1$/check_disk    -w     $ARG1$    -c     $ARG2$    -p    $ARG3$
------------------------------------------------------------------
也就是说20%和10%是正好匹配-w和-c两个选项的参数值,而最后-p选项的参数值使用缺省,这里就通过“/”来表示。

至于$USER1$/check_disk这个变量路径是在哪里指定的呢?其实这个就是定义在Nagios的资源文件resource.cfg里面了。
[root@KCentOS5C ~]# vi /usr/local/nagios/etc/resource.cfg
------------------------------------------------------------------
# Sets $USER1$ to be the path to the plugins
$USER1$=/usr/local/nagios/libexec
这里就定义$USER1$这个路径变量,用来帮助Nagios找到自己的plugins插件程序的位置。
------------------------------------------------------------------


五.Nagios服务与命令还有插件的关系的总结:
基本上要分为三个步骤
1.首先要在确认在libexec/目录下的插件程序的使用方式,以及相关参数选项的格式。如果对某个插件程序的使用方法不是很明确的话,可以到插件目录下使用-h参数来执行插件程序,以了解和掌握该插件的使用方式。

2.其次要在commands.cfg命令文件中定义命令,指定所用到的插件,并且写好会用到的选项和留出参数变量。如$USER1$/exec -a $ARG1$ -b$ARG2$ -c $ARG3$...这样。

3.最后在服务定义文件中指定定义过的命令名,加上合适的参数,每个之间通过“!”来分隔,如果一个参数当中还要分几个子参数的话,那么子参数之间通过都好“,”来分隔,最终把监测服务定义好。


六.给出一些基本常用服务与其相关命令和插件的对应关系示例:
通过比较各个配置文件当中的相关部分,可以加深理解。

1.连通监测服务:Ping指定主机。
------------------------------------------------------------------
<localhost.cfg>
define service{
        use                              connection-service        
        host_name                        localhost,KCentOS5A,KCWIN2K3A,KCXP1
        service_description              PING
check_command    check_ping!100.0,20%!500.0,60%
        }

<command.cfg>
define command{
        command_name     check_ping
        command_line     $USER1$/check_ping -H $HOSTADDRESS$ -w $ARG1$ -c $ARG2$ -p 5
        }

<check_ping>
Usage:check_ping -H <host_address> -w <wrta>,<wpl>% -c <crta>,<cpl>%
[-p packets] [-t timeout] [-4|-6]
-H, --hostname=HOST
    host to ping
-w, --warning=THRESHOLD
    warning threshold pair
-c, --critical=THRESHOLD
    critical threshold pair
-p, --packets=INTEGER
    number of ICMP ECHO packets to send (Default: 5)
------------------------------------------------------------------


2.连通监测服务:监测指定主机的TCP连接。
------------------------------------------------------------------
<localhost.cfg>
define service{
        use                              connection-service
        host_name                        localhost,KCentOS5A,KCWIN2K3A,KCXP1
        service_description              Check TCP 80
check_command    check_tcp!80

        }
<command.cfg>
define command{
command_name check_tcp
command_line $USER1$/check_tcp -H $HOSTADDRESS$ -p $ARG1$
}

<check_tcp>
Usage:check_tcp -H host -p port [-w <warning time>] [-c <critical time>] [-s <send string>]
[-e <expect string>] [-q <quit string>][-m <maximum bytes>] [-d <delay>]
[-t <timeout seconds>] [-r <refuse state>] [-M <mismatch state>] [-v] [-4|-6] [-j]
[-D <days to cert expiry>] [-S <use SSL>] [-E]
-w, --warning=DOUBLE
    Response time to result in warning status (seconds)
-c, --critical=DOUBLE
    Response time to result in critical status (seconds)
-H, --hostname=ADDRESS
    Host name, IP Address, or unix socket (must be an absolute path)
-p, --port=INTEGER
    Port number (default: none)
------------------------------------------------------------------


3.本地系统监测服务:监测本地主机磁盘剩余空间。
------------------------------------------------------------------
<localhost.cfg>
define service{
        use                              local-service        
        host_name                        localhost
        service_description              Root Partition
check_command    check_local_disk!20%!10%!
        }

<command.cfg>
define command{
        command_name     check_local_disk
        command_line     $USER1$/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$
        }

<check_check_local_disk>
Usage: check_disk -w limit -c limit [-W limit] [-K limit] {-p path | -x device}
[-C] [-E] [-e] [-g group ] [-k] [-l] [-M] [-m] [-R path ] [-r path ]
[-t timeout] [-u unit] [-v] [-X type]
-w, --warning=INTEGER
    Exit with WARNING status if less than INTEGER units of disk are free
-w, --warning=PERCENT%
    Exit with WARNING status if less than PERCENT of disk space is free
-c, --critical=INTEGER
    Exit with CRITICAL status if less than INTEGER units of disk are free
-c, --critical=PERCENT%
    Exit with CRITCAL status if less than PERCENT of disk space is free
-p, --path=PATH, --partition=PARTITION
    Path or partition (may be repeated)
------------------------------------------------------------------


4.本地系统监测服务:监测本地主机运行进程数。
------------------------------------------------------------------
<localhost.cfg>
define service{
        use                              local-service        
        host_name                        localhost
        service_description              Total Processes
check_command    check_local_procs!250!400!RSZDT
        }

<command.cfg>
define command{
        command_name     check_local_procs
        command_line     $USER1$/check_procs -w $ARG1$ -c $ARG2$ -s $ARG3$
        }

<check_ping>
Usage:check_procs -w <range> -c <range> [-m metric] [-s state] [-p ppid]
[-u user] [-r rss] [-z vsz] [-P %cpu] [-a argument-array]
[-C command] [-t timeout] [-v]
Required Arguments:
-w, --warning=RANGE
   Generate warning state if metric is outside this range
-c, --critical=RANGE
   Generate critical state if metric is outside this range
Optional Filters:
-s, --state=STATUSFLAGS
   Only scan for processes that have, in the output of `ps`, one or
   more of the status flags you specify (for example R, Z, S, RS,
   RSZDT, plus others based on the output of your 'ps' command).
------------------------------------------------------------------

通过这一话,应该明确Nagios系统当中“服务”-“命令”-“插件”这3者之间的关系。这是了解之后远程系统监测用到的NRPE核心扩展插件的基础,如果这里对Nagios“服务”-“命令”-“插件”这3者关系概念模糊的话,会使得接下去的理解非常艰难。

本文转自http://hi.baidu.com/kouzl/item/d4c598d797969f4ffb5768b4