nagios通过msn/飞信发送报警通知[技术]

蚊子最近一直在弄公司的nagios,最近进行的监控报警这部分了,主要锁定在了msn和短信报警上,下面我把我这边实现的方法整理出来,有需要的朋友可以参考。

1,msn报警

先在这里http://code.google.com/p/phpmsnclass/downloads/list下载最新的msn类文件,这个下载后其实是一套完整的msnbot的php程序,我们这里只是使用了其中的msn.class.php这个文件。

遵循nagios的标准结构,程序文件都会放在/usr/local/nagios/libexec文件夹下,所以我在此文件夹下创建phpmsnclass文件夹,将msn.class.php文件放置其中,并在此目录下创建用于发送msn报警的php程序,内容如下。# cat sendmsnmsg.php

#!/usr/local/php529/bin/php -q

<?php
include_once(‘msn.class.php’);
$msn_username =’YOUR_MSN_ID’; //消息发送人的msn帐号
$msn_password = "yourpassword"; //消息发送人msn密码
$msn_list = array(‘somebody1@hotmail.com’,’somebody2@hotmail.com’); //消息接收人msn地址,这里可选,因为会使用nagios传递过来的地址
$fp=fopen(‘/tmp/tmp/1′,’r’);  //1这个文件是消息发送的内容,这个文件由nagios自动生成,路径根据自己实际自行修改
$file="";
while (! feof($fp)){
$cont=fgets($fp);
$file=$file.$cont;   //拼接报警消息内容
}
$msn =new MSN(‘MSNP15’);  //采用MSNP15协议,支持离线消息
if (!$msn->connect($msn_username,$msn_password)) {
    echo "Error for connect to MSN networkn";
    echo "$msn->errorn";
    exit;
}
else {
        $msn->sendMessage("$file",$argv[1]);  //将$file内容发送给$argv[1]传递进来的msn消息接收者。
}
fclose($fp);
?>

将此文件设置可执行权限,就可以进行测试了,首先在1文件中放入些内容比如

# cat 1
this is a test by wenzizone.cn

然后执行

./sendmsnmsg.php somebody@hotmail.com  //后面跟的这个是接收人msn地址

可以看到下图

说明msn发送是正常的。

2,飞信报警

首先到这里http://code.google.com/p/phpfetionapi/downloads/list下载飞信的php写的api接口,解压后,同样在/usr/local/nagios/libexec创建phpfetion目录,将class_fetion.php放到此目录下,然后创建发送短信的php程序,如下

#!/usr/local/php529/bin/php -q

<?php
include_once(‘class_fetion.php’);

$sms_username = "1381126xxxx"; //飞信帐号
$sms_password = "your password"; //飞信密码
$fp=fopen(‘/tmp/tmp/1′,’r’); //同msn内容
$file="";
while (! feof($fp)){
$cont=fgets($fp);
$file=$file.$cont;
}

$fetion = new fetion($sms_username,$sms_password);
$fetion->init() or die("fetion init failure!n");
$fetion->sent_sms(‘tel:’.$argv[1],$file);  //根据传送进来的电话发送报警内容
fclose($fp);
?>

分配sendsms.php可执行权限,然后进行测试,执行

./sendsms.php 13810xxxxxx  //后面这个是接受消息的手机号

用不了多一会就会收到消息,消息内容和msn那条一样,因为我们的测试内容不变。

3,和nagios的结合使用

首先编辑command.cfg文件,添加新的如下内容

# ‘notify-host-by-msn’ command definition
define command{
        command_name    notify-host-by-msn
        command_line    /usr/bin/printf "%b" "***** Nagios *****nNotification Type: $NOTIFICATIONTYPE$nHost: $HOSTNAME$nState:    $HOSTSTATE$nIP: $HOSTADDRESS$nInfo: HOSTOUTPUT$nDate/Time: $LONGDATETIME$n" >/tmp/tmp/1 | $USER$/phpmsnclass/sendmsnmsg.php $CONTACTEMAIL$
}

# ‘notify-host-by-fetion’ command definition
define command{
    command_name    notify-host-by-fetion
    command_line    /usr/bin/printf "%b" "***** Nagios *****nNotification Type: $NOTIFICATIONTYPE$nHost: $HOSTNAME$nState: $HOST
STATE$nIP: $HOSTADDRESS$nInfo: $HOSTOUTPUT$nDate/Time: $LONGDATETIME$n" >/tmp/tmp/1 | $USER1$/phpfetion/sendsms.php $CONTACTPAGER$
}

然后修改contacts.cfg文件,如下

