前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nagios:企业级系统监控方案

Nagios:企业级系统监控方案

作者头像
张善友
发布2018-01-30 11:48:28
1.7K0
发布2018-01-30 11:48:28
举报
文章被收录于专栏:张善友的专栏

在大多数情况下Cacti + RRDtool已经实现对系统各种参数的监测。但很多企业可能不满足于仅仅监测系统基本参数的需求,而是需要监测除基本参数之外的各种应用程序的运行状况。很显然在这种情况下对于一些系统或者是自定义的程序Cacti + RRDtool的局限性就显示出来了。而此时就轮到了另外一种监测系统的登场。这就是我们现在要介绍的Nagios。

Nagios是一个功能非常强大的开源的系统网络监测程序,通过访问http://www.nagios.org可以了解其基本特性。Nagios不但能够实现对系统CPU,磁盘、网络等方面参数的基本系统监测,而且还能够监测包括SMTP,POP3,HTTP,NNTP等各种基本的服务类型。另外通过一些插件的安装和监测脚本自定义用户可以针对自己的应用程序实现监测,并针对大量的监测主机和多个对象部署层次化的监测架构。而且在监测信息统计方面,Nagios也能够和例如Cacti等程序结合来提供动态统计图表。除此之外Nagios拥有强大的日志管理系统,可以实现详细的日志记录以及回卷。针对架构的扩展和服务器数量的增加可以方便地实现监测区域扩展。最难能可贵的是Nagios提供了优秀的事件报警功能,能够将一些突发的事件以电子邮件的形式通知管理员并能够针对出现的问题提供一些主动的解决建议和方案,并支持冗余监视。

相对于Mrtg以及RRDtool + Cacti而言Nagios最大的特点之一是其设计者将Nagios设计成监测的管理中心尽管其功能是监测服务和主机,但是他自身并不包括这部分功能的代码,所有的监测、监测功能都是由相关插件来完成的,包括报警功能。Nagios自身也没有报警部分的代码和插件,而是交给用户或者其他相关开源项目组去完成。对于Nagios这个监测中心来说,细致的工作必然是交给其他的软件来实现。

下面我们就开始实施Nagios的基本安装和配置。

我的操作环境是:

监测主机:IP:192.168.1.10 操作系统:RHEL 5u8 被监测主机:IP:192.168.1.220 操作系统:RHEL 5u8

Nagios的所有软件包可以从其官方网站获得http://www.nagios.org/download/。这里无论是基本软件包还是插件我都使用的最新版本。因为我使用的操作系统是Red Hat最新版本,原则上对于较新的操作系统版本通常我们都选择配合最新版本的第三方软件以避免兼容性问题。

首先在监测主机也就是192.168.1.10上安装Nagios的基本软件包,在安装Nagios之前首先需要保证系统中有下面这些软件包:Apache,gcc,gd,gd-devel,glibc,glibc-devel。可以用rpm –qa | grep的方式去逐一检查。

如果确认上面这些包都安装之后需要先建立Nagios的用户和nagcmd组:

代码语言:javascript
复制
# useradd -m nagios                                [ Enter ]
# passwd nagios                                 [ Enter ]
并将nagios以及apache用户加入到nagcmd组中
# groupadd nagcmd                                   [ Enter ]
# usermod -G nagcmd nagios                          [ Enter ]
# usermod -G nagcmd apache                          [ Enter ]

完成之后将下载的nagios压缩包拷贝到/usr/local目录中,并且执行下面的步骤进行编译和安装:

代码语言:javascript
复制
# tar -zxf nagios-3.0.3.tar.gz                             [ Enter ]
# cd nagios-3.0.3                                   [ Enter ]

首先初始化和建立编译的环境

代码语言:javascript
复制
# ./configure --with-command-group=nagcmd          [ Enter ]

如果能看到下面的基本配置信息则说明初始的环境已经成功配置完成:

代码语言:javascript
复制
*** Configuration summary for nagios 3.0.3 06-25-2008 ***:
 
 General Options:
 -------------------------
        Nagios executable:  nagios
        Nagios user/group:  nagios,nagios
       Command user/group:  nagios,nagcmd
            Embedded Perl:  no
             Event Broker:  yes
        Install ${prefix}:  /usr/local/nagios
                Lock file:  ${prefix}/var/nagios.lock
   Check result directory:  ${prefix}/var/spool/checkresults
           Init directory:  /etc/rc.d/init.d
  Apache conf.d directory:  /etc/httpd/conf.d
             Mail program:  /bin/mail
                  Host OS:  linux-gnu
 
 Web Interface Options:
 ------------------------
                 HTML URL:  http://localhost/nagios/
                  CGI URL:  http://localhost/nagios/cgi-bin/
 Traceroute (used by WAP):  /bin/traceroute
 
