深耕nagios;细作cacti

比如:

监控ssh

监控ping

监控nrpe无返回

查看日志

应用已经恢复,监控还是CRITICAL状态,怎么恢复?

cacti不报警,down机不报警

直接用短信报警;

=====================================

关于短讯报警的频率间隔设置:

那怎么样是一个合适的范围呢?
:
探测4次失败开始报警,
报警间隔10分钟,总共发送8次, 然后停止发送,

假如第3次没有人去处理,电话通知,没回应则取消该对象的监控,并记录该次事件。

 

 

=========================================

nagios warring http 403 的解决:

不论是apache,nginx;webserver发布目录中需要有index.html这个文件,没有就 touch index.html

具体touch的路径要看 nginx.conf httpd.conf中 root定义的路径。不要千篇一律抄网上说的/var/www/html/index.html

=========================================

有台数据库主机莫名其妙的宕机了;重启后,nagios监控端就不正常了;

比如这样:

#service snmpd restart

#/usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg -d

问题依旧;

这个是停掉nrpe的样子:

然后我到standby上去查看;sid确认没起来,只有一个 plsextpro的监听;

于是我修改了nrpe.conf后,重启了nrpe;

然后nagios就变成了这个样子:

后来,我搜索到

 7.如果在nagios的web管理页面中出现错误提示:Status Information:Cannot determine ORACLE_HOME for sid servername

请,在oracle所在主机上,用oracle用户启动nrpe:

用oracle账户启动后,就正常了;

 

 

默认安装时,会安装一个PL/SQL外部程序(ExtProc)条目在listener.ora中,是oracle为调用外部程序默认配置的监听,它的名字通常是ExtProc或PLSExtProc,但一般不会使用它,可以直接从listener.ora中将这项移除,因为对ExtProc已经有多种攻击手段了,在不使用外部程序时,oracle也是建议删除的。

 

PLSExtPro 是pl/sql   external  procdure 的意思,就是在pl/sql中调用外部语句,如c,java写的过程。

现在,Oracle已经全面支持JAVA了,这东西也就过时了,之所以继续保留是考虑到兼容以前老版本的数据库实例。

 

有时可能会在多个数据库实例之间拷贝listener.ora,请检查拷贝来的文件中是否含有不需要的服务,确保只留下的确需要的服务项目,减少监听器受攻击的面。

 

 

 ##########################

还有个疑问;机器是半夜2~4点间出的问题;为什么nagios没报警;cacti也没报警?是什么原因?

###############################

关于超时设置的问题:

http://blog.163.com/ucl_liang/blog/static/179291107201291693144761
CHECK_NRPE: Socket timeout after 30 seconds  

http://www.lishiming.net/thread-5274-1-1.html
http://www.lishiming.net/thread-5274-1-1.html
Socket timeout,这个报错信息缺省级别是CRITICAL的,如果不想让其报警,就设置其为UNKNOW
在nagios server端的配置文件中修改check_nrpe参数 加入" -u " ,可执行check_nrpe -h查看帮助
define command { 
  command_name  check_nrpe 
 command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$  -u -t 30   

}
http://bbs.51osos.com/thread-12570-1-1.html
在使用Nagios check_nrpe做监控时,有时会遇到“check_nrpe : Socket timeout after 10 seconds”的报错, 这个报错信息缺省级别是CRITICAL的。我们可能并不希望check_nrpe的Socket timeout级别设置为CRITICAL. 这时可以在check_nrpe中加入一个-u参数,使check_nrpe的Socket timeout级别设置为UNKNOWN. (参见check_nrpe -h帮助)
同时还可以加入-t参数,以设置Socket timeout时间。
具体设置方法如下:
在nagios server端的配置文件中修改check_nrpe参数。
例如,我的配置文件是commands.cfg

define command { 
  command_name  check_nrpe 
  command_line  /usr/lib/nagios/plugins/check_nrpe -H $HOSTADDRESS$ -u -t 30 -c $ARG1$

}
http://bbs.chinaunix.net/thread-3747074-1-1.html

上楼说的是: 
CHECK_NRPE: Socket timeout after 10 seconds
解决方法::1.vi commands.cfg --->  command_line /usr/local/nagios/libexec/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -t 60 (默认命令后面加:-t 60)
                  2.vi nrpe.cfg ---> command_timeout=60 
                  3. 使用命令测试。---> ./check_nrpe -H 192.168.1.203 -c check_tomcat_mem -t 30 (使用命令时后面加:-t 30)
注意:-t 后面的时间自由添加,。


http://pengyl.blog.51cto.com/5591604/1242211
Q:Nagios的警报信息如下,意思是nrpe 进程执行某些脚本超过了10秒钟,就会发警报
CHECK_NRPE: Socket timeout after 10 seconds
A:修改command.cfg配置文件,把NRPE的时间调整到30s
  define command{
     command_name check_nrpe
     command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -t 30  
     }
Socket timeout,这个报错信息缺省级别是CRITICAL的,如果不想让其报警,就设置其为UNKNOW在nagios server端的配置文件中修改check_nrpe参数 加入" -u "
  command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$  -u -t 30


http://www.suiyiwen.com/question/4286

最近在外网新搭建了一套nagios系统,开始几天nagios报警后还能发邮件通知。但是最近不知道怎么回事,老收不到邮件,手工在服务器上发邮件是可以的。后来查了下sendmail的日志和nagios的日志,发现sendmail的邮件只有邮件信息,没有进邮件队列。nagios那边的日志又报下面的警告。

[1172273126] Warning: Contact 'suiyiwen' service notification command '/usr/bin/printf "%b" "***** Nagios *****/n/nNotification Type: PROBLEM/n/nService: /boot/nHost: hostname/nAddress: 192.168.3.11/nState: CRITICAL/n/nDate/Time: Mon Dec 13 01:20:05 CST 2010/n/nAdditional Info:/n/nDISK CRITICAL - free space: /boot 
8 MB (8% inode=99%):" | /bin/mail -s "** PROBLEM Service Alert: hostname//boot is CRITICAL **" suiyiwenadmin@163.com' timed out after 30 seconds
从nagios日志上看,发送邮件超出30秒,如何解决呢?
既然已经找出问题的关键点了,是邮件发送超时问题。