define contact{
        contact_name                    nagiosadmin
        alias                                     Nagios Admin
        email                                    http://www.wenzizone.cn/
        pager                                    13810xxxxxx
        host_notification_commands      notify-host-by-msn
        host_notification_options       d,u
        host_notification_period                24×7
        host_notifications_enabled              1
        service_notifications_enabled   1
        service_notification_period             24×7
        service_notification_options    w,u,r
        service_notification_commands   notify-service-by-msn
}

define contact{
        contact_name                    nagiosadmin01
        alias                                     Nagios Admin
        email                                    http://www.wenzizone.cn/
        pager                                    13810xxxxxx
        host_notification_command    snotify-host-by-fetion
        host_notification_options       d,u
        host_notification_period                24×7
        host_notifications_enabled              1
        service_notifications_enabled   1
        service_notification_period             24×7
        service_notification_options    w,u,r
        service_notification_commands   notify-service-by-fetion
}

接下来再host或者service上填上对应的contact然后就可以随时收到相应的报警了。

蚊子在这两天的测试用发现,飞信报警的送达率还是很高的,基本是每条都能收到,但是msn的送达率就令人担忧了,我发送10个能收到一个就算不错了,所以还请根据自己测试情况酌情考虑。

另外一点需要注意的是msn或者飞信发送报警,接收人都必须是发送人msn或飞信的好友才行,不然是不能送达的。

蚊子完成本篇文章参考了如下两篇文章

1.http://blog.s135.com/post/390/,主要参考了msn的php脚本

2.http://www.ritto.cn/?p=308,受到博主使用class.fetion.php的启发,去google上找到飞信的php-api

nagios监控iostat[技术]

网上NetSeek写了一篇文章就是用nagios监控iostat的,但他使用的都是源码包编译的,具体可以参考他的这篇文章http://bbs.linuxtone.org/thread-2289-1-1.html

但编译的方式对于多机部署上来讲可能会有些不太方便,所以蚊子我在网上查了一下要想让nagios监控iostat需要的rpm包

蚊子我的环境都是centos5,所以我下载的包都是rhel5的,有需要其他环境的,我会在下面把下载地址给出,各位自己去找适合自己的。

http://packages.sw.be/perl-Nagios-Plugin/perl-Nagios-Plugin-0.33-1.el5.rf.noarch.rpm
http://dag.wieers.com/rpm/packages/perl-Class-Accessor/perl-Class-Accessor-0.31-1.el5.rf.noarch.rpm
http://dag.wieers.com/rpm/packages/perl-Config-Tiny/perl-Config-Tiny-2.12-1.el5.rf.noarch.rpm
http://dag.wieers.com/rpm/packages/perl-Math-Calc-Units/perl-Math-Calc-Units-1.06-1.el5.rf.noarch.rpm
http://dag.wieers.com/rpm/packages/perl-Params-Validate/perl-Params-Validate-0.89-1.el5.rf.i386.rpm(32位版)
http://dag.wieers.com/rpm/packages/perl-Params-Validate/perl-Params-Validate-0.89-1.el5.rf.x86_64.rpm(64位版)
http://dag.wieers.com/rpm/packages/perl-Regexp-Common/perl-Regexp-Common-2.120-1.2.el5.rf.noarch.rpm

如果需要其他环境的包可以到以下地址下载

perl-nagios-plugin                    http://packages.sw.be/perl-Nagios-Plugin/
perl-class-accessor                 http://dag.wieers.com/rpm/packages/perl-Class-Accessor/
perl-config-tiny                           http://dag.wieers.com/rpm/packages/perl-Config-Tiny/
perl-math-calc-units                 http://dag.wieers.com/rpm/packages/perl-Math-Calc-Units/
perl-params-validate                http://dag.wieers.com/rpm/packages/perl-Params-Validate/
perl-regexp-common                http://dag.wieers.com/rpm/packages/perl-Regexp-Common/

接下来出场的就是我们的主角,监控脚本check_iostat,下载地址是

http://www.ofn.dk/files/software/check_iostat

将此文件下载到/path/to/nagios/libexec下,并赋予执行权限,然后可以通过执行此脚本查看返回值

# ./check_iostat
IOSTAT OK – user 0.50 nice 0.01 sys 1.47 iowait 2.09 idle 0.00  | iowait=2.09%;; idle=0.00%;; user=0.50%;; nice=0.01%;; sys=1.47%;;

当然iostat命令是需要的,如果执行中出现以下错误

# ./check_iostat
Can’t exec “iostat”: No such file or directory at ./check_iostat line 69.
IOSTAT UNKNOWN – Error executing iostat command

请查看sysstat包是否安装

