本文出自

http://blog.chinaunix.net/uid-25837154-id-1653575.html

 

技术细节:
         被监控机(MC:Monitor  Client)
         监控机  (MS:Monitor  Server)
         Nagios  (监控主程序,不多说,装在MS上)
         Nsca    (安装在MS上,用来接收并解析MC发来的监控数据,传递给nagios)
         Send_nsca(安装在MC上,用来发送监控数据。)
         Nagios-Plugins (nagios的检测插件,可以)
过程如下:
      在MC上面,使用nagios-plugins提供的插件,得出监控数据,然后将数据存为一个文件,利用输入重定向,通过send_nsca将数据发往MS。MS上面运行一个nsca的daemon(默认开启5667端口),用来接收这些数据,然后做一个简单的处理(会和nagios的service文件进行对应,将多余的监控数据排除),然后将数据进行格式的转换,发给nagios的“外部命令文件”(默认配置为“/usr/local/nagios/var/rw/nagios.cmd”在nagios.cfg中定义的)
该文件是一个管道文件,也是nagios主程序的一个接口(用来接收监控数据),使用cat查看该文件时候,会出来经nsca处理后的数据格式。然后nagios主程序对数据进行处理(前台展示,警报)。
 
1、安装nagios ,加入网页访问,访问控制(略)
2、更改配置文件 nagios.cfg 
check_external_commands = 1 (enable  commands  file)
command_check_interval = -1 (check  the  external  command file as often as possible )
其他修改与常规一样      
3、添加模板,修改配置文件 template.cfg,在最后,添加如下内容:
define service{
        name                        passive_service
        use                          generic-service
        max_check_attempts           1       
        active_checks_enabled          0 (关闭主动检测)
        passive_checks_enabled         1 (开启被动检测)
        normal_check_interval          5  
        retry_check_interval            1
        notifications_enabled           1
        notification_interval              5
        notification_period             24x7
        contact_groups                admin
        register                      0       (必须)
       }
4、注意一点,被动模式检测时,MS端实际上是对MC发来的数据进行处理,即字符串处理,这与主动模式是    不同的。所以要添加一个command
define command{
        command_name    check_dummy
        command_line    /usr/local/nagios/libexec/check_dummy $ARG1$
               }
Check_dummy插件可以简单的理解成一个翻译程序,只能处理4个参数:
[root@bjcenter objects]# /usr/local/nagios/libexec/check_dummy  0
OK
[root@bjcenter objects]# /usr/local/nagios/libexec/check_dummy  1
WARNING
[root@bjcenter objects]# /usr/local/nagios/libexec/check_dummy  2
CRITICAL
[root@bjcenter objects]# /usr/local/nagios/libexec/check_dummy  663
UNKNOWN
虽然只有4个参数,但是足够我们进行监测了,因为4个参数即可代表4个状态,而监测一般服务2个状态就够了 Running 和 Stoped,而硬件资源(OK  warning  critical)
5、  再就是比较重要的 service 文件,两个示例如下:
define service {
        use                             passive_service
        hostgroup_name                  all_hosts
        service_description                Load
        check_command                  check_dummy!0
        notification_options               w,u,c,r
}
define service {
        use                             passive_service
        hostgroup_name                  all_hosts
        service_description                Ssh
        check_command                  check_dummy!0
        notification_options               w,c,r
        contact_groups                   admins
 }
这里贴出两个例子是不同的,一个是服务器本身的资源使用的监控,一个是用户安装的服务的监控。资源使用状况有(OK  Warning  Critical),而一般进程则只有(Running  Stoped)针对不同的情况设置不同的报警级别(重要)。

Nsca与Send_nsca

Nsca
      Nsca与Send_nsca就是一个C/S结构,Send_nsca是一个程序,负责将收集到的监控数据按照一定的格式发往Server端,即Nsca守护进程。Nsca是一个daemon,在收到由Send_nsca发来的数据后,对数据进行跟基本的处理,然后交给nagios。

1、  Nsca安装
下载地址:http://cdnetworks-kr-2.dl.sourceforge.net/project/nagios/nsca-2.x/nsca-2.7.2/nsca-2.7.2.tar.gz
下载至本地后:
tar –zxf  nsca-2.7.2.tar.gz
cd  nsca-2.7.2
./configure && make  all
以上步骤检查正确执行以后:
       1、会在src目录下生成两个程序 nsca  send_nsca(主程序)
       2、sample-config中会有nsca.cfg与send_nsca.cfg(配置文件)
       3、当前目录下会有一个init-script(启动脚本)
2、  Nsca操作(MS)
cp  src/nsca  /usr/local/nagios/bin/
cp  sample-config/nsca.cfg  /usr/local/nagios/etc
chown nagios.nagios   /usr/local/nagios/bin/nsca  
chown nagios.nagios   /usr/local/nagios/etc/nsca.cfg
cp  init-script  /etc/init.d/nsca
chmod a+x /etc/init.d/nsca
chkconfig  --add  nsca
至此nsca安装完成,下面需要更改一些配置选项: (nsca.cfg)
server_address=xxx.xxx.xxx.xxx (这里务必使用对外表现的IP,即MS_IP)
debug=1                       (debug选项即log选项,写入message)
aggregate_writes=1            (能够支持更大的监控量,建议开启)
max_packet_age=60             (数据包过期时间,默认30s,但是考虑到网 络因素建议设为60s)
password=xxxxxxx              (密码,最基础的加密方式,也可以不设置)