通过修改nagios的配置文件nagios.cfg,将notification_timeout = 30改为notification_timeout = 120后重起nagios。观察一段时间是否还出现不能收到报警邮件的情况。


http://www.suiyiwen.com/question/4288
以上信息说明都是“Socket timeout after 10 seconds”这个原因造成的,如何解决呢?
nrpe进程执行某些脚本可能是大于10秒钟,而默认的是10秒钟,所以会发报警信息。

解决的方法如下:

define command{
command_name check_nrpe
command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -t 30   # 加上一个 -t 30 指定时间为 30 秒
}

 

so,我想,我至少可以先加一层报警,比如,我可以ping可以check_ssh是否通畅;

    http://hi.baidu.com/haigang/item/488865b71191f775254b09a5

check_ssh
                 界面拼装参数格式如下共3个元素:
                         命令!端口!连接超时时间
                         check_ssh!22!10


                         check_telnet=check_tcp!23

 

        check_ping
                 界面拼装参数格式如下共5个元素:
                         命令!告警时延,丢包率!严重告警时延,丢包率!检测数据包个数!连接超时时间
                         check_ping!3000.0,80%!5000.0,100%!5!10二、命令检测详细描述
check_ssh
         Usage:check_ssh [-46] [-t   <timeout>] [-r   <remote version>] [-p   <port>]   <host>
                 参数:
                 -h, --help 
                         帮助
                 -V, --version
                         列出版本信息
                 -H, --hostname=ADDRESS 
                         主机名称,IP地址,或者UNIX套接字(必须有绝对路径)
                 -p, --port=INTEGER 
                         端口号(默认:22)
                 -4, --use-ipv4
                         使用IPV4协议连接
                 -6, --use-ipv6
                         使用IPV6协议连接
                 -t, --timeout=INTEGER
                         连接超时秒数(默认:10秒)
                 -r, --remote-version=STRING
                         不匹配服务器版时警告字符串,如对方的版本为OpenSSH_3.9p1
                 -V, --verbose
                         列出详细的命令调试行
                 举例
                 ./check_ssh -H 192.168.2.220 -p 22 -t 10 -r OpenSSH_3.0pl
                 SSH WARNING - OpenSSH_3.8.1p1 Debian-8.sarge.6 (protocol 2.0) version mismatch, expected 'OpenSSH_3.0pl'
                 ./check_ssh -H 192.168.2.220 -p 22 -t 10    
                 SSH OK - OpenSSH_3.8.1p1 Debian-8.sarge.6 (protocol 2.0)
                 check_ssh -H $HOSTADDRESS$ -p 22 -t 10 
        
                 界面拼装参数格式如下共3个元素命令!端口!连接超时时间
                 check_ssh!22!10

    http://lxsym.blog.51cto.com/1364623/490287

    

远程被监控服务器

define service{ 
        use     generic-service 
        host_name       webserver 
        service_description     SSH 
        check_command   check_ssh! -p 1500!远程被监控服务器IP 
}

          http://www.54sa.net/2011/03/08/nagios%E7%9A%84check_ping%E6%8F%92%E4%BB%B6%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E/

        

NAGIOS的CHECK_PING插件使用说明

 

先看下自带的帮助文档

Usage:check_ping -H <host_address> -w <wrta>,<wpl>% -c <crta>,<cpl>%

[-p packets] [-t timeout] [-4|-6]

Options:

-h, –help

Print detailed help screen

-V, –version

Print version information

-4, –use-ipv4

Use IPv4 connection

-6, –use-ipv6

Use IPv6 connection

-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)

-L, –link

show HTML in the plugin output (obsoleted by urlize)

-t, –timeout=INTEGER

Seconds before connection times out (default: 10)

 

解释

-h 查看本帮助信息
-V 查看该插件的版本
-4 使用IPv4
-6 使用IPv6
-H 要ping的主机
-w 设置warning阀值
-c 设置critical阀值
-p 发送多少个包,默认5个包
-L 用不到的东西
-t 设置超时的时间,默认10秒

-p参数可以用-n替代,两者完全相同,一定要记住,这里指定的包的数量指的是ping成功的数量(何为成功?收到回复信息即算成功)。

例:

./check_ping -H 10.1.1.1 -w 500,100% -c 700,100% -n 2 -t 15

从字面上理解,ping 10.1.1.1这台主机,当响应时间大于500ms或者有一个丢包时报warning;当响应时间大于700ms或者有一个丢包时报critical(对主机状态来讲就是报down了);-n(等于-p)指的是发送两个数据包;-t超时时间为15秒,就是ping不通时最多会ping 15秒,还是不通就不ping啦。

问题:这里-n为2,是不是不管什么时候都是只ping两个包?

答案:不是,经过测试,只有ping成功时才只发送两个ping包。如果ping不通会一直发ping包,直到15秒后或者有其中两个包ping通时才停止。所以到底会发多少个ping包是不固定的。

问题:假设发包频率为每秒钟一个,前2个ping包没得到回复,第六个包时成功了,总共会发多少个ping包?

答案:按照上面说的,虽然指定包的数量为2,但这里前两个包没得到及时回复,所以忽略包数为2的规则,按照超时为15秒的规则,继续发送请求,直到15秒用完,如果还没收到回复就不ping了,总共为15个包。
但这里说ping到第六个包时成功了,那么-n为2的规则就又生效了,如果第七个包也是ping通的话,就到此结束,总共发送7个ping包。
如果第七个包没通,到第12个包时通了,那么总共发送12个包(第6个包和第12个包刚好两个包,满足了-n为2的规则)。

一句话:-n(-p)或-t这两个规则只要满足任何一个则结束ping。

 

解释下这里的500和700的含义,先看一个ping信息

#ping 127.0.0.1

PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.

64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.035 ms

64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.020 ms

