Chinaunix首页 | 论坛 | 博客
  • 博客访问: 280863
  • 博文数量: 84
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: -10
  • 用 户 组: 普通用户
  • 注册时间: 2016-07-05 09:11
文章分类
文章存档

2015年(1)

2014年(6)

2013年(8)

2012年(1)

2011年(6)

2010年(2)

2009年(16)

2008年(44)

我的朋友

分类: 系统运维

2014-01-16 18:03:31

原文地址:Nagios被动模式详细实现 作者:i19go

Nagios被动模式

    由于服务器数量的增加,nagios以往的主动监测模式不再合适,故变更为被动模式,以承担更大的监测量,同时也提高了监测的灵敏性和监测的方便性。

被动模式工作原理介绍:

         相比与主动模式中服务器主动去被监控机上轮询获取监控数据的方式,被动模式则是在被监控机上面通过插件获取监控数据,然后将数据发往监控机,最后监控机对监控数据处理。这样做的一个很大的优势就是将除去处理数据的其他工作都放在了被监控机上面(包括了数据的传输),这样就避免了被监控机数量大时,一次轮询时间过长而导致监控反应延迟,这也是被动模式能承担更大监控量的关键。

 

技术细节:

         被监控机(MCMonitor  Client

         监控机  MSMonitor  Server

         Nagios  (监控主程序,不多说,装在MS上)

         Nsca    (安装在MS上,用来接收并解析MC发来的监控数据,传递给nagios

         Send_nsca(安装在MC上,用来发送监控数据。)

         Nagios-Plugins nagios的检测插件,可以)

 过程如下:

      MC上面,使用nagios-plugins提供的插件,得出监控数据,然后将数据存为一个文件,利用输入重定向,通过send_nsca将数据发往MSMS上面运行一个nscadaemon(默认开启5667端口),用来接收这些数据,然后做一个简单的处理(会和nagiosservice文件进行对应,将多余的监控数据排除),然后将数据进行格式的转换,发给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)针对不同的情况设置不同的报警级别(重要)。

 

NscaSend_nsca

 

      Nsca

      NscaSend_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(主程序)

       2sample-config中会有nsca.cfgsend_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


1send_nsca安装Send_nsca安装在MC上面,将send_nscasend_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代理,由cronta5分钟执行,然后去执行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服务。

 

 

参考资料:

nscareadme

阅读(2917) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~