Review the options above for accuracy.  If they look okay,
type 'make all' to compile the main program and CGIs.

之后按照提示执行命令来进行编译:

代码语言:javascript
复制
# make all                                             [ Enter ]

如果编译过程顺利完成,则需要执行下面的命令:

代码语言:javascript
复制
# make install                                             [ Enter ]
# make install-init                                         [ Enter ]
# make install-config                                       [ Enter ]
# make install-commandmode                              [ Enter ]

分别用于安装二进制文件、初始化脚本、示例配置文件和设置目录权限。

代码语言:javascript
复制
# ls /usr/local/nagios                                     [ Enter ]

安装完成之后,在/usr/local/nagios目录下如果能够看到这些目录:bin etc sbin share var就表示Naigos安装成功了。

不过在完成之后还不能启动Nagios,因为还有一些操作需要执行。

Nagios的样例配置文件默认安装在/usr/local/nagios/etc目录下,这些样例文件可以配置Nagios使之正常运行,只需要做一个简单的修改。用你擅长的编辑器软件来编辑这个/usr/local/nagios/etc/objects/contacts.cfg配置文件,更改email部分,在nagiosadmin的联系人定义信息中的EMail信息为你的EMail信息以接收报警内容。

代码语言:javascript
复制
# vi /usr/local/nagios/etc/objects/contacts.cfg                    [ Enter ]

之后执行下面的命令来安装Nagios的WEB配置文件到Apache的conf.d目录下:

代码语言:javascript
复制
# make install-webconf                                     [ Enter ]

在Apache中使用基本认证的方式创建一个nagiosadmin的用户用于Nagios的WEB界面登录。记下你所设置的登录口令。该用户登录口令和账号信息会存储到/usr/local/nagios/etc/passwd.users文件中:

代码语言:javascript
复制
# htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin     [ Enter ]

在Nagios主程序安装之后会自动将相关apache配置文件放到/etc/http/conf.d目录下,文件名是nagios.conf。文件内容如下:

代码语言:javascript
复制
# cat /etc/httpd/conf.d/nagios.conf                            [ Enter ]
ScriptAlias /nagios/cgi-bin "/usr/local/nagios/sbin"
 
<Directory "/usr/local/nagios/sbin">
   Options ExecCGI
   AllowOverride None
   Order allow,deny
   Allow from all
   AuthName "Nagios Access"
   AuthType Basic
   AuthUserFile /usr/local/nagios/etc/htpasswd.users
   Require valid-user
</Directory>
 
Alias /nagios "/usr/local/nagios/share"
 
<Directory "/usr/local/nagios/share">
   Options None
   AllowOverride None
   Order allow,deny
   Allow from all
   AuthName "Nagios Access"
   AuthType Basic
   AuthUserFile /usr/local/nagios/etc/htpasswd.users
   Require valid-user

这就意味着只有通过认证用户才可以通过http访问/usr/loca/nagios/share以及/usr/local/nagios/sbin目录下内容。而这个能够通过认证的用户也就是nagiosadmin,之后可以重启apache来应用配置:

代码语言:javascript
复制
   # service httpd restart                                             [ Enter ]
# chkconfig --level 345 httpd on                                        [ Enter ]

刚才已经提到Nagios主程序只是一个控制中心,而能够起到服务监测和系统监测等功能的是众多Nagios的插件,没有插件的Nagios系统其实只是一个空壳。因此在安装了Nagios平台之后我们还需要安装插件。

Nagios插件同样是在其官方网站下载,目前版本是1.4.12。我将下载的源码包放到/usr/local目录下,按照下面的步骤进行解压,编译和安装:

代码语言:javascript
复制
# tar -zxf nagios-plugins-1.4.12.tar.gz                                    [ Enter ]
# cd nagios-plugins-1.4.12                                          [ Enter ]
# ./configure --with-nagios-user=nagios --with-nagios-group=nagios          [ Enter ]
# make                                                          [ Enter ]
# make install                                                      [ Enter ]

然后把Nagios加入到服务列表中以使之在系统启动时自动启动:

代码语言:javascript
复制
# chkconfig --add nagios                                               [ Enter ]
# chkconfig nagios on                                               [ Enter ]