注意到后面的”time=”了吗?就是这里,每一个ping都有花费的时间,当这个时间大于上面的500或700时就报警。

 

再说下500和700后面的两个100%

# ping 10.1.1.1

PING 10.1.1.1 (10.1.1.1) 56(84) bytes of data.

64 bytes from 10.1.1.1: icmp_seq=1 ttl=56 time=1.15 ms

64 bytes from 10.1.1.1: icmp_seq=2 ttl=56 time=1.34 ms

64 bytes from 10.1.1.1: icmp_seq=6 ttl=56 time=1.36 ms

— 10.1.1.1 ping statistics —

6 packets transmitted, 3 received, 50% packet loss, time 4998ms

rtt min/avg/max/mdev = 1.157/1.286/1.361/0.096 ms

从上面的信息可以看到共发了6个ping包,收到回复的有3个,有3个未收到回复,3/6就是50% packet loss,而上面定义的是100%,50%小于100%,所以不会报警。

 

linux下抓包命令:

# tcpdump -en -vv -i eth0 dst 10.1.1.1        #抓取eth0接口到10.1.1.1的所有数据包

# tcpdump -i eth0 ‘icmp[0]=8′            #抓取eth0接口的所有 ICMP echo request(请求包)

# tcpdump -i eth0 ‘icmp[0]=0′            #抓取eth0接口的所有ICMP echo reply(回应包)

##########################################################################################################

 

http://www.innovatedigital.com/node/568

用Python编写Nagios插件

采用“硬编码”方式插件不支持运行时配置。在实际中,通常最好的方式是创建一个可配置的插件。通过这种方式,您可以创建和维护一个插件,使用 Nagios 将其注册为单个插件,并且传递参数以便为特定的情况自定义警告和危险水平。下一个示例还包括一则使用消息;经过证实,对于由几个不同的开发人员或者管理员所使用或维护的插件,这是非常有价值的。

另一个好的实践是捕获所有的异常,并后退以报告 UNKNOWN 服务状态,以便 Nagios 能够正确地管理有关这个情况的通知。那些允许异常“失败”的插件通常会退出,并返回值 1;对于 Nagios,这表示一个 WARNING 状态。请确保您的插件能够正确地区分 WARNING 和 UNKNOWN。请注意,例如,在将其作为 UNKNOWN 结果处理可能出现错误的情况下,通常可以禁用至少某些 WARNING 通知。

用 Python 编写一个插件

上述的建议—运行时参数化、一则使用消息,以及经过改进的异常处理—将得到示例插件的源代码,这段代码要比前面的长几倍。但是您可以更安全地对错误进行处理,并且能够在更广泛的范围内重用该插件。


1. Python 插件—获取平均负载的完整插件

                
#!/usr/bin/env python

import os
import sys
import getopt

def usage():
    print """Usage: check_getloadavg [-h|--help] [-m|--mode 1|2|3] \
    [-w|--warning level] [-c|--critical level]"

Mode: 1 - last minute ; 2 - last 5 minutes ; 3 - last 15 minutes"
Warning level defaults to 2.0
Critical level defaults to 5.0"""
    sys.exit(3)

try:
    options, args = getopt.getopt(sys.argv[1:],
        "hm:w:c:",
        "--help --mode= --warning= --critical=",
        )
except getopt.GetoptError:
    usage()
    sys.exit(3)

argMode = "1"
argWarning = 2.0
argCritical = 5.0

for name, value in options:
    if name in ("-h", "--help"):
        usage()
    if name in ("-m", "--mode"):
        if value not in ("1", "2", "3"):
            usage()
        argMode = value
    if name in ("-w", "--warning"):
        try:
            argWarning = 0.0 + value
        except Exception:
            print "Unable to convert to floating point value\n"
            usage()
    if name in ("-c", "--critical"):
        try:
            argCritical = 0.0 + value
        except Exception:
            print "Unable to convert to floating point value\n"
            usage()

try:
    (d1, d2, d3) = os.getloadavg()
except Exception:
    print "GETLOADAVG UNKNOWN: Error while getting load average"
    sys.exit(3)

if argMode == "1":
    d = d1
elif argMode == "2":
    d = d2
elif argMode == "3":
    d = d3

if d >= argCritical:
    print "GETLOADAVG CRITICAL: Load average is %.2f" % (d)
    sys.exit(2)
elif d >= argWarning:
    print "GETLOADAVG WARNING: Load average is %.2f" % (d)
    sys.exit(1)
else:
    print "GETLOADAVG OK: Load average is %.2f" % (d)
    sys.exit(0)
    

 

 

为了使用这个新的插件,需要使用下面的方法来注册 /etc/nagios-plugins/config/mygetloadavg2.cfg


2. Python 插件—使用 Nagios 进行注册

                
define command{
        command_name    check_mygetloadavg2
	command_line    /path/to/check_getloadavg2 -m $ARG1$ -w $ARG2$ -c $ARG3$
	}

 

 

另外,根据下面的示例,在 services.cfg 文件中添加或者更改服务条目。请注意,使用感叹号 ! 来分隔插件参数。与前面一样,必须在 hosts.cfg 配置文件中定义 localhost


3. 创建一个使用 Python 插件的服务

                
define service{
        use                             service-template
        host_name                       localhost
        service_description             LoadAverage2
        check_period                    24x7
        contact_groups                  server-admins
        notification_options            c,r
        check_command                   check_mygetloadavg2!1!3.0!6.0
        }

 

==============================================================================================

http://yoozhu.com/?p=167

[root@nagios etc]# vi commands.cfg 在配置命令添加短信报警

#service notify by sms
define command {
       command_name     service-notify-by-sms
       command_line     /usr/local/bin/sms_send.sh "’$HOSTADDRESS$’ $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$"
}
#host-notify-by-sms
define command {
       command_name      host-notify-by-sms
       command_line      /usr/local/bin/sms_send.sh "Host $HOSTSTATE$ alert for $HOSTNAME$! on ‘$DATETIME$’"
}

