2011年(2)
分类: 系统运维
2011-07-12 20:23:57
Nagios被动模式
由于服务器数量的增加,nagios以往的主动监测模式不再合适,故变更为被动模式,以承担更大的监测量,同时也提高了监测的灵敏性和监测的方便性。
被动模式工作原理介绍:
相比与主动模式中服务器主动去被监控机上轮询获取监控数据的方式,被动模式则是在被监控机上面通过插件获取监控数据,然后将数据发往监控机,最后监控机对监控数据处理。这样做的一个很大的优势就是将除去处理数据的其他工作都放在了被监控机上面(包括了数据的传输),这样就避免了被监控机数量大时,一次轮询时间过长而导致监控反应延迟,这也是被动模式能承担更大监控量的关键。
技术细节:
被监控机(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主程序对数据进行处理(前台展示,警报)。
实现过程
Nagios
注意:(本文是被动模式的实现,而不是分布式的实现,仅有一台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安装
下载地址:
下载至本地后:
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
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/">>/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
="/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服务。
参考资料:
nsca的readme
jingyury2014-05-14 16:09:22
nagios_check.sh仍然有问题,分割commen.sh脚本,里面一个检测服务一个脚本,每检测一次发送一次,服务端才能识别。
nagios_check.sh
#!/bin/bash
NSER=192.168.1.1
CHECK_PATH="/usr/local/icinga/nsca/nsca_sh"
RESULT_FILE="/tmp/icinga_result"
for i in `ls "$CHECK_PATH"/*.sh`;do
/bin/bash $i >/tmp/icinga_result
/usr/local/icinga/bin/send_nsca -to 60 -H "$NSER" -c /usr/local/icinga/etc/send_nsca.cfg < "$RESULT_FILE"
done
i19go2011-07-18 19:02:38
nagios_check.sh编写的有问题,更正如下:
#!/bin/bash
NSER=114.255.xxx.xxxx
CHECK_PATH="/usr/local/nagios_nsca/nagios_check"
RESULT_FILE="/tmp/nagios_result"
cd "$CHECK_PATH"
cat /dev/null > "$RESULT_FILE"
for script in $(/bin/ls *.sh)
do
/bin/bash $script>>"$RESULT_FILE"
done
/usr/local/bin/send_nsca -to 60 -H "$NSER&