Nagios常见问题记录(2)

转自:http://skypegnu1.blog.51cto.com/8991766/1533921

1、时间同步

安装Nagios后,有3个检查时间同步的插件,根据不同的检测目标,使用不同的插件:

check_ntp:已过时,最好不要再使用;

check_ntp_peer:用于检查ntp服务器的健康状况。

check_ntp_time:用于检查指定的服务器与ntp服务器之间的时间差。

2、如何监控LVS的状态

如果要监测LVS(Linux Virtual Server)服务的状态是否正常,有这样一个插件可用:Nagios-Plugin-LVS。先说说下载这个插件:你需要先安装git软件,然后用git来检出Nagios-Plugin-LVS的源代码,检出源码之后再以源码方式安装它。git可以到这个链接去下载。安装好git之后,用git来获取Nagios-Plugin-LVS的源码:

git clone https://github.com/sukria/Nagios-Plugin-LVS

然后得到了一个名为 Nagios-Plugin-LVS 的目录。进入该目录,看不到常见的configure等可执行程序,也没有Makefile文件(只有一个Makefile.PL)文件,原因是:该插件是以perl语言编写的,我们要想生成Makefile文件,需要以perl来执行它:

perl Makefile.PL

然后就会生成Makefile文件了。就这么容易?其实不然,一般人都没有这么幸运的。执行上面这条命令时,一般来说,你会看到下面的错误输出:

Warning: prerequisite Nagios::Plugin 0 not found.

Writing Makefile for Nagios::Plugin::LVS

这是因为你在安装Nagios Plugin的时候,没有编译安装Nagios::Plugin这个perl模块造成的。

那么,如何编译此perl模块呢?在对Nagios Plugin进行configure的时候,加上参数:

./configure –enable-perl-modules

然后make,make install即可。

这样,你应该就可以成功地生成 Nagios-Plugin-LVS 插件的Makefile文件了。然后make,make install。你会在Nagios-Plugin-LVS目录下看到生成了一个名为 blib 的目录。在 blib/script/ 目录下,可以看到一个 check_lvs 可执行程序(其实它就是perl脚本)。这个程序就是我们需要放置在被监控服务器上的脚本了——由于我们要监控的是LVS服务,因此,此处的“被监控服务器”指的就是安装了LVS服务的机器(在其上,是有ipvsadm命令的,如果没有,则无法用check_lvs脚本来检测LVS状态)。

这就完了?没有。一般人都没有这么幸运。你执行一下check_lvs,会发现输出一堆错误,类似于(不尽相同,但是大概都差不多):

Can’t locate Nagios/Plugin.pm in @INC (@INC contains: /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi /usr/lib64/perl5/site_perl/5.8.7/x86_64-linux-thread-multi /usr/lib64/perl5/site_perl/5.8.6/x86_64-linux-thread-multi /usr/lib64/perl5/site_perl/5.8.5/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl/5.8.7 /usr/lib/perl5/site_perl/5.8.6 /usr/lib/perl5/site_perl/5.8.5 /usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi /usr/lib64/perl5/vendor_perl/5.8.7/x86_64-linux-thread-multi /usr/lib64/perl5/vendor_perl/5.8.6/x86_64-linux-thread-multi /usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl/5.8.7 /usr/lib/perl5/vendor_perl/5.8.6 /usr/lib/perl5/vendor_perl/5.8.5 /usr/lib/perl5/vendor_perl /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/5.8.8 .) at /usr/lib/perl5/site_perl/5.8.8/Nagios/Plugin/LVS.pm line 10.

BEGIN failed–compilation aborted at /usr/lib/perl5/site_perl/5.8.8/Nagios/Plugin/LVS.pm line 10.

Compilation failed in require at ./check_lvs line 8.

BEGIN failed–compilation aborted at ./check_lvs line 8.

这些是啥玩意?由于check_lvs是perl程序,因此,它找不到上面所提示的一堆的perl库时,会报错。我们就按错误提示中的一堆的pm文件,按相同的目录结构放置到 /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi 目录下。这些pm文件从哪来?如果你的Nagios Plugin是以默认安装路径安装的话,就是在 /usr/local/nagios/perl/lib/ 目录下。去里面找到需要的东西吧!

把文件都补齐后,再运行check_lvs程序,直到它可以成功输出结果了,就说明你的插件安装成功了。输出形如:

LVS OK – LVS is running (conn: 456778 active, 54786210 inactive)

这就结束了?还没完!由于check_lvs是要调用ipvsadm命令来获取LVS状态的,而ipvsadm命令是只能以root用户来运行的,因此,nagios用户运行不了这个命令(在客户端,插件是以nagios用户来运行的),一运行就报错:

Can’t initialize ipvs: Permission denied (you must be root)

Are you sure that IP Virtual Server is built in the kernel or as module?

真折腾,怎么解决?经试验,把nagios用户加入root组也无济于事,问题依旧。

办法是:将nagios用户设置成可以无需密码直接su成root,这样就能以nagios用户运行命令sudo /usr/local/nagios/libexec/check_lvs 了,有了这个基础,我们就可以自己编写一个名为check_lvs_nagios的脚本,然后在里面只写上一句话:

sudo /usr/local/nagios/libexec/check_lvs

此时,你切换到nagios用户(su nagios),再运行check_lvs_nagios,应该就可以输出正确的结果了。