编写SMS_SEND脚本
[root@nagios etc]# cat /usr/local/bin/sms_send.sh 
#!/bin/bash
msg="$1"
for phone_num in 15814456575 13424309*** 1351075***** 131448*****
    do
        wget -O /dev/null "http://203.86.*.*0:8009/test/smstest.aspx?phone=$phone_num&content=$msg"
done
[root@nagios etc]# 
[root@nagios etc]# vi contacts.cfg 
define contact{
        contact_name                   nagios
#       use                             generic-contact         ; Inherit default values from generic-contact template (defined above)
        service_notification_period     24×7
#        alisa                           system administrator
        host_notification_period        24×7
        service_notification_options    w,u,c,r
        host_notification_options       d,u,r
        service_notification_commands service-notify-by-sms,notify-service-by-email
        host_notification_commands      notify-host-by-email,host-notify-by-sms
#        email                           wangmy@szshequ.com
#       pager                           1581445657    
        email                      wangmy@szshequ.com   ; <<***** CHANGE THIS TO YOUR EMAIL ADDRESS ******
        }

通过日志即可看见报警短信邮件发出

07-08-2008 12:25:40] HOST NOTIFICATION: nagios;cdma1;DOWN;notify-host-by-email;(Host Check Timed Out)

Host Notification[07-08-2008 12:25:27] HOST NOTIFICATION: nagios;cdma1;DOWN;host-notify-by-sms;(Host Check Timed Out)

Host Notification[07-08-2008 12:25:27] HOST NOTIFICATION: web;cdma1;DOWN;notify-host-by-email;(Host Check Timed Out)

Host Notification[07-08-2008 12:25:26] HOST NOTIFICATION: cdma1;cdma1;DOWN;notify-host-by-email;(Host Check Timed Out)

Service Notification[07-08-2008 12:16:42] SERVICE NOTIFICATION: nagios;cdma;check_tcp 80;CRITICAL;service-notify-by-sms;Connection refused

Service Notification[07-08-2008 12:16:41] SERVICE NOTIFICATION: nagios;cdma;check_tcp 80;CRITICAL;notify-service-by-email;Connection refused

http://www.wenzizone.cn/?p=239

今天早上来到公司,打开nagios页面,发现服务这部分有10多个严重的报警,都是红色的,蚊子我就特别的诧异了,周六的时候我还收到了很多的warning的邮件呢,怎么这两天这么消停呢,好在目前还只是在测试阶段,不然,可就郁闷坏了。

不说这个了,先来排查错误吧。

第一个想到的是warning报警发了邮件,而CRITICAL就报警不发邮件通知了,又看了一下nagios的日志,我service的状态变化是出在周六,也就是从warning转变成critical就不发邮件了,问题可能出在服务报警通知那部分,于是先看了一下我定义的所有服务和主机的模板文件,内容如下

# vi genericdef.cfg

  1 define host{
  2     name                                                generic-host
  3     check_period                                  24x7
  4     notifications_enabled                   1
  5     event_handler_enabled               1
  6     process_perf_data                       1
  7     retain_nonstatus_information    0
  8     contact_groups                              admins
  9     notification_interval                       60
10     notification_period                        24x7
11     notification_options                      d,u,r
12     stalking_options                           o,d,u
13     register                                           0
14 }
15
16 define service{
17     name                                               generic-service
18     active_checks_enabled               1
19     passive_checks_enabled           1
20     notifications_enabled                   1
21     event_handler_enabled               1
22     check_period                                  24x7
23     max_check_attempts                   3
24     normal_check_interval                10
25     retry_check_interval                      2
26     contact_groups                             admins
27     notification_options                      w,u,c,r
28     notification_interval                       60
29     notification_period                        24x7
30     register                                            0
31 }

从上面service定义来看,通知选项已经加入了c(CRITICAL)这个参数了,看了问题不是出在这里。

第二个我想到的地方就是contract的配置文件,打开看了一下

1 define contact{
2         contact_name                                    nagios-msn-admin       
3         alias                                                     Nagios msn Admin       
4         email                                                    harvey_liu@wenzizone.cn
5         host_notification_commands         notify-host-by-msn
6         host_notification_options                d,u
7         host_notification_period                  24x7
8         service_notification_period             24x7
9         service_notification_options           w,u,r,c         //这个位置之前是没有c
10       service_notification_commands   notify-service-by-msn
11       }
12            
13 define contact{
14         contact_name                                   nagios-mail-admin
15         alias                                                    Nagios mail Admin
16         email                                                   hanzhao.liu@wenzizone.cn
17         host_notification_commands        notify-host-by-email
18         host_notification_options               d,u
19         host_notification_period                 24x7
20         service_notification_period            24x7
21         service_notification_options          w,u,r,c    //这个位置之前没有c
22         service_notification_commands   notify-service-by-email
23         }

在上面的第9和21行的位置加上c之后,然后重新reload一下nagios,如果没有报错,说明配置更新完毕,很快蚊子又可以收到报警的邮件了。

nagios调整是一个细致的活,看了蚊子还需要做很多的工作才行了。

