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)
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服务。