执行下面的命令来验证Nagios的样例配置文件:

代码语言:javascript
复制
# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg             [ Enter ]

如果最后的结果类似下面而没有报错,可以启动Nagios服务:

代码语言:javascript
复制
Total Warnings: 0
Total Errors:   0
 
Things look okay - No serious problems were detected during the pre-flight check
# service nagios start

之后可以在浏览器上访问链接http://192.168.1.10/nagios,如果能够正常看到页面,证明主程序和插件都安装和配置成功(如图pic32.png所示)!点击“Service Detail”的链接来查看你本机的监视详情。此时可能需要给点时间让Nagios来检测你机器上所依赖的服务(如图pic33.png-pic34.png所示)。

实际上在装完Nagios之后此时网络监测工作只是刚刚开始而已,毫无疑问用户的需求不是只监测本地系统,而是大量的远程服务器上的系统状况以及服务运行状况。

有几种不同方式来监测远程Linux/UNIX服务器的服务与属性。

其中之一是应用共享式SSH密钥,即运行check_by_ssh插件来执行对远程主机的检测。这种方法会导致安装有Nagios的监测服务器产生很高的系统负荷,尤其是要同时监测成百个主机中的上千个服务时,这是因为要建立大量的SSH连接的总开销会很高。

另一种方法是使用NRPE外部构件监测远程主机。NRPE外部构件可以在远程的Linux/Unix主机上执行插件程序。如果是要象监测本地主机一样对远程主机的磁盘利用率、CPU负荷和内存占用率等情况下,NRPE外部构件将非常有用。

提到“外部构件”这个概念的时候需要说明一下,Nagios有许多"外部构件"软件包可供使用。外部构件可以扩展Nagios的应用并使之与其他软件集成,而且能够通过WEB接口来实现管理配置文件,监测远程主机(*NIX,Windows等),对远程主机的强制监测,减化并扩展告警逻辑等功能。

NRPE是一个可在远程Linux/Unix主机上执行的插件的外部构件包。如果你需要监测远程的主机上的本地资源或属性,如磁盘利用率、CPU负荷、内存利用率等时是很有用的。最终效果和用check_by_ssh插件来实现的功能一样,但是他不需要占用更多的监测主机的CPU负荷,所以当你需要监测大量的主机时这个构件将起到很重要的作用(如图pic35.png所示)。

通过该图可以看出,我们需要在被监测主机上部署NRPE,他相当于一个守护进程负责监听。而监测主机使用check_nrpe并通过SSL连接访问这个daemon,然后调用被监测方的check_disk,check_load等脚本获取信息并将结果传递到监测主机。同时这些脚本也有能力监测到其他主机的相关信息。

NRPE的使用环境有direct check和indirect check两种,direct check指的是NRPE运行在被监测主机的本地,而indirect check意味着运行NRPE的服务器只是一个中间人,他会继续通过刚才所提及的脚本来监测其他更多远程主机上的服务和系统信息。层次化的监测就是通过这种方式来实现。

为了简单说明问题,我们将部署的是基于direct check的环境部署NRPE。所以下面的操作将会在被监测主机192.168.1.220上进行。

首先要建立Nagios账号,这里我使用同样的密码:

代码语言:javascript
复制
# useradd nagios                                               [ Enter ]
# passwd nagios                                             [ Enter ]

之后按照和上面相同的步骤来编译和安装nagios-plugin软件:

代码语言:javascript
复制
# tar -zxf nagios-plugins-1.4.12.tar.gz                                [ Enter ]
# cd nagios-plugins-1.4.12                                      [ Enter ]
# ./configure                                                   [ Enter ]
# make                                                      [ Enter ]
# make install                                                  [ Enter ]

然后对相关的目录设置权限和所属用户组:

代码语言:javascript
复制
# chown nagios.nagios /usr/local/nagios                                [ Enter ]
# chown –R nagios.nagios /usr/local/nagios/libexec                    [ Enter ]

接着NRPE包放到/usr/local目录下,按照下面的步骤解压缩,并且编译和安装:

代码语言:javascript
复制
# tar -zxf nrpe-2.12.tar.gz                                        [ Enter ]
# cd nrpe-2.12                                                  [ Enter ]
# ./configure                                                   [ Enter ]
# make all                                                  [ Enter ]
# make install-plugin                                           [ Enter ]
# make install-daemon                                           [ Enter ]
# make install-daemon-config                                        [ Enter ]

同时安装NRPE的插件、进程以及进程范例配置文件。