© 2009, 深夜的蚊子. 版权所有. 如转载,请注明:转载自 蚊子空间[http://www.wenzizone.cn]

http://www.blogjava.net/ruoyoux/articles/278348.html

nagios自己也有日志记录呢!赶快打开看一眼,发现里面有不少Warning,抽一个出来,其内容如下:

  [1217166816] HOST NOTIFICATION: sery;mail-server;DOWN;host-notify-by-email;CRITICAL - Plugin timed out after 10 seconds
[1217166816] Warning: Attempting to execute the command "/usr/bin/printf "%b" "***** Nagios 2.9 *****\n\nNotification Type: PROBLEM\nHost: mail-server\nState: DOWN\nAddress: 211.155.115.66\nInfo: CRITICAL - Plugin timed out after 10 seconds\n\nDate/Time: Sun Jul 27 13:53:36 UTC 2008\n" | /bin/mail -s "Host DOWN alert for mail-server!" ABC@163.com" resulted in a return code of 127.  Make sure the script or binary you are trying to execute actually exists...



原因:邮件路径不对

  其他的行也更这个类似;最有用的信息我用红色标记,其大意是不能执行上面的2进制或可执行文件。在这个条目中,只有2个执行文件—printf及mail。我把它按原样单独拿出来执行,操作过程如下:

  (1)/usr/bin/printf  “"%b" "***** Nagios 2.9 *****\n”  输出 ***** Nagios 2.9 *****,这是正常的结果。

  (2)/bin/mail -s "Host DOWN alert for mail-server!" sery@163.com 输出su: /bin/mail: No such file or directory,没找到路径或目录。前面还手动发了邮件的,明明有mail这个客户端程序呀!可能这个路径不对,是linux的mail路径。查一下freebsd的mail路径,执行find / -name 得到mail在freebsd的路径为/usr/bin/mail 。

  到这里,我们知道了为啥不能发邮件的根本原因,接下来,我把nagios的配置文件commands.cfg的host-notify-by-email、service-notify-by-email的”/bin/mail”替换为“/usr/bin/mail”。其完整形式为:

  # 'host-notify-by-email' command definition
define command{
command_name    host-notify-by-email
command_line    /usr/bin/printf "%b" "***** Nagios 2.9 *****\n\nNotification Type: $NOTIFICATIONTYPE$\nHost: $HOSTNAME$\nState: $HOSTSTATE$\nAddress: $HOSTADDRESS$\nInfo: $HOSTOUTPUT$\n\nDate/Time: $LONGDATETIME$\n" | /usr/bin/mail -s "Host $HOSTSTATE$ alert for $HOSTNAME$!" $CONTACTEMAIL$
}
# 'notify-by-email' command definition
define command{
command_name    service-notify-by-email
command_line    /usr/bin/printf "%b" "***** Nagios 2.9 *****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$SERVICEOUTPUT$" | /usr/bin/mail -s "** $NOTIFICATIONTYPE$ alert - $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" $CONTACTEMAIL$
}

  修改完配置文件commands.cfg后重启 Nagios,再查看nagios日志,不再有“Make sure the script or binary you are trying to execute actually exists...”报错,并且有发送报警邮件的记录了:

  [root@nagios /usr/local/nagios/var]# tail -f nagios.log
[1217170467] SERVICE ALERT: mail-server;check_tcp 995;CRITICAL;SOFT;1;CRITICAL - Socket timeout after 10 seconds
[1217170534] Auto-save of retention data completed successfully.
[1217170577] HOST ALERT: mail-server;DOWN;SOFT;1;CRITICAL - Plugin timed out after 10 seconds
[1217170587] HOST ALERT: mail-server;DOWN;SOFT;2;CRITICAL - Plugin timed out after 10 seconds
[1217170597] HOST ALERT: mail-server;DOWN;SOFT;3;CRITICAL - Plugin timed out after 10 seconds
[1217170607] HOST ALERT: mail-server;DOWN;SOFT;4;CRITICAL - Plugin timed out after 10 seconds
[1217170607] HOST ALERT: mail-server;UP;SOFT;5;PING OK - Packet loss = 0%, RTA = 111.63 ms
[1217170607] SERVICE ALERT: mail-server;check_tcp 995;CRITICAL;SOFT;2;CRITICAL - Socket timeout after 10 seconds
[1217170687] SERVICE ALERT: mail-server;check_tcp 995;OK;SOFT;3;TCP OK - 3.137 second response time on port 995
[1217171057] SERVICE NOTIFICATION: sery;fav-0;check_tcp 443;CRITICAL;service-notify-by-email;CRITICAL - Socket timeout after 10 seconds

  收邮件,迫不及待,哈哈,我的163邮箱收到久违的报警信息了。再回去瞧一眼邮件日志/var/log/malllog,也记录了这个发送情况。

  经验总结:通过日志记录,对于我们排查故障确实有着不可估量的好处。在实际的工作中,我们应该随时检查系统日志以及应用程序相关的日志,从记录项中寻找蛛丝马迹,从而得出解决问题的方法。

 

 ###########################################################################################################

       http://www.2cto.com/os/201108/99008.html

    Nagios之事件处理

目标:实现在监控3306端口服务时,出现1次critical软状态时或者在上一次执行后没有成功后出现的第一次硬状态critical情况下,远程执行mysql重启服务,并且每次执行远程重启服务前把报告事件记录到DB中

 

牵涉技术:

(1)Nagios事件处理原理

(2)Ssh无密码登录执行命令

(3)Perl操作mysql

如果大家对以上三条都掌握了,相信看懂这篇文章也就不成话下了。

 

##进入正题##

前期准备工作

I.制作ssh无密码登录

实现目标:nagios用户无密码登录server

大家对root用户无密码登录都做过。但是今天,我要做的是普通用户nagios用户无密码登录(在此感谢我同事的技术支持).

角色

Host_ip

备注

Client

192.168.x.x

Nagios监控端作为Client,目的是为了远程执行脚本

Server

192.168.x.y

存启动服务脚本,如:mysql脚本

 

Client端(192.168.x.x)制作

---------------------------------------------------------------------------------------------------

(1)     创建nagios用户略过(Server端也需要)

(2)     su –nagios环境下执行

ssh-keygen -t rsa

一路回车便可,无需密码。

(3)将公钥copy到server端nagios家目录下

[nagios@nagios ~]$ scp .ssh/id_rsa.pub nagios@192.168.x.y:/home/nagios/

The authenticity of host '192.168.x.y (192.168.x.y)' can't be established.

RSA key fingerprint is 66:9a:b5:86:3d:81:22:9b:f8:67:9e:af:aa:4c:4a:97.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '192.168.x.y' (RSA) to the list of known hosts.

nagios@192.168.x.y's password:

id_rsa.pub                                                                                 100%  411     0.4KB/s   00:00

---------------------------------------------------------------------------------------------------

Server端(192.168.x.x)制作

--------------------------------------------------------------------------------------------------

(1)     进入server端,登入nagios帐号

(2)     创建mkdir /home/nagios/.ssh

(3)     将公钥匙写入authorized_keys文件:

 cat /home/nagios/id_rsa.pub >>.ssh/authorized_keys

(4)     改权限(以root身份或者通过visudo授权给nagios):

chmod 700 /home/nagios/.ssh

chmod 600 /home/nagios/.ssh/authorized_keys

 

检查

SERVER端权限检查

[root@centos-server nagios]# ls -la /home/nagios|grep .ssh

drwx------- 2 nagios nagios 4096 Aug  3 09:04 .ssh

 

[root@centos-server nagios]# ls -la /home/nagios/.ssh/

total 12

drw------- 2 nagios nagios 4096 Aug  3 09:04 .

drwx------ 4 nagios nagios 4096 Aug  3 09:03 ..

-rw------- 1 nagios nagios  411 Aug  3 09:04 authorized_keys

 

请确保红色标识的内容(保证.ssh目录的权限为700, authorized_keys的权限为600)

nagios用户持有者

 

CLIENT端登录测试

[nagios@nagios ~]$ ssh nagios@192.168.x.y

Last login: Wed Aug  3 09:15:59 2011 from 192.168.x.x

[nagios@centos-server ~]$

看到没?从192.168.x.x登录到192.168.x.y无需密码了。

如果没有这样的效果,大家看下是不是前面的权限问题。我曾今也是因为权限折腾了我同事半天。哈哈。

II.无密码登录远程执行命令

  实现目标:nagios用户远程启动server端mysql服务

-----------------------------------------------------------------------------------------------

Server端(192.168.x.x)制作

------------------------------------------------------------------------------------------------

(1)     配置mysql启动控制脚本

输入以下SQL语句,创建一个具有root权限的用户(admin)和密码(controlmysql):

GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' IDENTIFIED BY ' controlmysql ';

GRANT ALL PRIVILEGES ON *.* TO 'admin'@'127.0.0.1' IDENTIFIED BY ' controlmysql ';

作用:用与启动/关闭控制mysql服务

 

Mysql控制(启动/停止等)脚本

#!/bin/sh

 

mysql_port=3306

mysql_username="admin"

mysql_password=" controlmysql "

mysql_scripts_path="/data0/mysql/3306"

mysqld_path="/usr/local/webserver/mysql"

 

start_mysql()

{

    printf "Starting MySQL...\n"

    /bin/sh ${mysqld_path}/bin/mysqld_safe --defaults-file=/data0/mysql/${mysql_port}/my.cnf 2>&1 > /dev/null &

}

 

stop_mysql()

{

    printf "Stoping MySQL...\n"

    ${mysqld_path}/bin/mysqladmin -u ${mysql_username} -p${mysql_password} -S /tmp/mysql.sock shutdown

}

 

restart_mysql()

{

    printf "Restarting MySQL...\n"

    stop_mysql

    sleep 5

    start_mysql

}

 

kill_mysql()

{

    kill -9 $(ps -ef | grep 'bin/mysqld_safe' | grep -v 'grep'| awk '{printf $2}')

    kill -9 $(ps -ef | grep 'libexec/mysqld' | grep -v 'grep' |awk '{printf $2}')

}

 

if [ "$1" = "start" ]; then

    start_mysql

elif [ "$1" = "stop" ]; then

    stop_mysql

elif [ "$1" = "restart" ]; then

    restart_mysql

elif [ "$1" = "kill" ]; then

    kill_mysql

else

    printf "Usage: ${mysql_scripts_path}/mysql {start|stop|restart|kill}\n"

fi

 

(2)     配置sudo,允许nagios用户执行脚本

**如果没有sudo,yum –y install sudo**

#visudo

添加

nagios ALL=(root) NOPASSWD:/data0/mysql/3306/mysql start

检查

SERVER端脚本测试检查

[root@centos-server ~]# netstat -an|grep 3306

[root@centos-server ~]#

说明mysql没有起来

 

[root@centos-server ~]# /data0/mysql/3306/mysql start

Starting MySQL...

[root@centos-server ~]# netstat -an|grep 3306

tcp        0      0 :::3306                     :::*                        LISTEN    

[root@centos-server ~]#

脚本OK,正常

 

Client端测试(以nagios用户登录)

[nagios@nagios ~]$ ssh nagios@192.168.x.y "sudo /data0/mysql/3306/mysql start"

sudo: sorry, you must have a tty to run sudo

 

解决:

Server端修改visudo,将下面一行注释

Defaults    requiretty

 

再试

[nagios@nagios ~]$ ssh nagios@192.168.x.y "sudo /data0/mysql/3306/mysql start"

Starting MySQL...

正常启动

检查SERVER端 端口3306是否存在

恭喜,基本功已经做完。我们可以去玩监控端nagios配置了

 

III.Nagios监控端配置

(1)nagios基本配置文件如下:

mfs_hosts.cfg

define host{

        use                     mfs-server    

        host_name               mfs-192.168.x.y

        alias                   mfs-192.168.x.y

        address                 192.168.x.y

        }

mfs_hostgroups.cfg

define hostgroup{

        hostgroup_name  mfs-servers

        alias           Mfs Linux Servers

        members        mfs-192.168.x.y

        }

mfs_services.cfg

define service {

        name                    mfs-services

        service_description     checkport

        check_command           check_tcp!3306

        check_period            24x7

        max_check_attempts      2

        normal_check_interval   3

        retry_check_interval    1

        notification_interval   5

        notification_period     24x7

        notification_options    w,u,c,r

        register                   0

}

 

define service{

        use                             mfs-services

        host_name                       mfs-192.168.x.y

        event_handler_enabled   1

        event_handler          restart_mysql

     

 }

 

define service{

        use                             mfs-service

        host_name                       mfs-192.168.x.y

        service_description             PING

        check_command                   check_ping!100.0,20%!500.0,60%

        }

commands.cfg

define command{

        command_name    restart_mysql

        command_line    /usr/local/nagios/libexec/restart_mysql $SERVICESTATE$ $SERVICESTATETYPE$ $SERVICEATTEMPT$  $HOSTADDR

ESS$

}

(2)改写/usr/local/nagios/libexec/restart_mysql

restart_mysql

HostAddress=$4

debug=1

if [ $debug -eq 1 ];then

echo "MysqlServer:${HostAddress}" >>/tmp/ReMysql.log

fi

case "$1" in

OK)

        ;;

