[关闭]
@cdmonkey 2015-04-30T03:03:24.000000Z 字数 4099 阅读 1140

Nagios(3)开发自定义插件

Nagios


一、系统自带的插件

1. 被动模式

如果是被动模式(即通过NRPE的监控方式),则首先要在被监控端对插件进行确认与定义。

  1. #首先检查客户端的『nrpe.cfg』文件中已经定义了那些监控指令:
  2. [root@WEB-A1 ~]# vim /usr/local/nagios/etc/nrpe.cfg
  3. command[check_load]=/usr/local/nagios/libexec/check_load -w 15,10,6 -c 30,25,20
  4. command[check_mem]=/usr/local/nagios/libexec/check_memory.pl -w 6% -c 3%
  5. command[check_disk]=/usr/local/nagios/libexec/check_disk -w 20% -c 8% -p /
  6. command[check_swap]=/usr/local/nagios/libexec/check_swap -w 20% -c 10%
  7. command[check_iostat]=/usr/local/nagios/libexec/check_iostat -w 6 -c 10
  8. #首先查看系统自带的插件:
  9. [root@WEB-A1 ~]# ll /usr/local/nagios/libexec/
  10. ...
  11. -rwxr-xr-x 1 root root 103176 Dec 7 22:25 check_ssh
  12. -rwxr-xr-x 1 root root 108558 Dec 7 22:25 check_swap
  13. -rwxr-xr-x 1 root root 105198 Dec 7 22:25 check_time
  14. ...

其次,要在服务端添加服务及命令的定义:

  1. #定义所要监控的项目(服务):
  2. [root@Nagios ~]# vim /usr/local/nagios/etc/objects/services.cfg
  3. define service {
  4. use generic-service
  5. host_name WEB-A1,WEB-A2
  6. service_description Check Memory
  7. check_command check_nrpe!check_mem
  8. }
  9. --------------------------
  10. #定义监控项目中使用到的命令:
  11. [root@Nagios ~]# vim /usr/local/nagios/etc/objects/commands.cfg
  12. define command{
  13. command_name check_nrpe
  14. command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
  15. }

2. 主动模式

即增加从Nagios服务器端发起的监控,例如对URL地址、端口的监控等。这类被监控对象一般都属于向外部提供服务的业务。对这样的业务,我们一般采取主动监控模式。这种模式无需通过NRPE,而完全由Nagios服务端主动发起监控,进而直接获取到监控信息。

  1. #我们通过在服务端执行指令来检测客户端的80端口:
  2. [root@Nagios libexec]# ./check_tcp -H 172.16.1.10 -p 80
  3. TCP OK - 0.006 second response time on port 80|time=0.005889s;;;0.000000;10.000000
  4. #也可以监控Web服务:
  5. [root@Nagios libexec]# ./check_http -I 172.16.1.10
  6. HTTP OK: HTTP/1.1 200 OK - 360 bytes in 0.082 second response time |time=0.082371s;;;0.000000 size=360B;;;0

下面对站点的URL进行正式的监控。首先是定义相应的监控服务,对于服务的定义可以在services.cfg中进行配置,也可以在我们之前定义的配置目录中新建配置文件(以.cfg结尾的文件),然后进行配置。

  1. #无论是主动监控还是被动监控,我们首先都要定义服务(监控的对象)。
  2. [root@Nagios ~]# cd /usr/local/nagios/etc/services/
  3. [root@Nagios services]# vim web.cfg
  4. define service{
  5. use generic-service
  6. host_name WEB-A1
  7. service_description Check Web URL
  8. check_command check_weburl!-I 172.16.1.10
  9. #注意,既然是主动模式,在配置指令时就要指定具体的监控目标。
  10. max_check_attempts 3
  11. normal_check_interval 2
  12. retry_check_interval 1
  13. check_period 24x7
  14. notification_interval 30
  15. notification_period 24x7
  16. notification_options w,u,c,r
  17. contact_groups admins
  18. }

其次,我们要对监控指令check_weburl进行定义。

  1. [root@Nagios services]# vim ../objects/commands.cfg
  2. #添加下面的指令定义内容:
  3. define command{
  4. command_name check_weburl
  5. command_line $USER1$/check_http $ARG1$ -w 10 -c 30
  6. }
  7. ---------------------
  8. #当然这里也可以使用系统预定义的指令,都是可以的。
  9. define command{
  10. command_name check_http
  11. command_line $USER1$/check_http -I $HOSTADDRESS$ $ARG1$
  12. }

最后检查语法并重新加载配置文件。

  1. [root@Nagios services]# /etc/init.d/nagios checkconfig
  2. Total Warnings: 0
  3. Total Errors: 0
  4. Things look okay - No serious problems were detected during the pre-flight check
  5. OK.
  6. [root@Nagios services]# /etc/init.d/nagios reload
  7. Running configuration check...done.
  8. Reloading nagios configuration...done
  9. #至此主动监控模式配置完成。

主动监控模式的配置过程:

① 在服务端的命令行把要监控的命令调试好。
② 在commands.cfg文件里定义Nagios命令,同时调用命令行的插件。
③ 在服务的配置文件里定义要监控的服务,调用commands.cfg里定义的监控指令。

二、自行开发的插件

Nagios插件程序中需要调用监控服务规定的操作序列,并根据预先定义的规则,对返回结果进行分析,判断服务的当前状态,并以指定的状态码退出程序,同时将对该状态的说明不换行输出到控制台。Nagios的插件可以用脚本(Shell和Perl)C编译后的可执行程序,但必须满足以下两件事:

此处输入图片的描述

一、监控Web服务客户端插件

1、被动方式

首先要在客户端编写插件,并进行定义。
第一步:编写插件脚本

  1. [root@WEB-A1 ~]# cat /usr/local/nagios/libexec/check_www
  2. #!/bin/sh
  3. status=`curl -I -s 172.16.1.10|grep HTTP`
  4. code=`$status|awk '{print $2}'`
  5. if [[ $code -eq 200 ]]
  6. then
  7. echo "The HTTP service is running, and the Web is OK!"
  8. exit 0
  9. elif [ -z $code ]
  10. then
  11. echo "The HTTP service is down!"
  12. exit 2
  13. else
  14. echo "The HTTP service is running, but $status"
  15. exit 2
  16. fi
  17. --------------------------
  18. #上面脚本的问题:首先,取到站点的首页的HTTP状态码的方法笨拙,一条curl指令就完全可以搞定。
  19. [root@WEB-A1 ~]# code=`curl -I -o /dev/null -w%{http_code} -s 172.16.1.10`
  20. [root@WEB-A1 ~]# echo $code
  21. 200
  22. #其次,对于状态码的判断不合理,类似301这类的状态码不该归为错误类。

第二步:赋予插件可执行权限

  1. [root@WEB-A1 ~]# chmod +x /usr/local/nagios/libexec/check_www

第三步:定义插件

  1. [root@WEB-A1 ~]# vim /usr/local/nagios/etc/nrpe.cfg
  2. command[check_www]=/usr/local/nagios/libexec/check_www

第四步:重启NRPE服务

在服务端应该首先在命令行中对命令进行测试,测试正常后执行下面的操作:
第一步:定义服务

  1. [root@Monitor ~]# vim /usr/local/nagios/etc/objects/services.cfg
  2. define service {
  3. use generic-service
  4. host_name WEB-A1
  5. service_description Check Web
  6. check_command check_nrpe!check_www
  7. }

第二步:验证配置文件后重启Nagios服务

  1. [root@Monitor ~]# /etc/init.d/nagios checkconfig
  2. [root@Monitor ~]# /etc/init.d/nagios restart
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注