对于批量安装我的想法是,首先将check_iostat和所有rpm包打包上传到所有的服务器,这里最好的选择是rsync的方式,如果都是32位或都是64位的系统,可以直接执行rpm –ivh perl-*就行了,如果是两者都有,我这里写了一个脚本用来判断操作系统,脚本如下

#!/bin/bash
banner=$(uname -i)
cd ~/src
rpm -ivh perl-Class-Accessor-0.31-1.el5.rf.noarch.rpm
rpm -ivh perl-Config-Tiny-2.12-1.el5.rf.noarch.rpm
rpm -ivh perl-Math-Calc-Units-1.06-1.el5.rf.noarch.rpm
rpm -ivh perl-Regexp-Common-2.120-1.2.el5.rf.noarch.rpm
case $banner in
i386)
rpm -ivh perl-Params-Validate-0.89-1.el5.rf.i386.rpm
;;
x86_64)
rpm -ivh perl-Params-Validate-0.89-1.el5.rf.x86_64.rpm
;;
*)
exit 1
;;
esac

rpm -ivh perl-Nagios-Plugin-0.33-1.el5.rf.noarch.rpm

这里把所有包,包含32位和64位的同时放到src目录下。

nagios-plugin和nrpe快速部署办法[原创]

最近公司的监控服务器安装的差不多了,接下来的任务就是被监控机上的nagios-plugin和nrpe的安装了,200多台机器真要一台一台手工安装,就真的会死人了,在今天下午找到了个快速部署的办法,特把此方法与给位分享一下,高手可以忽略了。

1,先在任意一台被监控机上安装nagios-plugin和nrpe,安装目录同为/usr/local/nagios或者按各自的实际要求来定,同时这台被监控机上最好是带有mysql,这样监控mysql的脚本就会被编译进去了,这两个软件同在一个目录的一个好处就是两个软件之间可以互相使用对方libexec目录下的程序。

2,修改/etc/xinetd.d/nrpe文件,这里只需要注释掉only_from那行就行了,当然如果你的监控机只有一台,你可以考虑把那个ip改成你监控机的ip

3,修改nrpe.cfg文件,因为我希望我的每台被监控的服务器的监听ip都bind到本机的内网网卡的ip上,所以我会把#server_address=127.0.0.1这行的注释去掉。

修改
command[check_hda1]=/usr/local/nagios/libexec/check_disk -w 20% -c 10% -p /dev/hda1

command[check_disk]=/usr/local/nagios/libexec/check_disk -w 20% -c 10%

而且可以在这里把你需要监控资源都写上。

4,打包处理,接下来的任务就是把nagios目录和xinetd.d目录下的nrpe文件打到一个包中当做分发的基础包

tar zcvf nagios.tar.gz /usr/local/nagios /etc/xinetd.d/nrpe

5,将包分发,并执行配置脚本。将打好的tar包和下面的脚本分发到将要部署的服务器上,并执行脚本,这样被监控服务器就配置完毕了,当然以下脚本可以根据自己的实际应用进行调整。至于分发方法按各位习惯用的就行了,通常常使用的就是rsync,scp,cfengine统一配置等等

下面对上面的脚本做个解释

3行是创建用户
4行是将nagios包加压缩到相应的位置,nagios到/usr/local/nagios,nrpe到/etc/xinetd.d下
6行获取内网网卡的ip
7行首先将server_address的ip改成本机内网ip的地址,同时把allowed_hosts的地址在原有的基础上添加了本机内网的地址和监控机的地址
8行设置nrpe启动监听的ip地址
9行添加nrpe的服务端口
10行重启xinetd服务,也就是启动nrpe的进程

将此脚本存到其他的被监控机,并把那个nagios包也放上去,然后执行脚本,等数秒钟后使用netstat命令查看端口

# netstat -ln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      192.168.202.129:5666                0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN
tcp        0      0 :::22                       :::*                        LISTEN
udp        0      0 0.0.0.0:111                 0.0.0.0:*

首先在本机测试nrpe,执行下面的命令

[root@linux02 tmp]# /usr/local/nagios/libexec/check_nrpe -H 192.168.202.129
返回如下结果
NRPE v2.12

再来从监控机上执行命令查看被监控机的nrpe

[root@linux01 ~]# /usr/local/nagios/libexec/check_nrpe -H 192.168.202.129
返回结果如下
NRPE v2.12

由此可以看到,这样的部署方便快捷,到此,快速部署nagios-plugin和nrpe就写完了,当然以上部署还很基础,很多监控脚本都没有集成进去,还需要很多的完善,但此篇文章仅仅是给大家一个引子。

另外。如果有些人不喜欢使用xinetd来启动nrpe的话,可以讲上面的脚本稍微的改改,将

/usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg –d

这条命令添加到rc.local里,这样也可以启动nrpe