WARNING)

        ;;

UNKNOWN)

        ;;

CRITICAL)

        case "$2" in

 

        SOFT)

 

                case "$3" in

 

                1)

                      if [ $debug -eq 1 ];then

                        echo  "Restarting Mysql service (1rd soft critical state)..." >>/tmp/ReMysql.log

                      fi

                        /usr/bin/ssh nagios@${HostAddress} "sudo /data0/mysql/3306/mysql start"

                        ;;

                        esac

                ;;

 

        HARD)

         if [ $debug -eq 1 ];then

                echo  "Restarting Mysql service..." >>/tmp/ReMysql.log

         fi

                 /usr/bin/ssh nagios@${HostAddress} "sudo /data0/mysql/3306/mysql start"

                ;;

        esac

        ;;

esac

exit 0

注明:测试最好将debug设置为1

申明:本脚本暂时的作用是远程重启mysql,后续还要添加写入数据库的脚本。

 

检查

Nagios配置文件检查

/usr/local/nagios/bin/nagios –v /usr/local/nagios/etc/nagios.cfg

无错误,重启nagios

Service nagios restart

 

被监控端开启mysql等相关服务,保证监控一切正常!如图:

 

尝试正常关闭mysql服务

实现目标:当出现第一次软状态的critical情况下,去尝试重启mysql.

 

