目录
一.Nagios报警简介... 3
二.nagios-master安装... 3
1.用户,目录权限设置... 3
2.安装 nagios-3.0.5.tar.gz. 3
3.Nagios-plugins-1.4.13.tar.gz. 4
4. 修改apache配置... 4
5.主配置文件nagios.cfg. 6
6.权限控制文件cgi.cfg的配置... 7
7.主机定义文件hosts.cfg. 8
8.主机组定义文件hostgroups.cfg. 9
9.监控时间段定义文件timeperiods.cfg. 9
11.联系人配置文件contacts.cfg. 10
12.联系组配置文件contactgroups.cfg. 10
13.服务定义文件services.cfg. 11
14.检测配置,启动web监控... 11
15.一些Nagios插件介绍... 13
二、 监控远程主机... 15
1.首先需要添加nagios用户... 16
2. xinetd服务安装... 16
3.安装nagios-plugins. 16
4.安装nrpe. 17
5.nrpe被监控端配置... 18
6.nagios-master主监控机nrpe设置... 19
三.nagios插件扩展... 19
1.自定义插件check_log_error(shell). 20
2.自定义插件check_hdfs_folder_age(shell). 22
3.自定义插件check_crawler_spider(shell). 23
4.自定义插件check_server_app(python). 24
四.与ganglia集成... 26
1. check_ganglia.py插件扩展... 26
2.nagios-master的service配置... 27
一.Nagios报警简介
nagios的功能是监控服务和主机,但是他自身并不包括这部分功能的代码,所有的监控、检测功能都是有插件来完成的。
再说报警功能,如果监控系统发现问题不能报警那就没有意义了,所以报警也是nagios很重要的功能之一。但是,同样的,nagios自身也没有报警部分的代码,甚至没有插件,而是交给用户或者其他相关开源项目组去完成。
nagios安装,是指基本平台,也就是nagios软件包的安装。它是监控体系的框架,也是所有监控的基础。
打开nagios官方的文档,会发现nagios基本上没有什么依赖包,只要求系统是linux或者其他nagios支持的系统。不过如果你没有安装apache(httpd服务),那么你就没有那么直观的界面来查看监控信息了,所以apache姑且算是一个前提条件。关于apache的安装,网上有很多,照着安装就是了。安装之后要检查一下是否可以正常工作。
nagios定义了4种监控状态,代表不同的严重级别,除了OK代表正常不用关心外,其余3种都要引起重视.如下表:
状态 |
代码 |
颜色 |
正常 |
OK |
绿色, |
警告 |
WARNING |
黄色, |
严重 |
CRITICAL |
红色, |
未知错误 |
UNKOWN |
深黄色 |
二.nagios-master安装
1.用户,目录权限设置
先增加用户 useradd nagios
mkdir /usr/local/nagios
chown -R nagios /usr/local/nagios
chgrp -R nagios /usr/local/nagios
2.安装 nagios-3.0.5.tar.gz
cd /usr/local/src
wget http://nchc.dl.sourceforge.net/project/nagios/nagios-3.x/nagios-3.0.5/nagios-3.0.5.tar.gz
tar –zxvf nagios-3.0.5.tar.gz
cd usr/local/src/nagios-3.0.5
./configure --prefix=/usr/local/nagios
make all
make install
make install-init
make install-commandmode
make install-config
make install-webconf
验证程序是否被正确安装。切换目录到安装路径(这里是/usr/local/nagios),看是否存在etc、bin、 sbin、 share、 var这五个目录,如果存在则可以表明程序被正确的安装到系统了。后表是五个目录功能的简要说明:
bin |
Nagios执行程序所在目录,nagios文件即为主程序 |
etc |
Nagios配置文件位置,初始安装完后,只有几个*.cfg-sample文件 |
sbin |
Nagios Cgi文件所在目录,也就是执行外部命令所需文件所在的目录 |
Share |
Nagios网页文件所在的目录 |
Var |
Nagios日志文件、spid 等文件所在的目录 |
3.Nagios-plugins-1.4.13.tar.gz
wget http://syslab.comsenz.com/downloads/linux/nagios-plugins-1.4.13.tar.gz
tar -zxvf nagios-plugins-1.4.13.tar.gz
cd /usr/local/src/nagios-plugins-1.4.13
编译,指定路径为之前nagios的安装路径
./configure --prefix=/usr/local/nagios/
make
安装
make install
ls /usr/local/nagios/libexec/
会显示安装的插件文件,即所有的插件都安装在libexec这个目录下
4. 修改apache配置
修改apache的配置文件,增加nagios的目录,并且访问此目录需要进行身份验证
vi /usr/local/apache2/conf/httpd.conf,在最后增加如下内容
#setting for nagios 20070707 ScriptAlias /nagios/cgi-bin /usr/local/nagios/sbin <Directory "/usr/local/nagios/sbin"> Options ExecCGI AllowOverride None Order allow,deny Allow from all AuthName "Nagios Access" AuthType Basic AuthUserFile /usr/local/nagios/etc/htpasswd //用于此目录访问身份验证的文件 Require valid-user </Directory>
Alias /nagios /usr/local/nagios/share <Directory "/usr/local/nagios/share"> Options None AllowOverride None Order allow,deny Allow from all AuthName "Nagios Access" AuthType Basic AuthUserFile /usr/local/nagios/etc/htpasswd //用于此目录访问身份验证的文件 Require valid-user </Directory> |
增加验证用户
也就是通过web访问nagios的时候,必须要用这个用户登陆.在这里我们增加用户guest:密码为guest
/usr/local/apache2/bin/htpasswd -c /usr/local/nagios/etc/htpasswd guest
New password: (输入guest)
Re-type new password: (再输入一次密码)
Adding password for user guest
到这里nagios的安装也就基本完成了,你可以通过web来访问了.
[url]http://192.169.32.73/nagios[/url] 会弹出对话框要求输入用户名密码
输入guest,密码guest,就可以进入nagios的主页面了
查看认证文件的内容
less /usr/local/nagios/etc/htpasswd
guest:yrxWWTzuHrX5A 前半部分是用户名guest,后面是加密后的密码
---有时候登陆不进去检查/usr/local/nagios/etc/htpasswd.users
cp /usr/local/nagios/etc/htpasswd.user /usr/local/nagios/etc/htpasswd.users
5.主配置文件nagios.cfg
Nagios自己定义了一套规则用于配置文件,其中最重要的概念就是”对象”----object.通俗的理解:假定我们首先定义了”性别”这个对象,它的值只可能是男,女,人妖等等,然后定义某人为一个对象,例如张三,定义张三的时候有”性别”这个属性,它的值就必须来源了之前定义的性别这个对象,要么是男,要么是女
在Nagios里面定义了一些基本的对象,一般用到的有:
联系人 |
contact |
出了问题像谁报告?一般当然是系统管理员了 |
监控时间段 |
timeperiod |
7X24小时不间断还是周一至周五,或是自定义的其他时间段 |
被监控主机 |
host |
所需要监控的服务器,当然可以是监控机自己 |
监控命令 |
command |
nagios发出的哪个指令来执行某个监控,这也是自己定义的 |
被监控的服务 |
service |
例如主机是否存活,80端口是否开,磁盘使用情况或者自定义的服务等 |
另外,多个被监控主机可以定义为一个主机组,多个联系人可以被定义为一 个联系人组,多个服务还能定义成一个服务组
回到上面的例子,定义张三需要之前定义的性别,我们定义一个被监控的服务,当然就要指定被监控的主机,需要监控的时间段,要用哪个命令来完成这个监控操作,出了问题向哪个联系人报告
所有这些对象绝对多数都是需要我们手动定义的,这就是nagios的安装显得复杂的地方.下面我们来配置nagios主配置文件。
修改nagios的主配置文件nagios.cfg
vi /usr/local/nagios/etc/nagios.cfg
注释行 #cfg_file=/usr/local/nagios/etc/localhost.cfg[2],然后把下面几行的注释去掉:
cfg_file=/usr/local/nagios/etc/contactgroups.cfg //联系组配置文件路径
cfg_file=/usr/local/nagios/etc/contacts.cfg //联系人配置文件路径
cfg_file=/usr/local/nagios/etc/hostgroups.cfg //主机组配置文件路径
cfg_file=/usr/local/nagios/etc/hosts.cfg //主机配置文件路径
cfg_file=/usr/local/nagios/etc/services.cfg //服务配置文件路径
cfg_file=/usr/local/nagios/etc/servicegroups.cfg //服务组配置文件路径
cfg_file=/usr/local/nagios/etc/timeperiods.cfg //监视时段配置文件路径
cfg_file=/usr/local/nagios/etc/commands.cfg //命令配置
cfg_file=/usr/local/nagios/etc/templates.cfg //模板定义
6.权限控制文件cgi.cfg的配置
[root@nagios etc]# vim cgi.cfg
Cgi.cfg的作用是控制相关cgi脚本,先确保use_authentication=1,
default_user_name=***这句可以不用定义,默认是注释掉的,看命令解释说地定义有风险。
authorized_for_system_information=nagiosadmin,guest
authorized_for_configuration_information=nagiosadmin, guest
authorized_for_system_commands=nagiosadmin, guest //多个用户之间用逗号隔开
authorized_for_all_services=nagiosadmin, guest
authorized_for_all_hosts=nagiosadmin, guest
authorized_for_all_service_commands=nagiosadmin, guest
authorized_for_all_host_commands=nagiosadmin, guest
上述的用户名就是之前使用htpasswd -c /usr/local/nagios/etc/htpasswd.users guest生成的guest用户。在此就不做过多说明了。不过这个要注意,请不要随便添加不存在的验证用户,并且为了安全起见,不要添加过多的验证用户。
7.主机定义文件hosts.cfg
cd /usr/local/nagios/etc/
vim hosts.cfg 此处没有hosts.cfg文件,直接vim编辑创建即可
define host{
host_name 192.169.32.67
//被监控主机的名称,最好别带空格 用tab键来分隔
alias mechine67
//别名
address 192.169.32.67
//被监控主机的IP地址
check_command check-host-alive
//监控的命令check-host-alive,这个命令来自commands.cfg,用来监控主机是否存活
max_check_attempts 5
//检查失败后重试的次数
check_period 24x7
//检查的时间段24x7,见下面timeperiods.cfg中定义
contacts xubl
//联系人
notification_interval 1000
//提醒的间隔,每隔1000秒提醒一次
notification_period 24x7
//提醒的周期, 24x7,见下面timeperiods.cfg中定义
notification_options d,u,r
//指定什么情况下提醒,具体含义见下面contacts.cfg部分的介绍
}
8.主机组定义文件hostgroups.cfg
cat /usr/local/nagios/etc/hostgroups.cfg
此处添加之前已定义好的主机名就行了,不同主机名之间用逗号隔开。
9.监控时间段定义文件timeperiods.cfg
cat /usr/local/nagios/etc/timeperiods.cfg
其他时间段一般不需要。
11.联系人配置文件contacts.cfg
cat /usr/local/nagios/etc/contacts.cfg
此处定义的就是出了问题应该通知谁,通常就是系统管理员,上图定义的就是当监控服务出现w(warn) , u(unknow)、c(critical)、r(从异常状态下恢复)或者主机出现d(down机)、u(unreachable)、r(从异常状态下恢复)的时候就会以notify-service-by-email和notify-host-by-email命令定义的方式(此命令是在commands.cfg中定义的)向系统管理员发送报警通知。注意,contacts.cfg最下面也有关于contactgroup的模版,这里我们另外创建一个contactgroup.cfg联系组的文件,就不在联系人文件中定义联系组了,contacts.cfg中关于contactgroup的配置直接删除即可。
12.联系组配置文件contactgroups.cfg
cat /usr/local/nagios/etc/contactgroups.cfg
定义联系组的组名为datagroup,组的成员来自于上面定义的contacts.cfg,如果有多个联系人则以逗号相隔。下面是最关键的了,用nagios主要是监控一台主机的各种信息,包括本机资源,对外的服务等等.这些在nagios里面都是被称之为service,而实现对一个service的监控,则需要通过commands.cfg文件中定义的命令
例如我们现在有一个需要监控的service,是监控一台机器的web服务是否正常, 我们需要哪些元素呢?最重要的有下面三点:首先是监控哪台机,然后是这个监控要用什么命令实现,最后就是出了问题的时候要通知哪个联系人?接下来,看第13部分。
13.服务定义文件services.cfg
cat /usr/local/nagios/etc/services.cfg
以监控http服务为例,监控的主机为67这台主机,监控的时间段为24x7这个时间段名命定的定义
引用的检查服务命令是commands.cfg里定义的check_tcp!80这个命令,就是去ping主机的80端口来检查http是否正常,发现ping不通后最大尝试次数为3次,包括重新检查间隔这些参数都是在timeperiods.cfg里定义的,自己可以修改。
还有就是报警参数的设置也是自己按需求定义(参数在命令后面用!分割)。
报警通知联系人也可以根据需要自定义。
14.检测配置,启动web监控
当所有的文件都配置好以后,可以用命令检查配置得是否正确。
/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg 检测配置文件是否正确
如果Error是0说明配置没有问题,如果有错误的话会有提示哪里出错,检查出错的配置文件。
/etc/init.d/httpd restart
/etc/init.d/nagios restart
在浏览器输入主监控机IP地址测试:http://192.169.32.73/nagios/
要求用户名验证,就是之前httpasswd创建的web验证用户guest,第一部分的功能已经实现了,就是简单的监控主机是否存活当然,对于系统监控来说,这是远远不够的,对于来说,他的真正功能功能还没有发挥出来,在下面部分会详细的叙述。
15.一些Nagios插件介绍
nagios本身并没有监控的功能,所有的监控是由插件完成的,插件将监控的结果返回给nagios,nagios分析这些结果,以web的方式展现给我们,同时提供相应的报警功能(这个报警的功能也是由插件完成的)
所有的这些插件是一些实现特定功能的可执行程序,默认安装的路径是/usr/local/nagios/libexec
我们在定义某个监控service时,所用的监控命令都是来自commands.cfg的,commands.cfg中定义的监控命令就是使用的这些插件.举个例子,之前我们已经不止一次用到了check-host-alive这个命令,打开commands.cfg就可以看到这个命令的定义,如下:
command_name check-host-alive
这句话的意思是定义的命令名是check-host-alive,也就是我们在services.cfg中使用的名称
执行的操作是
$USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5
其中$USER1$是在resource.cfg文件中定义的,代表插件的安装路径.就如我们上面看到的那样$USER1$=/usr/local/nagios/libexec,至于$HOSTADDRESS$,则默认被定义为监控主机的地址.
简单的说,我们在services.cfg中定义了对192.169.32.67执行check-host-alive命令,实际上就是执行了
/usr/local/nagios/libexec/ check_ping -H 192.169.32.67 -w 3000.0,80% -c 5000.0,100% -p 1
实际上check-host-alive只是这一长串命令的简称而已,而在services.cfg中都是使用简称的.
在commands.cfg中定义了很多这样的命令简称.基本上我们常用的监控项目都包含了,例如ftp,http,本地的磁盘,负载等等.
我们再看一个命令,check_local_disk定义如下
check_local_disk实际上是执行的check_disk插件.这里的$ARG1$, $ARG2$, $ARG3$是什么意思呢?在之前我们已经提到了这个check_disk这个插件的用法,-w的参数指定磁盘剩了多少是警告状态,-c的参数指定剩多少是严重状态,-p用来指定路径
在使用check-host-alive的时候,只需要在services.cfg中直接写上这个命令名check-host-alive.后面没任何的参数.而使用check_local_disk则不同,在services.cfg中这要这么写
check_local_disk!10%!5%!/
在命令名后面用!分隔出了3个参数,10%是$ARG1$的值,5%是$ARG2$的值,/ 是$ARG3$的值
简单的一句话就是
services.cfg定义监控项目用某个命令 ↓ 这个命令必须在commands.cfg中定义 ↓ 定义这个命令时使用了libexec下的插件 |
如果命令不带$ARG1$就可以在services.cfg中直接使用,如果带了使用时就带上参数,以!相隔
继续编辑services.cfg服务配置文件,添加需要监控的服务,基本上就是copy上节我们定义监控主机存活的配置,略作修改就行:
监控192.169.32.67的FTP服务
define service{ host_name 192.169.32.67 要监控的机器,给出机器名,注意必须是hosts.cfg中定义的 service_description check ftp 给这个监控项目起个名字吧,任意起,你自己懂就行 check_command check_ftp 所用的命令,当然必须是commands.cfg中定义了的 max_check_attempts 5 normal_check_interval 3 retry_check_interval 2 check_period 24x7 notification_interval 10 notification_period 24x7 notification_options u,c,r contacts xubl } |
监控192.169.32.67的根分区使用情况
define service{ host_name 192.169.32.67 service_description check disk check_command check_local_disk!10%!5%!/ max_check_attempts 5 normal_check_interval 3 retry_check_interval 2 check_period 24x7 notification_interval 10 notification_period 24x7 notification_options w,u,c,r contacts xubl } |
其他的监控服务类似于这样,需要监控的服务在commands.cfg里都可以一一找到模版,需要监控不同主机只要修改hostname这一栏就行了。
二、监控远程主机
对于像磁盘容量,cpu负载这样的”本地信息”,nagios只能监测自己所在的主机,而对其他的机器则显得有点无能为力.毕竟没得到被控主机的适当权限是不可能得到这些信息的.为了解决这个问题,nagios有这样一个附加组件----NRPE.用它就可以完成对linux类型主机”本地信息”的监控.
NRPE原理图如下:
NRPE总共由两部分组成:
– check_nrpe 插件,位于在监控主机(nagios-master)上
– NRPE daemon,运行在远程的linux主机上(通常就是被监控机)
按照上图,整个的监控过程如下:
当nagios需要监控某个远程linux主机的服务或者资源情况时
1.nagios会运行check_nrpe这个插件,告诉它要检查什么.
2.check_nrpe插件会连接到远程的NRPE daemon,所用的方式是SSL
3.NRPE daemon会运行相应的nagios插件来执行检查
4.NRPE daemon将检查的结果返回给check_nrpe插件,插件将其递交给nagios做处理.
注意:NRPE daemon需要nagios插件安装在远程的linux主机上,否则,daemon不能做任何的监控.下面讲述如何配置远程监控,首先需要在被监控主机上安装nrpe插件:
1.首先需要添加nagios用户
[root@127.43~]#useradd nagios
[root@127.43~]#passwd nagios
2. xinetd服务安装
service xinetd 命令先查看有没有xinetd,没有的话,进行安装 yum install xinetd
3.安装nagios-plugins
cd /usr/local/src
wget http://syslab.comsenz.com/downloads/linux/nagios-plugins-1.4.13.tar.gz
tar -zxvf nagios-plugins-1.4.13.tar.gz
cd /usr/local/src/nagios-plugins-1.4.13
./configure(如果报错:no acceptable C compiler found in $PATH 则先安装 yum install gcc)
make
make install
这一步完成后会在/usr/local/nagios/下生成两个目录libexec和share
修改目录权限
chown -R nagios /usr/local/nagios
chgrp -R nagios /usr/local/nagios
4.安装nrpe
cd /usr/local/src
wget http://prdownloads.sourceforge.net/sourceforge/nagios/nrpe-2.12.tar.gz
tar -zxvf nrpe-2.12.tar.gz
cd /usr/local/src/nrpe-2.12
./configure --enable-command-args
(如果提示ssl 找不到,则先运行 yum install openssl-devel,再运行./configure)
make all
make install-plugin
make install-daemon
make install-daemon-config
现在再查看/usr/local/nagios/目录就会发现有4个目录了
bin etc libexec share
安装到xinetd下
make install-xinetd
vi /etc/xinetd.d/nrpe
设置only_from=nagios master的ip
only_from = 192.167.33.73 192.169.32.73 127.0.0.1
保存退出
增加nrpe服务
vim /etc/services
在最后一行添加上 nrpe 5666/tcp #nrpe
最后重启xinetd服务
service xinetd restart
---------------------------------------------------------------------
可以查看到5666端口已经在监听了,然后使用check_nrpe这个插件功能测试nrpe时候正常工作
可以看到返回当前NRPE的版本,说明本地用check_nrpe连接nrpe daemon是正常的。要注意的是为了让主监控机能监控到被监控机信息,被监控机也要保证防火墙打开5666端口
5.nrpe被监控端配置
进入到/usr/local/nagios/etc目录,可以看到目录下有一个nrpe.cfg文件,这就是nrpe的主配置文件,编辑他,找到下面这段话:
# The following examples use hardcoded command arguments... command[check_users]=/usr/local/nagios/libexec/check_users -w 5 -c 10 command[check_load]=/usr/local/nagios/libexec/check_load -w 15,10,5 -c 30,25,20 command[check_hda1]=/usr/local/nagios/libexec/check_disk -w 20 -c 10 -p /dev/hda1 command[check_zombie_procs]=/usr/local/nagios/libexec/check_procs -w 5 -c 10 -s Z command[check_total_procs]=/usr/local/nagios/libexec/check_procs -w 150 -c 200 |
红色部分是命令名,也就是check_nrpe 的-c参数可以接的内容,等号=后面是实际执行的插件程序(这与commands.cfg中定义命令的形式十分相似,只不过是写在了一行).也就是说check_users就是等号后面/usr/local/nagios/libexec/check_users -w 5 -c 10的简称
我们可以很容易知道上面这5行定义的命令分别是检测登陆用户数,cpu负载,hda1的容量,僵尸进程,总进程数.各条命令具体的含义见插件用法(执行”插件程序名 –h”)
/usr/local/nagios/libexec/check_nrpe -H localhost -c check_users |
/usr/local/nagios/libexec/check_nrpe -H localhost -c check_load |
/usr/local/nagios/libexec/check_nrpe -H localhost -c check_hda1 |
/usr/local/nagios/libexec/check_nrpe -H localhost -c check_zombie_procs |
/usr/local/nagios/libexec/check_nrpe -H localhost -c check_total_procs |
到此被监控机上的配置就完成了,下面是在nagios-master上的nrpe设置:
6.nagios-master主监控机nrpe设置
在主监控机上其实要做的就是安装check_nrpe插件,然后在commands.cfg里创建check_nrpe的命令定义,daemon不需要安装上去,但是为了保险起见还是同客户端上一样都安装上去。
安装过程参照(2. xinetd服务安装,4.安装nrpe)
7.在commands.cfg增加check_nrpe定义
只需要在最后增加下面内容:
-c后面带的$ARG1$参数是传给nrpe daemon执行的检测命令,之前说过了它必须是nrpe.cfg中所定义的那5条命令中的其中一条.在services.cfg中使用check_nrpe的时候要用!带上这个参数
下面就可以在services.cfg中定义对192.169.32.67主机cpu负载等等的监控
define service {
host_name 192.169.32.67
被监控的主机名,这里注意必须是linux且运行着nrpe,而且必须是hosts.cfg中定义的
service_description check-users
监控项目的名称
check_period 24x7
max_check_attempts 4
normal_check_interval 3
retry_check_interval 2
contacts xubl
notification_interval 10
notification_period 24x7
notification_options w,u,c,r
check_command check_nrpe!check_load
监控命令check_nrpe,是在commands.cfg中定义的,带的参数是check_load,是在nrpe.cfg中定义的
}
接下来重启nagios就行了,到此服务器端和客户端的配置全部完成。
三.nagios插件扩展
前面我们知道,监控的功能完全是否插件来实现的,很多时候我们需要扩展自己的插件来监控特定的service,插件扩展的基本步骤:
1.插件检测的service状态是否正常,在插件的脚本程序退出码来体现。
(如发现service正常,则 exit 0)
2.程序在退出之前,打印一段描述文字,可以显示在nagios界面上
(如echo “service OK!”)
附service状态和脚本程序退出码对应关系:
状态 |
代码 |
脚本程序退出码 |
正常 |
OK |
0 |
警告 |
WARNING |
1 |
严重 |
CRITICAL |
2 |
未知错误 |
UNKOWN |
--一般不用 |
1.自定义插件check_log_error(shell)
>>>1.1主要功能:
(1) 根据关键字查找进程(通常是一个进程的运行入口主类)
监控这个进程是否存在,如果不存在,则报警。
(2) 检测log,看是否有新的error log出现,如果有,则报警。
>>>1.2参数
(1) 要检测的进程关键字(通常是一个进程的运行入口主类)
(2) log4j打印的日志的文件夹(该文件夹下必须有error.log文件,专门打印error级别的log)
>>>1.3代码(shell)
位于68机器/usr/local/nagios/libexec/
#!/bin/sh folder=$2 cd $folder #====1检测进程存活============================================ process_count=`ps -ef | grep $1 |cut -c 9-15 | wc -l` let process_count=process_count-3 if [ $process_count -lt 1 ] then echo "ERROR process not exist ["$1"]" exit 2 fi
#=====2.检测error信息============================================ #检查error.log,取得文件的最新更新时间,然后与当前目录下recent_solve_time.txt中的时#间,作对比 #如果error.log修改时间大于recent_solve_time时间,则报警 #如果recent_solve_time.txt文件不存在,则与当前时间作比较 #============================================================== recent_error_time="1970-01-01 00:00:00" #如果有error信息,则得到error.log的最后修改时间 if [ -f error.log ] then error_count=`tail -200 error.log | grep ERROR |wc -l` if [ $error_count -gt 0 ] then recent_error_last_modify_timestamp=`stat -c %Y error.log` recent_error_time=`date –d @$recent_error_last_modify_timestamp "+%Y-%m-%d %H:%M:%S"` fi fi recent_solve_time="1970-01-01 00:00:00" #查看有没有解决问题记录 if [ -f recent_solve_time.txt ] then recent_solve_time=`cat recent_solve_time.txt` fi msg="recent_solve_time="$recent_solve_time";recent_error_time="$recent_error_time #比较两个时间(先转化为时间戳,然后比较大小) recent_solve_timestamp=`date -d "$recent_solve_time" +%s` recent_error_timestamp=`date -d "$recent_error_time" +%s` if [ $recent_error_timestamp -gt $recent_solve_timestamp ] then echo "ERROR "$msg exit 2 else echo " OK "$msg exit 0 fi |
>>>1.4被监控端配置
(1).脚本拷贝到/usr/local/nagios/libexec/
(2).编辑 /usr/local/nagios/etc/nrpe.cfg , 增加以下内容:
(3).重启:service xinetd restart
>>>1.5 nagios-master配置
(1).编辑services.cfg ,配置你想要监控的进程,如:
(2).重启 service nagios restart
2.自定义插件check_hdfs_folder_age(shell)
>>>2.1主要功能:
check一个hdfs目录的最近更新时间,如果时间过久,则报警
(如监控源码下载包的上传目录,如果很长时间没有源码包,说明下载有问题)
>>>2.2参数
(1)hdfs目录
(2)目录更新时间间隔的报警阀值(如超过两个小时没更新,就报警) 单位为秒
>>>2.3代码(shell)
位于49机器/usr/local/nagios/libexec/
#!/bin/sh current_year=`date +%Y` last_modify_time=${current_year}`/home/parallel/hadoop-1.0.1/bin/hadoop dfs -ls $1 | tail -1 | awk -F $1 '{print $1}'| awk -F ${current_year} '{print $2}'` last_modify_timestamp=`date -d "${last_modify_time}" +%s` current_timestamp=`date +%s` #比较源码最修上传时间--与当前时间---相差特定时间以上,则报警 current_timestamp_diff=`expr $current_timestamp - $2` if [ $current_timestamp_diff -gt $last_modify_timestamp ] then echo "ERROR! $1 is too old!" exit 2 else echo "OK $1 modified at "${last_modify_time} exit 0 fi |
>>>2.4被监控端配置
(1).脚本拷贝到/usr/local/nagios/libexec/
(2).编辑 /usr/local/nagios/etc/nrpe.cfg , 增加以下内容:
(3).重启:service xinetd restart
>>>2.5 nagios-master配置
(1).编辑services.cfg ,配置你想要监控的进程,如:
(2).重启 service nagios restart
3.自定义插件check_crawler_spider(shell)
>>>3.1主要功能:
(1) 检查crawler进程是否存在,不存在则报警
(2) 检查cralwer 最近半小时内下载成功的url数量,如果==0,则报警
>>>3.2参数
(1)crawler进程运行入口主类(一般是tsinghua.crawlers.spider.Spider)
(2)log4j打印的日志目录(里面有info.log)
因为nagios需要读取文件,必须保证nagois对这个文件的读权限
(把/home/crawler改为nagios可读 setfacl -R -m u:nagios:rx /home/crawler)
>>>3.3代码(shell)
位于68机器/usr/local/nagios/libexec/
#!/bin/sh #===1.检测进程存活=================================================== process_count=`ps -ef | grep $1 |cut -c 9-15 | wc -l` let process_count=process_count-3 if [ $process_count -lt 1 ] then echo "ERROR process not exist ["$1"]" exit 2 fi
#=====================2.检测info.log中最近半小时出现finish关键字的次数 total_count="0" export total_count cd $2 interval=3 current_time=`date +%s` last_ten_minute=`expr $current_time - 600` last_twenty_minute=`expr $current_time - 1200` last_thirty_minute=`expr $current_time - 1800` #当前十分钟段 current_time_interval=`date -d @$current_time "+%Y-%m-%d %H:%M:%S" | cut -c 1-15` #十分钟之前段 last_ten_minute_interval=`date -d @$last_ten_minute "+%Y-%m-%d %H:%M:%S" | cut -c 1-15` #二十分钟之前段 last_twenty_minute_interval=`date -d @$last_twenty_minute "+%Y-%m-%d %H:%M:%S" | cut -c 1-15` #三十分钟之前段 last_thirty_minute_interval=`date -d @$last_thirty_minute "+%Y-%m-%d %H:%M:%S" | cut -c 1-15` function getFinishCount() { #第一个参数为文件名字,第二个参数为时间正则,第三个参数为关键字 count=`cat $1 | grep "$2" | grep "$3" | wc -l` total_count=`expr $total_count + $count` } getFinishCount info.log "${current_time_interval}" "finish" getFinishCount info.log "${last_ten_minute_interval}" "finish" getFinishCount info.log "${last_thirty_minute_interval}" "finish" getFinishCount info.log "${last_twenty_minute_interval}" "finish" if [ $total_count -lt 1 ] then echo "ERROR! the count of urls in recent thirty minutes is 0!!" exit 2 else echo "OK! the count of urls in recent thirty minutes is "$total_count exit 0 fi |
>>>3.4被监控端配置
(1).脚本拷贝到/usr/local/nagios/libexec/
(2).编辑 /usr/local/nagios/etc/nrpe.cfg , 增加以下内容:
(3).重启:service xinetd restart
>>>3.5 nagios-master配置
(1).编辑services.cfg ,配置你想要监控的进程,如:
(2).重启 service nagios restart
4.自定义插件check_server_app(python)
>>>4.1主要功能:
检查server调度中raw_page_hbase,raw_page_extract,dr_hbase失败或等待的数据包个数,超过阀值则报警。(通过查询mysql统计的任务包个数)
>>>4.2参数
针对特定程序的脚本,没有参数
>>>4.3代码(python)
位于68机器/usr/local/nagios/libexec/
#!/usr/bin/python #coding=utf-8 import MySQLdb import sys try: connection = MySQLdb.connect(user="guest",passwd="guest1234",host="192.167.33.90",db="platform") except: print "Could not connect to MySQL server." exit( 0 )
msg = "ERROR"
try: cursor = connection.cursor()
#获取[源码导入hbase]未成功的数量 cursor.execute( "select count(*) from server_app_raw_page_hbase where state not like 'success%'" ) result = cursor.fetchone(); raw_page_hbase_unsuccess_count = result[0] #print raw_page_hbase_unsuccess_count
#获取[源码抽取]未成功的数量 cursor.execute( "select count(*) from server_app_raw_page_extract where state not like 'success%'" ) result = cursor.fetchone(); raw_page_extract_unsuccess_count = result[0] #print raw_page_extract_unsuccess_count
#获取[DR导入hbase]未成功的数量 cursor.execute( "select count(*) from server_app_dr_hbase where state not like 'success%'" ) result = cursor.fetchone(); dr_hbase_unsuccess_count = result[0] #print dr_hbase_unsuccess_count
cursor.close()
if( raw_page_hbase_unsuccess_count<30 and raw_page_extract_unsuccess_count<30 and dr_hbase_unsuccess_count<30 ): msg = "ok" except: print "Invoke Exception" sys.exit(2)
if( msg=="ERROR" ): msg = "ERROR! raw_page_hbase:" + str(raw_page_hbase_unsuccess_count) +";raw_page_extract:"+str(raw_page_extract_unsuccess_count)+";dr_hbase:"+str(dr_hbase_unsuccess_count) print msg sys.exit(2) else: msg = "OK! raw_page_hbase:" + str(raw_page_hbase_unsuccess_count) +";raw_page_extract:"+str(raw_page_extract_unsuccess_count)+";dr_hbase:"+str(dr_hbase_unsuccess_count) print msg sys.exit(0) |
>>>4.4被监控端配置
(1).脚本拷贝到/usr/local/nagios/libexec/
(2).编辑 /usr/local/nagios/etc/nrpe.cfg , 增加以下内容:
(3).重启:service xinetd restart
>>>3.5 nagios-master配置
(1).编辑services.cfg ,配置你想要监控的进程,如:
(2).重启 service nagios restart
四.与ganglia集成
1. check_ganglia.py插件扩展
nagios可以监控ganglia中定义的metric的数值,当metric的value高于或低于阀值的时候,进行报警。
ganglia本身自带了这样一个nagios插件(ganglia解压目录下的/contrib/check_ganglia.py)
但该插件有个缺点,就是他判断当metric高于阀值时提供报警,这显然不能满足我们的要求,例如磁盘剩余空间,很显然当剩余空间低于阀值时需要报警,所以需要对check_ganglia.py进行改动。
首先,我们约定,metric名称中含有” _free”关键字,我们认为这是剩余量的意思,此类metric低于阀值时需要报警。基于这个约定,我们改写下check_ganglia.py
在check_ganglia.py的最后找到下面这段代码:
在这段话之前,加上下面这样一段代码,即判定metric是否包含关键字”_free”,如果是,则在低于阀值时,报警。扩展代码如下图所示:
(扩展后的代码位于73机器/usr/local/nagios/libexec/check_ganglia.py)
扩展后的代码,放到nagios-master 的/usr/local/nagios/libexec/目录下
2.nagios-master的service配置
以下所有配置,见73机器
2.1定义check_ganglia命令
编辑/usr/local/nagios/etc/commands.cfg,增加配置
2.2编辑/usr/local/nagios/etc/hostgroups.cfg
定义ganglia-services组,组成员为*,所有机器
2.3编辑/usr/local/nagios/etc/servicegroups.cfg
定义ganglia-metrics服务组
2.4编辑/usr/local/nagios/etc/templates.cfg
定义ganglia-service模板
2.5定义硬盘和内存service
编辑/usr/local/nagios/etc/services.cfg
检测各个机器的硬盘,当小于30G的时候,报警
检测各个机器的内存,当小于30000K时,报警
至此,各个机器的内存和硬盘已经监控起来,数据的来源当然是ganglia采集的
2.6 load的监控
load的监控有个问题,16核的机器和4核的机器报警阀值不一样。
这样的话,得在/usr/local/nagios/etc/templates.cfg中定义load16,load8,load4这样的service模板,各个机器根据自己的cpu配置,决定引用哪个模板
下面是在/usr/local/nagios/etc/templates.cfg中增加的内容:
下面是/usr/local/nagios/etc/services.cfg中配置load的实例(每台机器都需要配置):
配置成功后,重启nagios,每台机器的内存,硬盘,load全部监控了起来(如下图所示)