接着执行命令将nrpe安装为依赖xinetd超级进程的非独立服务,那么前提是必须安装xinetd。不过一般系统都会自动安装该服务。 最后执行下面的命令将NRPE安装为xinetd超级进程所管理的进程之一。

代码语言:javascript
复制
# make install-xinetd                                          [ Enter ]

完成之后需要编辑/etc/xinetd.d目录下的nrpe文件,并且在最后添加允许实施监测的主机IP地址,这里是192.168.1.10,那么整个配置文件全文如下:

代码语言:javascript
复制
# cat /etc/xinetd.d/nrpe                                           [ Enter ]
service nrpe
{
        flags           = REUSE
        socket_type     = stream    
        port            = 5666    
        wait            = no
        user            = nagios
        group           = nagios
        server          = /usr/local/nagios/bin/nrpe
        server_args     = -c /usr/local/nagios/etc/nrpe.cfg --inetd
        log_on_failure  += USERID
        disable         = no
        only_from       = 192.168.1.10
}

然后修改/etc/services档,并添加下面的内容:

代码语言:javascript
复制
nrpe            5666/tcp                        # nrpe

重启服务:

代码语言:javascript
复制
# /etc/init.d/xinetd restart                                   [ Enter ]

此时检查nrpe服务启动状况如下:

代码语言:javascript
复制
# netstat -nl | grep 5666                                      [ Enter ]
tcp        0      0 0.0.0.0:5666                0.0.0.0:*                   LISTEN      
# lsof -i:5666
COMMAND  PID USER   FD   TYPE DEVICE SIZE NODE NAME
xinetd  9949 root    5u  IPv4  28764       TCP *:nrpe (LISTEN)

现在最关键的一步是确保安装的NRPE进程能够正常工作,所以要使用check_nrpe插件进行测试。在监测主机192.168.1.10上执行命令:

代码语言:javascript
复制
# /usr/local/nagios/libexec/check_nrpe -H 192.168.1.220            [ Enter ]

如果能够出现如下的版本号显示,则证明在被监测主机上配置的NRPE已经正常工作,并且监测主机能够通过SSL与被监测主机上的NRPE正常通信。 NRPE v2.12

但是如果出现一些error信息,则需要检查配置,检查的内容包括主要有下面几项:

  1. nrpe的版本号和nrpe-plugin的版本号是否一致。版本不一致极有可能造成该问题。
  2. SSL是否被关闭。确保NRPE以及check_nrpe插件在编译的时候都加入了SSL支持,同时在运行时都开启SSL。不过一般编译过程中默认都会假如支持SSL选项。
  3. 确保NRPE的配置文件nrpe.cfg文件可以被nagios用户读取并且nagios用户可以执行nrpe二进制程序。
  4. 确认在/etc/xinetd.d/nrpe文件的“only_from=x.x.x.x”中x.x.x.x是访问NRPE的监测主机的IP地址。

NRPE的配置文件/usr/local/nagios/etc/nrpe.cfg中实际上已经包含了一些对系统进行监测的命令。由于NRPE安装在本地,这些命令可以直接协助NRPE从被监测主机获取系统和服务运行状况,而且都是在刚才通过nagios-plugin安装的。

如果从监测主机上运行这些命令进行监测,一切正确可以看到下面的效果。那么不难看出其中的奥妙,即实际上完全可以利用在/usr/local/nagios/libexec/中的各种脚本并添加各项参数来定制自己的监测内容。(如图pic36.png所示)

那么到此为止我们就完成了在远程被监测主机上安装和配置RNPE的任务。现在需要在监测主机,也即是192.168.1.10上面安装和配置check_nrpe插件。

步骤大概分为:

第一,安装check_nrpe插件; 第二,为使用check_nrpe插件建立Nagios命令定义; 第三,建立Nagios host以及服务定义

由于我们刚才已经在安装Nagios之后安装了nrpe,所以实际上第一个步骤已经完成。

现在开始执行第二步骤——建立命令定义:

这里需要花点时间特别说明一下Nagios利用命令定义进行监测的原理:

在安装nagios成功之后可以看到在/usr/local/nagios/libexec目录下有很多可执行监测程序或者脚本,其名称类似check_icmp这样的格式。Nagios并没有提供针对这些监测程序的脚本的说明文档,想了解这些脚本如何工作,需要通过–h参数,显示其使用方法和参数,并会给出一些实际的例子。例如:./check-disk –h。

那么我们可以尝试按照其中一个例子执行该脚本,执行和显示的结果如下:

代码语言:javascript
复制
# ./check_disk -w 10% -c 5% -p /tmp -p /var -C -w 100000 -c 50000 -p /dev/sda3          [ Enter ]
DISK OK - free space: / 2124 MB (41% inode=90%);| /=2955MB;4820;5088;0;5356

可以看到状态值“OK”,以及一些详细的数据信息。

上述操作说明这些插件都是可以独立使用。Nagios有很多个cfg配置文件用来定义各式各样的信息,其中template.cfg是用来定义主机和服务信息的模板文件,在目录/usr/local/nagios/etc/objects下。我们将按照这些模板来建立新的配置文件,例如同样目录下的server.cfg来定义监测内容,那么这些插件就会从server.cfg中调用。例如要定义一个需要监测的SSH服务,名称为TestSSH:

按照其格式:

代码语言:javascript
复制
define service { 
host_name x.x.x.x
service_description check_ssh 
    ……
check_command check_ssh 
}

host_name项说明该服务所在的主机名,service_description项为服务的说明信息,这项内容会显示在nagios页面中。check_command项说明要使用的命令,这个例子中的命令check_ssh就是一个插件了。这个服务定义明确了nagios在需要监测的内容和监测的手段,即使用check_ssh插件来监测主机x.x.x.x上的ssh服务情况。

除了直接使用插件来做check_command项的参数以外,还可以使用自己定义的命令来做check_command参数。例如,定义一个需要监测的主机,名字是localhost.localdomain:

代码语言:javascript
复制
define host { 
host_name localhost.localdomain
alias remotehost01
address 192.168.0.1 
……
check_command check-host-alive 
    ……
}

在此例中,check_command项的参数“check-host-alive”并非一个插件,而是在commands.cfg档中定义的一个命令。那么在相同目录的command.cfg中对该命令又被定义为:

代码语言:javascript
复制
# 'check-host-alive' command definition 
define command{ 
command_name check-host-alive 
command_line $USER1$/check_ping -H 192.168.1.220 -w 300.0,80% -c 500.0,100% -p 1 
}

首先,$USER1$这个参数在resource.cfg中定义,这个值会指向插件的目录(如:/usr/local/nagios/libexec)。“-H 192.168.1.220”定义目标主机的地址,-w说明后面的一对值对应的是“WARNING”状态,“80%”是其临界值。“-c 500.0,100%” 其中“-c”说明后面的一对值对应的是" CRITICAL",“100%”是其临界值。“-p 1”说明每次探测发送一个包。

所以归根结底就是说通过ping这种方式来证明某台主机处于alive状态。

而至于如何监听非默认端口的服务。下面我也举例说明一下这个问题:

例如:现需检查的一个运行在8080埠上的http服务。那么我们可以对commands.cfg档中对关于check_http的声明做如下修改。

代码语言:javascript
复制
# 'check_http' command definition 
define command{ 
command_name check_http 
command_line $USER1$/check_http -H 192.168.1.220 -p $ARG1$ 
}

其中$ARG1$是指在调用这个命令的时候,命令后面的第一个参数。

再把services.cfg中,对应服务的检测命令后面加一个参数:

代码语言:javascript
复制
define service { 
host_name ...
...
check_command check_http!8080
}

这样就可以对8080埠的http服务进行监测了。如果要添加多个参数的时候,也可以类似操作。 综上所述,插件的安装和调用方法也就举例介绍完毕了,大家在使用中也可以使用自己写的检测脚本来完成比较特殊的检测功能。

所以按照上面所叙述的原理,我们开始第二步和第三步的配置,为使用check_nrpe插件建立Nagios命令定义以及服务定义:

修改配置文件/usr/local/nagios/etc/objects/command.cfg并增加下面的内容:

代码语言:javascript
复制
define command{
command_name check_nrpe
command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
}

然后针对要监测的目标主机建立主机定义,主机定义的项目和内容有很多,所以定义的项目如下:

代码语言:javascript
复制
host_name host_name        # 简短的主机名
alias alias                 # 别名,可以更详细的说明主机
address address         # ip地址,当然如果DNS服务可用也可以写名称。如果你不定义该值,nagios
将会用host_name去寻找主机。
parents host_names          # 上一节点的名称,也就是指从nagios服务器到被监测主机之间经过的节点,
        可以是路由器、交换机、主机等等。这个节点也要定义并且要被nagios监测。