以下4条信息足以证明我们想达到的效果已经实现!

(1)检查监控端nagios图

 

(2)检查监控端脚本日志

[root@nagios tmp]# tail -f ReMysql.log

MysqlServer:192.168.x.y

Restarting Mysql service (1rd soft critical state)...

(3)被监控端检查端口是否存在

[root@centos-server ~]# netstat -an|grep 3306

tcp        0      0 :::3306                     :::*                        LISTEN

(4)再检查监控端nagios图

 

注明:到这里我们已经实现了第一个想法,就是远程重启服务。下面,我们要实现将事件记录到mysql中。

 

=======================================================

IV将通知信息写入Mysql

实现目标:将nagios报错信息写入到mysql DB中

角色

Host_ip

备注

Client

192.168.x.x

Nagios监控端作为Client,执行将报错信息写入数据库脚本

DB Server

192.168.x.z

存储报错信息的DB

 

DB Server端操作:

-----------------------------------------------------------------------------------------------

(1)创建库

create database nagios;

(2)授权

输入以下SQL语句,创建一个具有插入/修改/删除/浏览权限的用户(nagioslog)和密码(nagioslog)(允许nagios监控端远程登录):

GRANT ALL PRIVILEGES ON nagios.* TO 'nagioslog'@'192.168.x.x' IDENTIFIED BY '12345678';

作用:用与插入/修改/删除/浏览数据

(3)以nagioslog用户登录创建log表

create table log(host_ip varchar(50),services_desc varchar(200),plugin_out varchar(500)) ENGINE=MyISAM   DEFAULT   CHARSET=utf8;

 

Client端操作

-----------------------------------------------------------------------------------------

(1)安装perl操作mysql环境

 perl -MCPAN -e "install DBI"

perl -MCPAN -e "install DBD::mysql"

(2)操作mysql脚本

Perl远程操作mysql脚本

#!/bin/perl

#Last Modifed by Hahazhu 2011/08/03

use DBI;

 

##########INIT DEFINED###########

my $remote_mysql="192.168.x.z";

my $remote_db="nagios";

my $remote_mysql_user="nagioslog";

my $remote_mysql_pwd="12345678";

my $debug=1;

##########Recevice Values#########

my $host_ip=$ARGV[0];

my $service_desc=$ARGV[1];

my $plugin_out=$ARGV[2];

 

my $dbh = DBI->connect("DBI:mysql:database=$remote_db;host=$remote_mysql", "$remote_mysql_user", "$remote_mysql_pwd", {'RaiseError'

=> 1});

 

my $rows = $dbh->do("INSERT INTO log (host_ip, services_desc, plugin_out) VALUES ('$host_ip', '$service_desc', '$plugin_out')");

if ($debug){

    print "$rows row(s) affected \n";

}

if($debug){

my $sth = $dbh->prepare("SELECT host_ip, services_desc , plugin_out FROM log");

$sth->execute();

 

    while (@data=$sth->fetchrow_array()){

        print "$data[0] $data[1] $data[2]\n";

    }

}

$dbh->disconnect();

 

申明:测试前请将$debug设置为1.

 

检查

Nagios端以nagios用户执行插入数据脚本

[nagios@nagios libexec]$ perl insert_log_to_mysql.pl 1.1.1.1 check_3306 "connection refused"

1 row(s) affected

1.1.1.1    check_3306 connection refused

 

DB Server端检查

mysql> select * from log;

+---------+---------------+--------------------+

| host_ip | services_desc | plugin_out         |

+---------+---------------+--------------------+

| 1.1.1.1 | check_3306    | connection refused |

+---------+---------------+--------------------+

1 row in set (0.00 sec)

 

OK,脚本测试无问题。后面的工作就是将其加入到nagios配置里了。

 

V.Nagios服务配置调整

Commands.cfg

define command{

        command_name    restart_mysql

        command_line    /usr/local/nagios/libexec/restart_mysql $SERVICESTATE$ $SERVICESTATETYPE$ $SERVICEATTEMPT$  $HOSTADDRESS$ $SERVICEDESC$ "$SERVICEOUTPUT$"

}

启动mysql脚本要调整restart_mysql

#/bin/sh

HostAddress=$4

Services_desc=$5

Plugin_out=$6

debug=1

if [ $debug -eq 1 ];then

echo "MysqlServer:${HostAddress}" >>/tmp/ReMysql.log

fi