Send_nsca

1、send_nsca安装Send_nsca安装在MC上面,将send_nsca与send_nsca.cfg拷贝至MC上面,即完成安装。
下面是我的设计思路:(其实是在下端机器批量安装的脚本)
#!/bin/bash
mkdir -p /usr/local/nagios_nsca/libexec
mkdir -p /usr/local/nagios_nsca/nagios_check
mkdir -p /home/sysop/script
status=1
until [ "$status" -eq "0" ]
do
        wget http://url/libexec.tar.gz
        status="$?"
done
tar -zxf libexec.tar.gz -C /usr/local/nagios_nsca/libexec/
rm -rf libexec.tar.gz
mv /usr/local/nagios_nsca/libexec/commen.sh /usr/local/nagios_nsca/nagios_check/
mv /usr/local/nagios_nsca/libexec/send_nsca /usr/local/bin/
mv /usr/local/nagios_nsca/libexec/send_nsca.cfg /etc/
mv /usr/local/nagios_nsca/libexec/nagios_check.sh /home/sysop/script
echo "*/5 * * * * /bin/bash /home/sysop/script/nagios_check.sh">>/var/spool/cron/root

首先将所有与监控相关的文件,规划在一个目录中:/usr/local/nagios_nsca 
Libexec 主要是存放nagios-plugin提供的插件(这里当然仅仅放着用得到的)
Nagios_check 存放自定义的一些检测脚本。
而基本调用脚本nagios_check.sh 可以理解成一个agent代理,由cronta每5分钟执行,然后去执行nagios_check下面所有的脚本,将输出进行处理,并重定向至一个文件,最后调用send_nsca将文件内容发往MS。下面是nagios_check.sh
#!/bin/bash
NSER=114.255.xx.xx
CHECK_PATH="/usr/local/nagios_nsca/nagios_check"
RESULT_FILE="/tmp/nagios_result"
/bin/bash "$CHECK_PATH"/*.sh>/tmp/nagios_result
/usr/local/bin/send_nsca -to 60  -H "$NSER" -c /etc/send_nsca.cfg <"$RESULT_FILE"

下面是一个基础监控脚本 commen.sh

#!/bin/bash
#Naigos Commen Check Script
#Include Partition  Load  Swap  Ssh
#
#By Li Zhiyuan
######################################
hostname=$(hostname)
Plugin_path="/usr/local/nagios_nsca/libexec"
#1. Partition
#Get Partition List
Partitions=$(df -h|awk -F'% ' '{print $2}'|sed '1d'|grep -v '^$\|boot\|shm\|mnt')
for partition in $Partitions
do
        result=$($Plugin_path/check_disk -w 10% -c 5% -p $partition)
        status=$?
        output=$(echo "$result"|awk -F';' '{print $1}')
        echo -e "$hostname\tPartition_$partition\t$status\t$output"
done

#2.Load
result=$($Plugin_path/check_load -w 15,10,5 -c 30,25,20)
status=$?
output=$(echo "$result"|awk -F'|' '{print $1}')
echo -e "$hostname\tLoad\t$status\t$output"

#3.Swap
result=$($Plugin_path/check_swap -w 50% -c 20%)
status=$?
output=$(echo "$result"|awk -F'|' '{print $1}')
echo -e "$hostname\tSwap\t$status\t$output"

#4.Ssh
result=$(/etc/init.d/sshd status)
status=$?
        echo -e "$hostname\tSsh\t$status\t$result"
nagios_check.sh中定义了CHECK_PATH变量,并且后面直接执行该目录下所有的.sh(检测脚本),这样方便后期新监测功能的添加。

commen.sh中注意一点是输出的格式:
       HOSTNAME [TAB]SERVICE_DESCRIBE[TAB]STATUS[TAB]OUTPUT
       主机名        服务描述            状态码       附加输出

主机名必须与nagios端定义的hostname相同
服务描述必须与nagios端定义的service配置文件内容的相同
状态码(0 1 2 3 4)主要是用来给check_dummy翻译使用
附加输出 可以理解为对监控结果的一个简单描述
这个格式是由 nsca插件决定的

现在可以开启MS的服务了(先开启nagios,在开启nsca)
       service  nagios  start
       service  nsca   start

然后就等待看结果了

写在最后:
1、  nagios_check脚本可以改进,即可以再自定义时间内,如每10秒检测一次系统,然后检测输出文件变化情况,然后决定是否发送输出文件。好处是,可以及时响应服务器状态异常,而不用等待5分钟的“自身轮询”。可以理解成,每5分钟一个常规发送,每10秒一个主动check。
2、  MS端的nsca进程可能会出现问题,最少我出现了,即长时间运行以后,nsca进程出现假死现象,进程存在,但是已经不处理数据了。解决方法即是添加cron任务,在每天晚上0点,定时重启nsca服务。