hostgroups              # 简短的主机组名称
check_command           # 检查命令的简短名称,如果此项留空,nagios将不会去判断该主机是否alive。 
max_check_attempts      # 当检查命令的返回值不是“OK”时,重试的次数
check_interval          # 循环检查的间隔时间。
active_checks_enabled      # 是否启用“active_checks”
passive_checks_enabled  # 是否启用“passive_checks”,及“被动检查”
check_period                # 检测时间段简短名称,此处只是名称,具体的时间段要写在其他的配置文件
obsess_over_host            # 是否启用主机操作系统探测。
check_freshness             # 是否启用freshness测试。freshness测试是对于启用被动测试模式的主机而言
的,其作用是定期检查该主机报告的状态信息,如果该状态信息已经过期,
freshness将会强制作主机检查。
freshness_threshold        # fressness的临界值,单位为秒。 如果定义为0,则为自动定义。
event_handler           # 当主机发生状态改变时,采用的处理命令的简短的名字
(可以在commands.cfg中对其定义) 
event_handler_enabled     # 是否启用event_handler
low_flap_threshold          # 抖动的下限值。所谓抖动,主要定义了这样一种现象:在一段时间内,主机
        (或服务)的状态值频繁发生变化,类似一个问题风暴或者一个网络问题。 
high_flap_threshold         # 抖动的上限值
flap_detection_enabled     # 是否启用抖动检测
process_perf_data           # 是否启用processing of performance data
retain_status_information   # 程序重启时,是否保持主机状态相关的信息
retain_nonstatus_information # 程序重启时,是否保持主机状态无关的信息
contact_groups          # 联系人组(这个组会在contactgroup.cfg文件中定义),在此组中的联系人都
                        会受到该主机的告警提醒信息。
notification_interval       # 告警临界值。达到此次数之后,才会发送该机的报警提醒信息。 
notification_period         # 告警时间段
notification_options        # 告警包括的状态变化结果
notifications_enabled       # 是否启用告警提醒功能
stalking_options [o,d,u]     # 持续状态检测参数,o = 持续的UP状态,
d = 持续的DOWN状态,and u = 持续的UNREACHABLE状态.

当然在企业的监测环境中很多项目可能都不一定能够用上,这里我只是通过一个简单的例子说明其用法就好了。所以修改/usr/local/nagios/etc/objects/localhost.cfg文件,于该文件的“HOST DEFINITION”部分,在原来的基础上增加自己的主机定义内容:

代码语言:javascript
复制
define host{
        use linux-box                                  ; Inherit default values from a template
        host_name localhost                            ; The name we're giving to this server
        alias RHEL5u2                                  ; A longer name for the server
        address 192.168.1.220                          ; IP address of the server
        }

同时在“HOST GROUP DEFINITION”部分,将192.168.1.220这台主机加入到linux-servers这个hostgroup中。如果有多台主机都属于这个hostgroup,可以用逗号将其隔开。以下是我添加的内容:

代码语言:javascript
复制
define hostgroup{
        hostgroup_name  linux-servers  ; The name of the hostgroup
        alias           Linux Servers  ; Long name of the group
        members         192.168.1.220  ; Comma separated list of hosts that belong to this group
        }

而在最后的“SERVICE DEFINITION”部分,所有未注释的部分实际上是关于对localhost也就是本机所要监测的内容。其格式和语法就是我在提到Nagios监测原理方面举例说明的内容。对于localhost来说不需要修改了,但是可以把他的内容复制到自定义的cfg档中并照葫芦画瓢修改成对192.168.1.220这台 主机的命令定义。我们下面就来做这样的操作:

在/usr/local/nagios/etc/objects目录下针对监测的服务建立服务定义,建立一个新的文件remotehosts.cfg,加入下面内容:

下面是自定义的:

代码语言:javascript
复制
define service{
use generic-service
host_name localhost
service_description CPU Load
check_command check_nrpe!check_load
}

表示监测远程主机的CPU负载。

如果要监测当前在远程主机的磁盘空间,则加入:

代码语言:javascript
复制
define service{
use generic-service
host_name localhost
service_description /dev/sda3 Free Space
check_command check_nrpe!check_disk /dev/sda3
}

如果要监测当前远程主机的僵死进程数,则加入:

代码语言:javascript
复制
define service{
use generic-service
host_name localhost
service_description Zombie Processes
check_command check_nrpe!check_zombie_procs
}

同时使用vi编辑器末行模式的r功能读取当前目录下的localhost.cfg档,删除“HOST DEFINITION”和“HOST GROUP DEFINITION”部分。只保留“SERVICE DEFINITION”部分并修改为下面的内容:

第一个命令定义:

通过check_ping脚本确保监测主机和被监测主机的连通性,如果网络丢包率到达20%则产生warning警告,到达60%则产生critical警告:

代码语言:javascript
复制
define service{
        use                             local-service         ; Name of service template to use
        host_name                       192.168.1.220
        service_description                 PING REMOTE HOST
        check_command                  check_ping!100.0,20%!500.0,60%
        }

第二个命令定义:

监测远程主机根分区磁盘状况,如果根分区可用空间低于20%会产生Warning警告,如果可用空间低于10%则产生Critical警告:

代码语言:javascript
复制
define service{
        use                             local-service         ; Name of service template to use
        host_name                       192.168.1.220
        service_description                 Root Partition of Remote Server
        check_command                  check_local_disk!20%!10%!/
        }

第三个命令定义:

监测远程主机当前的登录用户数量,如果登录数量大于20用户则产生warning警告,如果大于50则产生critical警告:

代码语言:javascript
复制
define service{
        use                             local-service         ; Name of service template to use
        host_name                       192.168.1.220
        service_description                 Current Users of Remote Server
        check_command                  check_local_users!20!50
        }

第四个命令定义:

监测远程主机当前的进程总数,如果大于250进程则产生warning警告,如果大于400进程则产生critical警告:

代码语言:javascript
复制
define service{
        use                             local-service         ; Name of service template to use
        host_name                       192.168.1.220
        service_description                 Total Processes of Remote Machine
        check_command                   check_local_procs!250!400!RSZDT
        }

第五个命令定义:

监测远程主机当前的本地负载量:

代码语言:javascript
复制
define service{
        use                             local-service         ; Name of service template to use
        host_name                       192.168.1.220
        service_description                 Current Load of Remote Machine
        check_command                  check_local_load!5.0,4.0,3.0!10.0,6.0,4.0
        }

第六个命令定义:

监测远程主机swap文件系统使用量,如果swap可用空间低于20%则产生warning警告,低于10%则产生critical警告:

代码语言:javascript
复制
define service{
        use                             local-service         ; Name of service template to use
        host_name                       192.168.1.220
        service_description                 Swap Usage of Remote Server
        check_command                   check_local_swap!20!10
        }

第七个命令定义:

监测SSH连接可用性,但消息通知功能默认被关闭,因为并不是所有用户都有权限SSH。

代码语言:javascript
复制
define service{
        use                             local-service         ; Name of service template to use
        host_name                       192.168.1.220
        service_description                 SSH of Remote Machine
        check_command                   check_ssh
        notifications_enabled               0
        }

# Define a service to check HTTP on the remote machine.
# Disable notifications for this service by default, as not all users may have HTTP enabled.

第八个命令定义:

监测远程主机上的HTTP服务,但类似于SSH,该服务的消息通知功能默认关闭。

代码语言:javascript
复制
define service{
        use                             local-service         ; Name of service template to use
        host_name                       192.168.1.220
        service_description                 HTTP of Remote Machine
        check_command                   check_http
        notifications_enabled               0
        }

保存该档后,按照其他cfg文件的权限和属性为该文件指定所属用户和组:

代码语言:javascript
复制
# chown nagios.nagios /usr/local/nagios/etc/objects/remotehosts.cfg         [ Enter ]

至于想定义的其他内容,我就不再向该文件中添加了,我想大家应该已经掌握了这种命令定义的方法了。

最后不要忘了一步关键的操作——在主配置文件中定义Nagios启动之后读取刚才修改的这些配置,也就是确保刚才修改的配置文件在nagios主配置文件/usr/local/nagios/etc/nagios.cfg中都有正确指定,信息如下:

代码语言:javascript
复制
cfg_file=/usr/local/nagios/etc/objects/commands.cfg
cfg_file=/usr/local/nagios/etc/objects/remotehosts.cfg
cfg_file=/usr/local/nagios/etc/objects/localhost.cfg

最后校验配置文件正确性:

代码语言:javascript
复制
# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg             [ Enter ]

如果校验完全通过,则重启Nagios服务:

代码语言:javascript
复制
# chkconfig --level 345 nagios on                                      [ Enter ]
# service nagios restart                                                [ Enter ]

此时如果再通过浏览器访问http://192.168.1.10/nagios,我们就可以看到被监测主机192.168.1.220上所反应出来的内容信息。下面是几个效果图:(如图pic37.png-pic39.png所示)