case "$1" in

OK)

        ;;

WARNING)

        ;;

UNKNOWN)

        ;;

CRITICAL)

        case "$2" in

 

        SOFT)

 

                case "$3" in

 

                1)

                      if [ $debug -eq 1 ];then

                        echo  "Restarting Mysql service (1rd soft critical state)..." >>/tmp/ReMysql.log

                      fi

                        /usr/bin/perl /usr/local/nagios/libexec/insert_log_to_mysql.pl ${HostAddress} ${Services_desc} ${Plugin_out}

                        /usr/bin/ssh nagios@${HostAddress} "sudo /data0/mysql/3306/mysql start"

                        ;;

                        esac

                ;;

 

        HARD)

         if [ $debug -eq 1 ];then

                echo  "Restarting Mysql service..." >>/tmp/ReMysql.log

         fi

                 /usr/bin/perl /usr/local/nagios/libexec/insert_log_to_mysql.pl ${HostAddress} ${Services_desc} “${Plugin_out}”

                 /usr/bin/ssh nagios@${HostAddress} "sudo /data0/mysql/3306/mysql start"

                ;;

        esac

        ;;

esac

exit 0

申明:调试前最好把debug设置为1

 

检查

到了本文最后一部分了,有点激动…

看看,我们验证能不能达到我们下面的目标.

 

实现目标:

重启mysql服务,必把相关日志记录到另一台mysql DB中。

 

试验:stop mysql服务

Nagios端检查图:

 

 

Nagios端日志:

[root@nagios ~]# tail -f /tmp/ReMysql.log

 

MysqlServer:192.168.x.y

Restarting Mysql service (1rd soft critical state)...

 

此时检查mysql服务端

[root@centos-server ~]# netstat -an|grep 3306

tcp        0      0 :::3306                     :::*                        LISTEN 

 

再检查记录日志情况:

mysql> select * from nagios.log;

+--------------+---------------+--------------------+

| host_ip      | services_desc | plugin_out         |

+--------------+---------------+--------------------+

| 192.168.x.y | checkport     | Connection refused |

+--------------+---------------+--------------------+

1 row in set (0.00 sec)

 

OK,目标已经实现。不仅实现了远程开机。而且将错误记录下来了。

 

到此,本文结束。我相信大家会有更多的想法去扩展…

下一篇,我将会带大家学习下nagios 分布式监控!

本文出自 “坏男孩” 博客

 

############################################################################################################

      http://www.infoq.com/cn/articles/nagios-enterprise-level-system-monitor

e.企业级系统监测方案:Nagios

在大多数情况下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组:

# 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目录中,并且执行下面的步骤进行编译和安装:

# tar -zxf nagios-3.0.3.tar.gz                             [ Enter ]
# cd nagios-3.0.3                                   [ Enter ]

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

# ./configure --with-command-group=nagcmd          [ Enter ]

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

*** 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.

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

# make all                                             [ Enter ]

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

# make install                                             [ Enter ]
# make install-init                                         [ Enter ]
# make install-config                                       [ Enter ]
# make install-commandmode                              [ Enter ]

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

# 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信息以接收报警内容。

# vi /usr/local/nagios/etc/objects/contacts.cfg                    [ Enter ]

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

# make install-webconf                                     [ Enter ]

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

# htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin     [ Enter ]

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

# 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来应用配置:

   # service httpd restart                                             [ Enter ]
# chkconfig --level 345 httpd on                                        [ Enter ]

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

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

# 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加入到服务列表中以使之在系统启动时自动启动:

# chkconfig --add nagios                                               [ Enter ]
# chkconfig nagios on                                               [ Enter ]

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

# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg             [ Enter ]

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

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账号,这里我使用同样的密码:

# useradd nagios                                               [ Enter ]
# passwd nagios                                             [ Enter ]

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

# tar -zxf nagios-plugins-1.4.12.tar.gz                                [ Enter ]
# cd nagios-plugins-1.4.12                                      [ Enter ]
# ./configure                                                   [ Enter ]
# make                                                      [ Enter ]
# make install                                                  [ Enter ]

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

# chown nagios.nagios /usr/local/nagios                                [ Enter ]
# chown –R nagios.nagios /usr/local/nagios/libexec                    [ Enter ]

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

# 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超级进程所管理的进程之一。

# make install-xinetd                                          [ Enter ]

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

# 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档,并添加下面的内容:

nrpe            5666/tcp                        # nrpe

重启服务:

# /etc/init.d/xinetd restart                                   [ Enter ]

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

# 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上执行命令:

# /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。

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

# ./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:

按照其格式:

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:

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中对该命令又被定义为:

# '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的声明做如下修改。

# '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中,对应服务的检测命令后面加一个参数:

define service { 
host_name ...
...
check_command check_http!8080
}

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

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

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

define command{
command_name check_nrpe
command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
}

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

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”部分,在原来的基础上增加自己的主机定义内容:

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,可以用逗号将其隔开。以下是我添加的内容:

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,加入下面内容:

下面是自定义的:

define service{
use generic-service
host_name localhost
service_description CPU Load
check_command check_nrpe!check_load
}

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

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

define service{
use generic-service
host_name localhost
service_description /dev/sda3 Free Space
check_command check_nrpe!check_disk /dev/sda3
}

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

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警告:

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警告:

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警告:

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警告:

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
        }

第五个命令定义:

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

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警告:

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。

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,该服务的消息通知功能默认关闭。

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文件的权限和属性为该文件指定所属用户和组:

# chown nagios.nagios /usr/local/nagios/etc/objects/remotehosts.cfg         [ Enter ]

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

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

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

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

# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg             [ Enter ]

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

# 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等这种闭源商业软件结合部署监测环境——各种开源软件以及开源项目上都表现出了极强的共通性和兼容性,而且在功能上丝毫没有逊色。完全能够支撑和满足企业级的监测部署环境要求!

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

关于作者

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


给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

 

########################

posted @ 2013-10-12 09:52  陳聽溪  阅读(1288)  评论(0)    收藏  举报