本文出自
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 �Czxf 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服务。