这就完了吗?还是没完!!千万别砸我,事情就要说清楚前因后果。你在Nagios监控服务器端通过NRPE运行check_lvs_nagios命令,你会发现根本无法读取输出:

/usr/local/nagios/libexec/check_nrpe -H 192.168.XXX.XXX -c check_lvs_nagios

输出结果为:

NRPE: Unable to read output

而这个check_lvs_nagios命令,确信是在被监控服务器上的NRPE配置文件(/usr/local/nagios/etc/nrpe.cfg)中添加过了的(并且还重启了xinetd服务 service xinetd restart):

command[check_lvs_nagios]=/usr/local/nagios/libexec/check_lvs_nagios

文章来源:http://www.codelast.com/

于是,我不得不说,使用这个插件的成本太高,不仅需要安装的东西多,配置麻烦,而且到最后还是无法在只进行少量配置修改的情况下使之运行起来,因此,我转而自己写一个插件check_lvs(用shell写的),比它简单多了。请试验运行下面这段简单的shell:

#!/bin/bash

ACT_COUNT=0

for NUM in `sudo ipvsadm | grep http | grep Route | awk ‘{print $5}’`

do

ACT_COUNT=$(($ACT_COUNT+ $NUM))

done

echo $ACT_COUNT

这段shell统计了LVS服务统计信息中的“ActiveConn”的值,通过这个值,你就可以判断出LVS服务是否正常了。当然,上面的shell代码段并不是一个Nagios插件(因为其并没有按Nagios系统的要求返回正确的值),但是你只要自己根据阈值来判断是否正常、并返回相应的值就可以将它改造成一个插件了。

另外请注意:

①这段shell中有用sudo来运行ipvsadm命令,因此你还是需要像上面的内容中所说的一样,为nagios用户添加可以无密码su到root的权限(方法请看这个链接的第25条内容)。然后你就可以用nagios用户来运行这个脚本了。

②sudo命令默认不能在后台运行,要开放这个权限,同样请看这个链接的第25条内容。

3、被动监控

被动监测的实现——NSCA

详情请点击这个链接

4、CGI权限问题

It appears as though you do not have permission to view information for any of the hosts you requested…
If you believe this is an error, check the HTTP server authentication requirements for accessing this CGI

and check the authorization options in your CGI configuration file.

原因 : 认证用户不正确

开启认证:认证的用户必须是 cgi.cfg 配置文件里有的 默认是 nagiosadmin,如果你新建的其他用户,需要添加进去,多个用户用逗号分开。

use_authentication=1

authorized_for_system_information=nagiosadmin,testuser
authorized_for_configuration_information=nagiosadmin,testuser
authorized_for_system_commands=nagiosadmin,testuser
authorized_for_all_services=nagiosadmin,testuesr
authorized_for_all_hosts=nagiosadmin,testuser
authorized_for_all_service_commands=nagiosadmin,testuser
authorized_for_all_host_commands=nagiosadmin,testuser

其实认证有两层,

第一层是由apache提供的登录认证,可配置apache的配置文件, htpasswd 命令可添加用户

1
# htpasswd -c /etc/nagios/htpasswd.users testuser

第二层是nagios本身执行cgi的用户,我们需要编辑cgi.cfg, 配置用户权限。

五、The requested URL /icinga/cgi-bin/statusmap.cgi was not found on this server

近期在公司部署监控平台,使用号称nagios的扩展版本:icinga

发现有些功能无法使用:

The requested URL /icinga/cgi-bin/statusmap.cgi was not found on this server #状态图
The requested URL /icinga/cgi-bin/histogram.cgi was not found on this server #告警柱状图
The requested URL /icinga/cgi-bin/trends.cgi was not found on this server #趋势报表

查阅资料后发现是由于gd库没有安装。导致make cgis的时候没有生成该cgi文件。

ubuntu/debian如下安装gd:

sudo apt-get install libjpeg62 libjpeg62-dev libpng12 libpng12-dev
sudo apt-get install libgd2-xpm libgd2-xpm-dev

Redhat/CentOS如下安装gd:yum install libjpeg libjpeg-devel libpng libpng-devel
yum install gd gd-devel

再次进入icinga的源码所在目录,重新预编译,并且指定gd库文件位置。比如:cd /usr/src/icinga/                          #进入icinga原文件目录
./configure -with-gd-lib=/usr/local/lib/      #注意:此路径针对的是ubuntu/debian系统。
./configure -with-gd-lib=/usr/lib/            #注意: 此路径针对的是Redhat/CentOS系统。
make cgis                                     #重新编译出cgi文件

编译完成后即可在当前目录的cgi目录中看到上述cgi文件,然后将cgi文件拷贝至nagios或者icinga的sbin目录下即可。cp /usr/src/icinga/cgi/*.cgi /usr/local/icinga/sbin
chown icinga:icinga /usr/local/icinga/sbin/*.cgi #修改cgi属组和属主

然后重新访问该功能,发现已经正常,可以出现数据。

注:
1.由于icinga属于nagios的扩展版本,所以这个问题在nagios上面也会出现,而且解决方法一样。
2.如果是全新安装,执行完上面./configure命令后需要按部就班的安装nagios或者icinga安装步骤安装。
如果已经安装过,只是想编译出cgi文件,则只需在执行完./configure后执行make cgis即可单独生成cgi文件。拷贝过去即可使用。