到此为止,Nagios的基本原理和强大的功能就基本介绍完了。而事实上Nagios不但能在现有的功能基础上实现功能扩展,而且还能够实现和第三方软件的结合,例如和前面所介绍的MRTG和Cacti联用来构建动态显示图标;同时按照前面所说明的内容可以配置各种事件级别的邮件通知功能。但因为篇幅的限制我们会在下次有机会的时候向大家介绍。尽管在配置的难度上显得比较高,但是其强大的功能和灵活性却给我们留下了极深的印象。因此这也是在一些中型甚至是大型企业中所推崇并逐步采用的一种监测方案。

各种系统监测优缺点比较和总结:

通过该文章的介绍,我们大致了解了多张不同但都比较常用的系统监测解决方案。下面可以简单比较几种不同监测方法的特点。

在大多数监测环境中,采用SNMP都是公用的标准和协议。所以除了Nagios之外,基本上所有的监测环境也是围绕SNMP协议部署,对SNMP协议的支持是目前市面上众多网管软件的最基本要求。

通过SNMP 结合闭源商业软件的部署监测的方案:

拥有配置简单且功能也相对强大的优点,但是缺点是要受到闭源商业软件在功能和灵活性上的限制,而且意味着企业需要为这种类型的监测支付高昂的软件使用成本;

通过SNMP 结合MRTG实现部署监测方案:

优点是费用方面的支出基本为零,但缺点是配置过程要显得相当复杂和繁琐,而且由于MRTG本身的一些限制功能比较单一。

通过SNMP 结合 Cacti和RRDtool实现部署监测方案:

优点是同样不需要支付高昂的费用,而且相对于单纯使用Mrtg而言功能方面大大增强,显示的效果方面也要比Mrtg好很多,同时在监测内容和灵活性方面也有了很大的改善,相信这种方案能够被很多中小型企业所接受。但最大的问题是在部署的难度增加,对操作管理人员技术方面的要求也大大增加。因此这种方案也能够作为一种折中的选择。

通过Nagios实现监测方案:

这是几种不同方案中唯一可以不使用SNMP的,但是功能上丝毫不比传统的使用SNMP协议的监测软件逊色,甚至实现了更多实用的特性,更何况结合插件也能支持SNMP。另外Nagios的部署和定义非常灵活,和其他软件的兼容性方面也表现出很多创造性的优势。显然在几种监测方案中,这种监测方案无疑是比较优秀的!但缺点自然也不言而喻,强大的功能是以更为繁琐和更高的技术要求作为代价,如果针对一个大型网络要将Nagios所有的功能都一一实现,显然对用户的技术水准方面要求会比较高。

总之,在企业系统和应用监测的领域中,尽管有各种不同类型的监测要求,尽管也相应地也提供了各种不同类型的监测部署方案。但不管是利用基本的SNMP实现简单和单一的监测,还是利用像Cacti + RRDtool甚至Nagios这样的软件实现功能更加强大的监测部署;不管是全部利用开源软件本身实现所有监测功能,还是和像Whatsup和Solawins等这种闭源商业软件结合部署监测环境——各种开源软件以及开源项目上都表现出了极强的共通性和兼容性,而且在功能上丝毫没有逊色。完全能够支撑和满足企业级的监测部署环境要求!

通过本文笔者希望能够为更多中小企业甚至大型企业用户在部署监测环境方面提供一些有用参考和帮助。希望他们能够藉助开源方案量体裁衣地打造适合于自己的企业级监测系统。

关于作者

王基立,现工作于红帽软件(北京)有限公司,具备多年的售前解决方案规划与售后技术支持经验,熟悉红帽所有平台类产品和解决方案。现常驻深圳任红帽软件华南区解决方案架构师一职,主要负责红帽解决方案在华为、中兴等大型电信企业用户环境中的设计、规划、应用以及相关售前工作。同时也为包括各高级分销商以及金融、政府、教育等各方面在内的管道和区域用户提供相关解决方案、技术咨询、技术培训、现场实施、技术支持等服务。

原文地址:http://www.infoq.com/cn/articles/nagios-enterprise-level-system-monitor

https://github.com/mconigliaro/NagiosPluginsNT

https://github.com/robertmircea/nagios-nsca-client

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2012-08-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 各种系统监测优缺点比较和总结:
  • 关于作者
相关产品与服务
控制中心
控制中心(Control Center)为企业客户提供腾讯云多账号环境集中管理的能力。通过自动设置Landing Zone,帮助企业管理员根据最佳实践,从多账号的权限、财务、安全、合规等领域构建安全合规的云环境。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档