当前位置:   article > 正文

nagios详解

nagios
  1. 目录
  2. 1 NAGIOS介绍
  3. 1.1 NAGIOS的简介
  4. 1.2 NAGIOS的工作原理
  5. 2 NAGIOS搭建
  6. 2.1 基础安装
  7. 2.2 NAGIOS安装
  8. 2.3 APACHE配置
  9. 2.4 带安全认证的配置
  10. 2.5 NAGIOS汉化
  11. 3 NAGIOS配置
  12. 3.1 配置简介
  13. 3.2 定义检查时间段
  14. 3.3 定义联系人
  15. 3.4 定义宏及命令
  16. 3.5 定义HOST及HOST组
  17. 3.6 定义服务及服务组
  18. 3.7 综合
  19. 4 远程监控
  20. 4.1 使用NRPE做NAGIOS主动监控
  21. 4.1.1 NRPE安装
  22. 4.1.2 NRPE使用
  23. 4.2 使用NSCA做NAGIOS被动监控
  24. 4.2.1 NSCA安装
  25. 4.2.2 NSCA使用
  26. 4.3 NSCP使用
  27. 5 NAGIOS插件扩展
  28. 6 报警方式扩展支持
  29. 7 数据存储
  30. 7.1 文件存储
  31. 7.2 Ndoutils
  32. 7.2.1 Ndoutils安装
  33. 7.2.2 Ndoutils表说明
  34. 8 管理NAGIOS的配置文件
  35. 9 图表

1 Nagios介绍

1.1 nagios的简介

Nagios是一款开源的电脑系统和网络监视工具,能有效监控Windows、Linux和Unix的主机状态,在系统或服务状态异常时发出邮件或短信报警第一时间通知网站运维人员,在状态恢复后发出正常的邮件或短信通知。

主要特点

Nagios 是采用分布-集中的管理模式。在Nagios服务器上安装Nagios 主程序和插件程序,在被监控主机上安装Nagios 代理程序。通过Nagios 主程序和Nagios 代理程序之间的通讯,监视对象的状态。

  • 1) 能够监控网络服务和主机资源(SMTP、POP3、HTTP、FTP、SSH 、CPU load、disk usage、system logs)
  • 2) 允许用户开发简单的自己需要的检查服务,支持很多开发语言(shell scripts、C++、Perl、ruby、Python、PHP、C#等),可以指定自己编写的Plugin通过网络收集数据来监控任何情况(温度、警告……)
  • 3) 可以通过配置Nagios远程执行插件远程执行脚本,事先定义事件处理程序, 当对象出现问题时,自动调用对应的处理程序;
  • 4) 可并行服务检查
  • 5) 可以支持并实现对主机的冗余监控
  • 6) 自动日志循环
  • 7) 包括Web界面可以查看当前网络状态,通知,问题历史,日志文件等

1.2 nagios的工作原理

Nagios的功能是监控服务和主机,但是他自身并不包括这部分功能,所有的监控、检测功能都是通过各种插件来完成的。

1) 启动Nagios后,它会周期性的自动调用插件去检测服务器状态,同时Nagios会维持一个队列, Nagios 执行安装在它里面的check_nrpe 插件,并告诉check_nrpe 去检测哪些服务;

2) 通过SSL,check_ nrpe 连接远端机子上的NRPE daemon;

3) NRPE 运行本地的各种插件去检测本地的服务和状态( check_disk,check_load 等) ,利用这些插件可以方便的监控很多服务状态,check_disk是检查磁盘空间的插件,check_load是检查CPU负载的,等等。每一个插件可以通过运行./check_xxx –h 来查看其使用方法和功能;

4) 最后,NRPE 把检测的结果传给主机端的check_nrpe,check_nrpe 再把结果送到Nagios 状态队列中,所有插件返回来的状态信息都进入队列; 5) Nagios每次都从队首开始读取信息,并进行处理后,把状态结果通过web显示出来。   Nagios可以识别4种状态返回信息,即 0(OK)表示状态正常/绿色、1(WARNING)表示出现警告/黄色、2(CRITICAL)表示出现非常严重的错误/红色、3(UNKNOWN)表示未知错误/深黄色。Nagios根据插件返回来的值,来判断监控对象的状态,并通过web显示出来,以供管理员及时发现故障。

2 Nagios搭建

2.1 基础安装

Nagios用C/C++完成.在安装的时候需要编译.Nagios提供了一个Web的管理页面.页面部分用PHP实现.同时Nagios的很多脚本都是由CGI实现.所以WEB服务器也必须支持CGI.以便于在远程执行相关的命令.

  1. rpm -q gcc glibc glibc-common gd gd-devel xinetd openssl-devel libxml2 libxml2-devel
  2. gcc-4.1.2-54.el5
  3. glibc-2.5-107.el5_9.5
  4. glibc-common-2.5-107.el5_9.5
  5. gd-2.0.33-9.4.el5_4.2
  6. package gd-devel is not installed
  7. package xinetd is not installed
  8. openssl-devel-0.9.8e-26.el5_9.1

安装前需要先检查基本环境是否满足,如果发现有没有安装的依赖包.则需要单独的进行安装.安装使用yum即可

yum install xinetd gd-devel libxml2 libxml2-devel

安装好基本的运行环境后.就可以开始搭建Web环境.这里的Web容器选用Apache.执行下面代码,完成Apache以及PHP的安装.两段脚本都在/usr/local下执行

  1. wget http://archive.apache.org/dist/httpd/httpd-2.2.23.tar.gz
  2. tar zxvf httpd-2.2.23.tar.gz
  3. cd httpd-2.2.23
  4. ./configure --prefix=/usr/local/apache2
  5. make && make install
  6. mkdir /usr/local/php
  7. wget http://cn2.php.net/distributions/php-5.4.10.tar.gz
  8. tar zxvf php-5.4.10.tar.gz
  9. cd php-5.4.10
  10. ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs
  11. make && make install

安装Mysql[用于持久化存储,可视化配置等功能]. 安装Mysql的时候先确认下是否已经安装了..如果没有则运行yum安装. rpm -q mysql mysql-devel mysql-server yum install mysql mysql-devel mysql-server

安装好以后需要简单的配置下Mysql.确认old_passwords=0的值是不是0.如果不是,则修改为0

  1. [root@localhost mysql]# vim /etc/my.cnf
  2. [mysqld]
  3. datadir=/var/lib/mysql
  4. socket=/var/lib/mysql/mysql.sock
  5. user=mysql
  6. # Default to using old password format for compatibility with mysql 3.x
  7. # clients (those using the mysqlclient10 compatibility package).
  8. old_passwords=0
  9. # Disabling symbolic-links is recommended to prevent assorted security risks;
  10. # to do so, uncomment this line:
  11. # symbolic-links=0
  12. [mysqld_safe]
  13. log-error=/var/log/mysqld.log
  14. pid-file=/var/run/mysqld/mysqld.pid

重启mysql服务即可 service mysqld restart

2.2 Nagios安装

在完成Nagios的基本环境安装后,即可开始编译安装Nagios.执行目录依然是/usr/local.Nagios在启动的时候会使用一个叫Nagios的账号.所以第一步我们需要创建这个账号并且赋给他必要的执行权限. 添加用户

  1. useradd -s /sbin/nologin nagios
  2. mkdir /usr/local/nagios
  3. chown -R nagios.nagios /usr/local/nagios

安装Nagios

  1. wget http://hivelocity.dl.sourceforge.net/project/nagios/nagios-4.x/nagios-4.0.0/nagios-4.0.0.tar.gz
  2. tar zxvf nagios-4.0.0.tar.gz
  3. cd nagios
  4. ./configure --prefix=/usr/local/nagios
  5. make all
  6. make install
  7. make install-init
  8. make install-config
  9. make install-commandmode

make install说明:

第一步执行make install安装主要的程序、CGI及HTML文件
第二步执行make install-init的步骤,它的作用是把nagios做成一个运行脚本,使nagios随系统开机启动
第三步执行 make install-config 把配置文件的例子复制到nagios的安装目录。
第四步执行 make install-commandmode 给外部命令访问nagios配置文件的权限。

检查是否安装成功

安装完后 查看一下在/usr/local/nagios下是否存在etc、bin、 sbin、 share、 var这五个目录,如果存在则可以表明程序被正确的安装到系统了。这5个目录的作用是:

  1. Bin Nagios执行程序所在目录,这个目录只有一个文件nagios
  2. Etc Nagios配置文件位置,初始安装完后,只有几个*.cfg-sample文件
  3. Sbin Nagios Cgi文件所在目录,也就是执行外部命令所需文件所在的目录
  4. Share Nagios网页文件所在的目录
  5. Var Nagios日志文件、spid 等文件所在的目录

2.3 Apache配置

Nagios在刚创建的时候不具备任何的插件.Nagios的各项的监控主要是依靠插件完成.所以我们在启动Nagios之前. 需要先安装Nagios的插件.在/usr/local下

  1. wget https://www.nagios-plugins.org/download/nagios-plugins-1.5.tar.gz
  2. tar zxvf nagios-plugins-1.5.tar.gz
  3. cd nagios-plugins-1.5
  4. ./configure --prefix=/usr/local/nagios
  5. make && make install

插件安装完成后可以去/usr/local/nagios/libexec路径下确认插件是不是已经安装完毕

插件安装完成后开始配置Apache服务器.以便可以使用浏览器来访问Nagios.

Apache配置主要集中在httpd.conf文件内.通常需要配置的参数包括使用的用户组.扩展PHP功能,以及制定Nagios的目录等.具体的操作如下.

  1. vi /usr/local/apache2/conf/httpd.conf
  2. 找到
  3. User daemon
  4. Group daemon
  5. 修改为
  6. User nagios
  7. Group nagios
  8. 然后找到
  9. <IfModule dir_module>
  10.   DirectoryIndex index.html
  11. </IfModule>
  12. 修改为
  13. <IfModule dir_module>
  14.   DirectoryIndex index.html index.php
  15. </IfModule>

接着增加如下内容:

  1. AddType application/x-httpd-php .php
  2. ScriptAlias /nagios/cgi-bin "/usr/local/nagios/sbin"
  3. <Directory "/usr/local/nagios/sbin">
  4. Allow from all
  5. </Directory>
  6. Alias /nagios "/usr/local/nagios/share"
  7. <Directory "/usr/local/nagios/share">
  8. Allow from all
  9. </Directory>

至此.nagios的安装已经基本完成.我们可以启动Nagios来确认下.

  1. /usr/local/apache2/bin/apachectl start
  2. 访问http://<IP>/nagios

这时只是启动了Nagios的Web容器.而Nagios本身实际上是没有启动的.启动Nagios需要执行.Service Nagios start

nagiosrun.png

安装可能问题

nagios web界面提示
It appears as though you do not have permission to view information for any of the services you requested...
打开cgi.cfg配置文件,里面有个参数:
use_authentication=1
为了保障系统的安全性,nagios设置了这个参数,默认为1,改为0即可。

2.4 带安全认证的配置

在上个配置方案中.我们将use_authentication修改为0.这样任何人都可以访问nagios服务器.为了安全性考虑.在这种模式下.nagios不允许用户远程对nagios进行操作.如修改服务的某项状态,重启nagios服务器等.这时.我们就不得不开启use_authentication选项.具体的做法如下.

在apache的配置文件中.对于web地址的访问控制的写法如下

  1. vi /usr/local/apache2/conf/httpd.conf
  2. #setting for nagios
  3. ScriptAlias /nagios/cgi-bin "/usr/local/nagios/sbin"
  4. <Directory "/usr/local/nagios/sbin">
  5. AuthType Basic
  6. Options ExecCGI
  7. AllowOverride None
  8. Order allow,deny
  9. Allow from all
  10. AuthName "Nagios Access"
  11. AuthUserFile /usr/local/nagios/etc/htpasswd //用于此目录访问身份验证的文件
  12. Require valid-user
  13. </Directory>
  14. Alias /nagios "/usr/local/nagios/share"
  15. <Directory "/usr/local/nagios/share">
  16. AuthType Basic
  17. Options None
  18. AllowOverride None
  19. Order allow,deny
  20. Allow from all
  21. AuthName "nagios Access"
  22. AuthUserFile /usr/local/nagios/etc/htpasswd
  23. Require valid-user
  24. </Directory>

设置好apache之后需要生成密钥.

  1. /usr/local/apache2/bin/htpasswd -c /usr/local/nagios/etc/htpasswd <你的账号>
  2. //输入密码
  3. //确认密码

最后在cgi.cfg配置文件中.给你的账号分配权限.

  1. authorized_for_system_information=nagiosadmin, <你的账号>
  2. authorized_for_configuration_information=nagiosadmin, <你的账号>
  3. authorized_for_system_commands= <你的账号>
  4. authorized_for_all_services=nagiosadmin, <你的账号>
  5. authorized_for_all_hosts=nagiosadmin, <你的账号>
  6. authorized_for_all_service_commands=nagiosadmin, <你的账号>
  7. authorized_for_all_host_commands=nagiosadmin, <你的账号>

这时重启apache服务器.再次登录nagios的时候就需要输入账号密码了,而同时,也可以使用web页面来管理nagios服务

2.5 Nagios汉化

Nagios软件功能强大,而且在开源的世界里有很好口碑,但它有一个不足:对中文的支持不好,不管是界面菜单还是里面安装操作提示,没有多少可以提供中文支持,这意味着使用者必须熟悉英文。国内有Nagios的爱好者为了解决这一问题.为Nagios提供了中文版.安装Nagios中文版的过程如下:

注意:汉化后命令将不能使用,如重启服务,修改监控的参数等.为了解决这个问题.可以在安装汉化前备份/usr/local/nagios/sbin/cmd.cgi文件.并在汉化结束后用备份的文件覆盖汉化后的文件即可.

  1. wget http://softlayer-dal.dl.sourceforge.net/project/nagios-cn/sourcecode/zh_CN%203.2.3/nagios-cn-3.2.3.tar.bz2
  2. bzip2 -d nagios-cn-3.2.3.tar.bz2
  3. tar xvf nagios-cn-3.2.3.tar
  4. cd nagios-cn-3.2.3
  5. ./configure --prefix=/usr/local/nagios
  6. make all
  7. make install

由于汉化是由国内的爱好者提供.所以Nagios的汉化只支持3.2.3版本.在Nagios4.0安装好后再安装汉化插件.有些参数是不能被识别的.在编者安装的测试机器上.分别为nagios.cfg的第307,1022,1306行.在执行安装时.可以先尝试启动Nagios.这时如果配置文件不当.Nagios会提示错误信息.依据错误信息修改配置文件即可

最后Nagios汉化后的结果如下:

cnagiosrun.png

3 Nagios配置

3.1 配置简介

Nagios 安装完毕后,默认的配置文件在/usr/local/nagios/etc目录下。Nagios所有的管理都可以通过配置文件来进行设置.默认的配置文件如下.
在配置文件修改完成后.可以使用/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/ nagios.cfg来验证配置文件是否正确.如果配置有误.该工具会准确的提示错误的文件及行号.

配置文件 说明

  1. cgi.cfg 控制 CGI 访问的配置文件
  2. nagios.cfg Nagios 主配置文件
  3. resource.cfg 变量定义文件,又称为资源文件,在此文件中定义变量,以便由其他配置文件引用,如$USER1$
  4. objects objects 是一个目录,在此目录下有很多配置文件模板,用于定义 Nagios 对象
  5. objects/commands.cfg 命令定义配置文件,其中定义的命令可以被其他配置文件引用
  6. objects/contacts.cfg 定义联系人和联系人组的配置文件
  7. objects/localhost.cfg 定义监控本地主机的配置文件
  8. objects/printer.cfg 定义监控打印机的一个配置文件模板,默认没有启用此文件
  9. objects/switch.cfg 监控路由器的一个配置文件模板,默认没有启用此文件
  10. objects/templates.cfg 定义主机和服务的一个模板配置文件,可以在其他配置文件中引用
  11. objects/timeperiods.cfg 定义 Nagios 监控时间段的配置文件
  12. objects/windows.cfg 监控 Windows 主机的一个配置文件模板,默认没有启用此文件
  13. 备注: Nagios 在配置方面非常灵活,默认的配置文件并不是必需的。可以使用这些默认的配置文件,也可以创建自己的配置文件,然后在主配置文件 nagios.cfg 中引用即可。

3.2 定义检查时间段

定义检查时间段,检查时间段被用于指定Nagios的监控主机或者是Nagios的监控服务在什么情况下工作.通常他的目录在objects/ timeperiods.cfg

  1. define timeperiod{
  2. timeperiod_name 24x7 #名称
  3. alias 24 Hours A Day, 7 Days A Week #别名
  4. sunday 00:00-24:00 #监控范围
  5. monday 00:00-24:00
  6. tuesday 00:00-24:00
  7. wednesday 00:00-24:00
  8. thursday 00:00-24:00
  9. friday 00:00-24:00
  10. saturday 00:00-24:00
  11. }

3.3 定义联系人

联系人,联系人组 用来定义通知时的接受人.这里可以定义接受方式.联系人一般的定义文件为obejcts/contacts.cfg

  1. define contact{
  2. contact_name 联系人的名称
  3. alias 联系人别名
  4. contactgroups 联系人的组名称//这里不是加入组 而是引用组
  5. host_notifications_enabled [0/1]是否发送主机通知
  6. service_notifications_enabled [0/1]是否发送服务通知
  7. host_notification_period 主机通知时间段
  8. service_notification_period 服务通知时间段
  9. host_notification_options [d,u,r,n]定义哪些状态下可以发送
  10. service_notification_options [w,u,c,r,n] 定义哪些状态下可以发送
  11. host_notification_commands 需要通知时的发送命令
  12. service_notification_commands 需要通知时的发送命令
  13. email 定义收件人的邮件地址$CONTACTEMAIL$
  14. pager 寻呼机?
  15. addressx 定义通讯地址,手机等$CONTACTADDRESSx$
  16. retain_status_information [0/1]是否允许状态信息保留
  17. retain_nonstatus_information [0/1]是否允许非状态信息保留
  18. }
  19. define contactgroup{
  20. contactgroup_name 组名
  21. alias 组别名
  22. members 将联系人加入该组
  23. contactgroup_members 将分组加入该组
  24. }

3.4 定义宏及命令

宏包括系统定义的以及自己定义的.系统宏包括$HOSTADDRESS$,$ARGn$等.其中系统定义的宏可以在这里找到.命令的通常文件是objects/ commands.cfg.
如果想使用自己定义的宏.如$USER1$.则可以编辑resource.cfg文件.以$宏名称$的形式来定义自己所需要的宏

定义命令

定义命令.定义命令用于指定 主机/服务监控, 主机/服务通知 主机/服务时间处理句柄等.在Nagios中.可以使用宏.

  1. define command{
  2. command_name 命令名称
  3. command_line 命令行.这里指定执行命令的完整路径及参数.可以使用宏,
  4. }

3.5 定义Host及Host组

Host以及host组主要用来描述需要监控的物理主机,工作站,设备等.详细的配置参数如下.host的一般定义文件为 objects/hosts.cfg

  1. define host{
  2. host_name 主机名, $HOSTNAME$使用的是这个字段
  3. alias 别名$HOSTALIAS$使用了这个字段
  4. display_name 显示名称
  5. address IP地址
  6. hostgroups Host所在的主机组 以逗号分割
  7. check_command 指定检查主机的命令
  8. max_check_attempts 对主机最大的检查次数.如果不想检查主机是否存活check_command留空. max_check_attempts这个值最少是1用于表示检查到几次异常报警
  9. check_interval 检查时间间隔.单位是分钟
  10. retry_interval 重试次数.发现异常后多久重试一次,触发到重试上限后发送异常报警 单位是分钟
  11. active_checks_enabled [0/1] 是否启用主动监控
  12. passive_checks_enabled [0/1] 是否启动被动监控
  13. check_period 定义需要检查的时间段.需要在时间段文档中定义
  14. event_handler 自定义事件处理程序.(主机UP/Down是生效)
  15. event_handler_enabled [0/1]是否启动事件处理程序
  16. process_perf_data [0/1] 设定启用进程性能数据记录
  17. retain_status_information [0/1] 设定启用状态信息保存功能。当Nagios重新启动的时候不会是空数据,而是先显示上次离线时最后保留的状态数据。
  18. retain_nonstatus_information [0/1] 设定启用非状态信息保存功能。当Nagios重新启动的时候不会是空数据,而是先显示上次离线时最后保留的非状态数据。
  19. contacts 通知人
  20. contact_groups 通知组
  21. notification_interval 主机在故障后 再次发送通知的间隔时间
  22. first_notification_delay 主机故障后 第一次发送时间的延迟
  23. notification_period 主机故障时发送通知的时间范围
  24. notification_options [d,u,r] d代表down奔溃;u代表不可达 r代表recover恢复
  25. notifications_enabled [0/1] 是否发送通知
  26. register 0 表示是一个模板
  27. use generic-host #use 表示引用
  28. }
  29. define hostgroup{
  30. hostgroup_name Host组名
  31. alias 组别名
  32. members 填写已经声明的host 将host引入该组,以逗号分隔
  33. hostgroup_members 填写已经声明的组 引入子组
  34. notes 说明 用于界面显示
  35. }

3.6 定义服务及服务组

服务表示需要主机上运行的服务有哪些.这里的服务可以用来表示像POP,HTTP等协议.可以用来表示ping,连接数等系统参数.也可以表示在主机上运行的任务.是一个很宽泛的概念.服务一般所在文件为objects/services.cfg

  1. define service{
  2. host_name 主机名,这里指定的是host的名字 多个host之前用,隔开
  3. hostgroup_name 组名.监控主机组上的所有服务.通常host_name和group只指定一个
  4. service_description 服务的描述信息
  5. display_name 服务的显示名称
  6. parents 服务依赖 很少使用到
  7. servicegroups 指定多个服务组 使多个服务组使用相同配置
  8. check_command 用于检查这个服务的命令
  9. max_check_attempts 重试次数
  10. check_interval 检查间隔
  11. retry_interval 重试间隔
  12. active_checks_enabled 主动监控
  13. passive_checks_enabled 被动监控
  14. check_period 监控的时间范围
  15. event_handler 自定义事件处理
  16. event_handler_enabled 启用事件处理
  17. process_perf_data [0/1] 记录性能参数
  18. retain_status_information [0/1] 设定启用状态信息保存功能。当Nagios重新启动的时候不会是空数据,而是先显示上次离线时最后保留的状态数据。
  19. retain_nonstatus_information [0/1] 设定启用非状态信息保存功能。当Nagios重新启动的时候不会是空数据,而是先显示上次离线时最后保留的非状态数据。
  20. notification_interval 主机在故障后 再次发送通知的间隔时间
  21. first_notification_delay 通知延迟
  22. notification_period 主机故障时发送通知的时间范围
  23. notification_options [w,u,c,r,] w代表warning告警 u代表unknown未知 c代表critical严重 r代表recover恢复 d代表down奔溃
  24. notifications_enabled [0/1] 是否通知
  25. contacts 联系人
  26. contact_groups 联系人组
  27. }
  28. define servicegroup{
  29. servicegroup_name 服务组名称
  30. alias 服务组名称
  31. members 将服务加到服务组内
  32. servicegroup_members 将服务组加到服务组内,子组
  33. notes 说明 用于界面展示
  34. }

服务组将已经定义的主机和主机的服务放到一起.主要是用于生成报表.比如运行某一服务的所有机器一周内的情况等.
Members的写法是 主机,服务,主机2,服务2这种
服务没有名称,以描述信息来查找

3.7 综合

上面讲述了Nagios的主要的配置参数.以及其所在的配置文件.由于Nagios的配置参数繁多.所以Nagios还支持templates.cfg.配置模板.配置模板内的所有的对象可以被继承.继承使用use字段.如 use locate_host 继承后如果在重新定义模板内存在的值,nagios会以自己定义的值为准.

加载自己的配置文件.nagios可以加载自己的配置文件.做法是在nagios.cfg内使用形如cfg_file=/usr/local/nagios/etc/objects/commands.cfg的格式来加载自己的配置文件.

在配置文件修改完成后.可以使用
/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
来验证配置文件是否正确

4 远程监控

nrpe.png

如图所示.Nagios是可以支持分布式监控的.器分布式监控主要依赖于四个组件.
NSCA是Nagios的被动监控插件
NRPE是Nagios的主动插件.这两个插件组合在一起,实现了Nagios的分布式监控
NSClient++是Nagios的Window平台的插件.该插件功能不可扩展
NDOUtils是Nagios将数据持久化到Mysql等数据库中的工具
SNMP是网络协议.可以用于监听路由,交换机等网络设备是否正常

4.1 使用NRPE做Nagios主动监控

4.1.1 NRPE安装

checknrpe.png

NRPE做Nagios的主动监控流程大体上如上图所示.Nagios会依据设置定期的调用check_nrpe插件.check_nrpe则通过网络(未验证是不是ssl)来调用NRPE.远程机器上的NRPE获取到请求后.调用本地插件来获取需要监控的信息.最后监控信息再通过NRPE返回到Nagios上并显示.

NRPE的安装和使用要分为监控机和被监控机2方面来进行.

在被监控机上安装NRPE的插件

检查安装需要的依赖包

rpm -q gcc glibc glibc-common gd gd-devel xinetd openssl-devel libxml2 libxml2-devel

使用yum来安装好所有缺少的包,如

yum install xinetd gd-devel libxml2 libxml2-devel

增加nagios插件运行时需要的账号及必要权限

  1. useradd -s /sbin/nologin nagios
  2. mkdir /usr/local/nagios
  3. chown -R nagios.nagios /usr/local/nagios

下载并安装插件

  1. wget https://www.nagios-plugins.org/download/nagios-plugins-1.5.tar.gz
  2. tar zxvf nagios-plugins-1.5.tar.gz
  3. cd nagios-plugins-1.5
  4. ./configure --prefix=/usr/local/nagios
  5. make && make install

修改目录权限并复制插件

  1. chown nagios.nagios /usr/local/nagios
  2. chown -R nagios.nagios /usr/local/nagios/libexec

下载NRPE并安装.在/usr/locate下

  1. wget http://prdownloads.sourceforge.net/sourceforge/nagios/nrpe-2.13.tar.gz
  2. tar zxvf nrpe-2.13.tar.gz
  3. cd nrpe-2.13
  4. ./configure
  5. make all

安装NRPE的守护进程,配置文件以及xinetd服务等. Xinetd是运行NRPE守护进程必要的组件.

  1. make install-daemon
  2. make install-daemon-config
  3. make install-xinetd

在nrpe刚刚安装好后.默认不运行任何外部的主机访问.这时候需要修改/etc/xinetd.d/nrpe文件, 在only_form上添加允许监控的主机.如

only_from       = 127.0.0.1 192.168.39.250

修改/etc/services文件.为Nrpe添加一个端口.如

nrpe            5666/tcp                        #NRPE

测试NRPE是否安装完成.

  1. service xinetd restart
  2. [root@localhost etc]# /usr/local/nagios/libexec/check_nrpe -H 127.0.0.1
  3. NRPE v2.13

这里能返回端口号则表示NRPE服务可以正常的使用了

在监控端

在监控端安装NRPE很简单.这里假设Nagios已经安装完毕.我们只需要扩展NRPE即可.扩展NRPE执行以下命令即可

  1. wget http://prdownloads.sourceforge.net/sourceforge/nagios/nrpe-2.13.tar.gz
  2. tar zxvf nrpe-2.13.tar.gz
  3. cd nrpe-2.13
  4. ./configure
  5. make all
  6. make install-plugin

同样.我们可以来验证是否可以访问远程的nrpe服务

  1. [root@localhost nrpe-2.13]# /usr/local/nagios/libexec/check_nrpe -H 192.168.39.251
  2. NRPE v2.13
4.1.2 NRPE使用

由nrpe的关系图可以看到,NRPE实际上是使用check_nrpe来远程调用NRPE,然后再由NRPE调用本地的插件.所以使用NRPE也分为2步.一部分是在监控机配置.用于加载定义NRPE要监测的服务.另一部分是在被监控机配置.主要定义监控的命令.具体操作如下

配置监控主机

在监控主机上的配置与前文配置明细相符.

定义NRPE插件所在的远程机器(Host组).

  1. [root@localhost bin]# vi /usr/local/nagios/etc/objects/hosts.cfg
  2. define host{
  3. use linux-server
  4. host_name SolrServer
  5. alias 192.168.39.251
  6. address 192.168.39.251
  7. }
  8. #定义一个主机组
  9. define hostgroup{
  10. hostgroup_name bsmart-servers
  11. alias bsmart servers
  12. members SolrServer
  13. }

定义NRPE插件需要使用的命令

  1. vi /usr/local/nagios/etc/objects/commands.cfg
  2. define command{
  3. command_name check_nrpe
  4. command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
  5. }

定义NRPE插件所需要监控的服务

  1. [root@localhost bin]# vi /usr/local/nagios/etc/objects/services.cfg
  2. define service{
  3. use local-service
  4. host_name SolrServer
  5. service_description checkSolr
  6. check_command check_nrpe!check_solr
  7. }

重启nagios以加载配置

/etc/init.d/nagios restart

配置被监控主机

在被监控主机上配置需要监控的命令

  1. [root@localhost etc]# vi /usr/local/nagios/etc/nrpe.cfg
  2. 追加..
  3. command[check_solr]=java -jar /usr/local/nagios/myPlugin/check_solr.jar -W solr -p 8080

command 括号内的checksolr即checknrpe插件!后面的值

重启xinetd服务以加载配置
service xinetd restart

可以看到

checksolr.png

4.2 使用NSCA做Nagios被动监控

4.2.1 NSCA安装

checknsca.png

NSCA做Nagios的被动监控流程大体上如上图所示.可以说和NRPE的执行流程刚好相反.Nagios依赖于NSCA接受被监控机器主动传来消息.调用顺序为插件主动的监控服务.得到监控状态后使用send_nsca模块将插件状态返回给NSCA.Nagios再读取NSCA生成的外部文件获得被监控服务状态.

NSCA的安装也分为2步.其监听服务器在Nagios机器上.而发送脚本则安装在被监控机器上

监控主机

在Nagios已经安装完成后.使用如下命令下载并安装NSCA

  1. wget http://nchc.dl.sourceforge.net/sourceforge/nagios/nsca-2.7.2.tar.gz
  2. tar zxvf nsca-2.7.2.tar.gz
  3. cd nsca-2.7.2
  4. ./configure
  5. make all
  6. cp src/nsca /usr/local/nagios/bin/
  7. cp src/ send_nsca /usr/local/nagios/bin/
  8. cp sample-config/nsca.cfg /usr/local/nagios/etc/
  9. cp sample-config/send_nsca.cfg /usr/local/nagios/etc/
  10. cp sample-config/nsca.xinetd /etc/xinetd.d/nsca
  11. chomd 777 /usr/local/nagios/etc/

修改/etc/services文件.为NSCA添加一个端口.如

nsca            5667/tcp                        #NRPE

也要修改only_from增加需要允许访问的地址

启动service xinetd start

被监控主机

被监控主机上安装NSCA很简单.只需要执行这段脚本即可.无需安装其他的服务

  1. wget http://nchc.dl.sourceforge.net/sourceforge/nagios/nsca-2.7.2.tar.gz
  2. tar zxvf nsca-2.7.2.tar.gz
  3. cd nsca-2.7.2
  4. ./configure
  5. make all
  6. cp src/nsca /usr/local/nagios/bin/
  7. cp src/ send_nsca /usr/local/nagios/bin/
  8. cp sample-config/nsca.cfg /usr/local/nagios/etc/
  9. cp sample-config/send_nsca.cfg /usr/local/nagios/etc/
  10. cp sample-config/nsca.xinetd /etc/xinetd.d/nsca
  11. chomd 777 /usr/local/nagios/etc/
4.2.2 NSCA使用

NSCA的使用主要是编辑监控机器上的配置文件,用来定义需要监控的各项参数.

监控主机

定义监控所需要的命令

  1. define command{
  2. command_name check_dummy
  3. command_line /usr/local/nagios/libexec/check_dummy $ARG1$
  4. }

定义监控所需要的服务

  1. [root@localhost ~]# vi /usr/local/nagios/etc/objects/services.cfg
  2. define service{
  3. use local-service
  4. host_name SolrServer
  5. service_description checkSolr
  6. check_command check_dummy!0
  7. active_checks_enabled 0
  8. passive_checks_enabled 1
  9. }

active_checks_enabled 0 关闭主动监控
passive_checks_enabled 1 打开被动监控

这里使用了之前定义的Host.则不再额外定义Host. 重启服务以加载配置

  1. service xinetd restart
  2. service nagios restart
客户机

客户机上可以直接测试.测试的方式就是使用send_nsca发送一个数据包即可.如果是插件内使用nsca.则可以使用类似的方式调用shell.

printf "SolrServer\tcheckSolr\t2\tJustTest\n" | /usr/local/nsca-2.7.2/src/send_nsca -H 192.168.39.250 -c /usr/local/nagios/etc/send_nsca.cfg

发送包解释 SolrServer host服务器名称,要和service host_name设置的一样 checkSolr 服务描述 要和service service_description一样 2 表示检测后的运行状态 JustTest 状态值的描述信息

格式一定要严格按照上述编写.否则nagios无法获取service的状态

  1. /usr/local/nsca-2.7.2/src/send_nsca 是发送脚本所在的位置
  2. -H 是nagios的主机地址
  3. -c 是脚本所在地址

Nasc的日志在/var/log/messages内

4.3 NSCP使用

checknscp.png

NSCP是由NSClient++发展而来的.NSClient++在3.9版本以后称为NSCP.NSCP主要的功能是做window平台下的监控.与NRPE和NSCA方式不同.在windows下的NSCP并不提供扩展功能.即只能监控NSCP所包含的服务.目前NSCP所包含的服务有CPU,内存,硬盘空间,进程等

NSCP的安装过程如下:

下载地址: http://nsclient.org/nscp/downloads ,直接下载下来的是msi包 。同windows下其他软件的安装一样,直接下一步下一步就好了。

在NSCP安装完毕后.在服务内可以看到nscpservice.png

这里选择启动NACP即可.

NACP在被监控机器上配置完成后需要配置Nagios服务器上的服务.与之前的nrpe的过程类似,在监控主机上做的就3件事情
1.安装监控windows的插件(已经默认安装了,check_nt)
2.定义命令
3.定义要监控的项目

定义命令

  1. vi /usr/local/nagios/etc/commands.cfg
  2. 增加下面的内容
  3. define command{
  4. command_name check_nt
  5. command_line $USER1$/check_nt -H $HOSTADDRESS$ -p 12489 -v $ARG1$ $ARG2$
  6. }

增加监控项目,NSCP可以配置的服务如下(除了check_command 其他和配置服务监控一样):

  1. 1)监控windows服务器运行的时间
  2. check_command check_nt!UPTIME
  3. 2)监控Windows服务器的CPU负载,如果5分钟超过80%则是warning,如果5分钟超过90%则是critical
  4. check_command check_nt!CPULOAD!-l 5,80,90
  5. 3)监控Windows服务器的内存使用情况,如果超过了80%则是warning,如果超过90%则是critical.
  6. check_command check_nt!MEMUSE!-w 80 -c 90
  7. 4)监控Windows服务器C:\盘的使用情况,如果超过80%已经使用则是warning,超过90%则是critical
  8. check_command check_nt!USEDDISKSPACE!-l c -w 80 -c 90
  9. 注:-l后面接的参数用来指定盘符
  10. 5)监控Windows服务器D:\盘的使用情况,如果超过80%已经使用则是warning,超过90%则是critical
  11. check_command check_nt!USEDDISKSPACE!-l d -w 80 -c 90
  12. 6)监控Windows服务器的W3SVC服务的状态,如果服务停止了,则是critical
  13. check_command check_nt!SERVICESTATE!-d SHOWALL -l W3SVC
  14. 7)监控Windows服务器的Explorer.exe进程的状态,如果进程停止了,则是critical
  15. check_command check_nt!PROCSTATE!-d SHOWALL -l Explorer.exe

5 Nagios插件扩展

正如前文所述一样,Nagios本身并不提供具体的监控功能.其所有的监控指标都是通过插件来扩展.如果Nagios的现有插件不满足我们自己的监控需求的情况下 ,我们可以自己编写插件来扩展Nagios.Nagios扩展插件的方式很简单.只需要遵守Nagios的插件协议即可

插件的协议

Nagios的插件是基于定时调用的.系统在按时的调用插件后.会检查插件的返回状态值以及打印的文本信息.插件的状态值标志插件检查的系统服务的状态.而打印的文本信息可以是对当前状态的描述.Nagio的状态值如下

  1. 插件返回值 服务状态 主机状态
  2. 0 正常(OK) 运行(UP)
  3. 1 告警(WARNING) 运行(UP)但是出现问题
  4. 2 紧急(CRITICAL) 宕机(DOWN)
  5. 3 未知(UNKNOWN) 不可达(UNREACHABLE)

注:由于Nagios的插件式基于定时调用的.所以很显然,Nagios的插件是和语言无关的.只要Nagios或者NRPE的运行环境上有执行该插件的语言环境即可.

Nagios插件除了返回这几个值以外.还可以支持返回性能数据.插件返回的性能数据是由主机与服务检测时插件检测结果带出来的外部数据。特定插件的数据,象丢包率、磁盘空闲空间、处理器负荷、当前登录的用户数等,是在执行时由插件自已来测量出来的任何一种类型数据。特定插件数据是可选项并非每个插件都有。

如果希望插件返回性能数据.则在打印的结果中添加|符号,如check_ping中

PING ok - Packet loss = 0%, RTA = 0.80 ms | percent_packet_loss=0, rta=0.80

Nagios的守护程序并不直接处理插件的性能数据,因而它并不关心在性能数据里有什么东西。对性能数据并没有什么限制与格式约束,但是,如果要用外部构件来处理性能数据(如PerfParse),外部构件需要插件以固定格式来输出性能数据。这要审视将要使用的外部构件里相关文档。

插件的形式 由于Nagios的插件于语言无关,只和返回值有关.所以Nagios的插件主要有2种形式.

1) 本地监听 如读取磁盘磁盘信息.本地的日志分析等.插件在按照一定的逻辑检查完本地的服务是否正常后,按照协议返回插件的返回值即可

2) 网络监听 插件可以利用网络来检测远程的服务.可以用来监测一些有网络协议的服务.如Solr,Zookeeper等

注:由于Nagios只有这2种形式.所以.如果我们要监测自己的业务是否正常.就需要打印日志或者是提供监控的网络服务.

插件的加载 按照一定的规则将插件编写完成后.就需要将插件加载到Nagios内.插件的加载分为2类.一种是加载本地插件.另一种是远程调用被监控机器上的插件.这两种方式都属于主动调用.Nagios除了支持主动调用以外,还支持被动调用.即插件决定什么时候执行,并在执行后将结果通过NASC传回Nagios

注:如果是编写网络插件.则只要在监控主机上加载即可.不需要配置NRPE 注:Nagios在Win下的插件不可扩展.NASC用Shell编写,所以Win下也不能执行.如果需要监控Win下的服务.可以使用Nagios自带的不可扩展的插件或者是实现类似NASC的脚本.直接将消息发送给Nagiso

plugin.png

NagiosServer 是Nagios.他可以加载本地的插件NetPlugins,NERP-Plugin以及其他
NetPlugins是用于网络监听的插件.他可以利用网络协议来获取远程机器上服务的运行状态
NERP-Plugin是Nagios实现远程监控的一个工具.他可以用来执行远程服务器上的插件来获取信息.如远程主机上的硬盘使用情况等.

NASC是Nagios实现被动监控的一个工具.NASC只负责传输插件的最终运行结果.插件如何调用需要自己控制.

如果是加载本地插件.则分为以下几步

  1. 1 定义插件的命令(编辑commands.cfg)
  2. 2 定义要监控的服务(编辑localhost.cfg)

如果是加载NERP.则一般需要如下几步(假设NERP的环境已经配置好).

  1. 1 定义插件的命令(编辑commands.cfg)
  2. 2 定义要的主机及主机组 (编辑hosts.cfg)
  3. 3 定义要监控的服务(编辑services.cfg )
  4. 4 修改nagios.cfg文件以加载hosts和services文件
  5. 5 在需要监控的机器上.修改nrpe.cfg文件,添加插件的命令.

NASC配置方式和NERP类似,在下面介绍实例的时候再细说

经过以上配置.插件应该就可以正常的工作了.

插件编写和配置示例

为了演示Nagios插件的编写和配置的示例.这里用python和java来开发一个相同的插件.插件用来监控Solr的服务是否正常.python版本工作在nagios的服务器上.而java版本工作在安装了NERP的被监控机器上.

Python部分的代码如下:
  1. #!/usr/bin/env python
  2. import urllib, json, sys
  3. from optparse import OptionParser
  4. def listcores():
  5. status_cmd = baseurl + core_admin_url + urllib.urlencode({'action':'status','wt':'json'})
  6. cores = []
  7. res = urllib.urlopen(status_cmd)
  8. data = json.loads(res.read())
  9. core_data = data['status']
  10. for core_name in core_data:
  11. cores.append(core_name)
  12. return cores
  13. def solrping(core):
  14. ping_cmd = baseurl + core + '/admin/ping?' + urllib.urlencode({'wt':'json'})
  15. res = urllib.urlopen(ping_cmd)
  16. data = json.loads(res.read())
  17. status = data.get('status')
  18. return status
  19. def main():
  20. global baseurl, core_admin_url, threshold_warn, threshold_crit
  21. cmd_parser = OptionParser(version="%prog 0.1")
  22. cmd_parser.add_option("-p", "--port", type="string", action="store", dest="solr_server_port", help="SOLR Server port")
  23. cmd_parser.add_option("-W", "--webapp", type="string", action="store", dest="solr_server_webapp", help="SOLR Server webapp path")
  24. (cmd_options, cmd_args) = cmd_parser.parse_args()
  25. if not (cmd_options.solr_server_port and cmd_options.solr_server_webapp):
  26. cmd_parser.print_help()
  27. return(3)
  28. solr_server = "127.0.0.1"
  29. solr_server_port = cmd_options.solr_server_port
  30. solr_server_webapp = cmd_options.solr_server_webapp
  31. core_admin_url = 'admin/cores?'
  32. baseurl = 'http://' + solr_server + ':' + solr_server_port + '/' + solr_server_webapp + '/'
  33. pingerrors = []
  34. try:
  35. cores = listcores()
  36. except IOError as (errno, strerror):
  37. print "CRITICAL: {0} - {1}".format(errno,strerror)
  38. return(2)
  39. except (ValueError, TypeError):
  40. print "CRITICAL: probably couldn't format JSON data, check SOLR is ok"
  41. return(3)
  42. except:
  43. print "CRITICAL: Unknown error"
  44. return(3)
  45. # XXX: This is ugly...
  46. try:
  47. for core in cores:
  48. if solrping(core) != 'OK':
  49. pingerrors.append(core)
  50. except IOError as (errno, strerror):
  51. print "CRITICAL: {0} {1} ".format(errno, strerror)
  52. return(2)
  53. except KeyError as strerror:
  54. if 'slave' in strerror:
  55. print "CRITCAL: This doesn't seem to be a slave, are you sure you meant to call -r?"
  56. return(2)
  57. else:
  58. print "CRITICAL: unknown error (error string: {0})".format(strerror)
  59. print strerror
  60. return(3)
  61. if pingerrors:
  62. print "CRITICAL: error pinging core(s) - ",
  63. print ", ".join(pingerrors)
  64. return(2)
  65. else:
  66. print "OK: no issues"
  67. return(0)
  68. if __name__ == '__main__':
  69. sys.exit(main())

可以看到,插件接受参数-W (Solr的工作目录) –p(Solr工作端口),然后以拼接URL的方式访问Solr服务器,Solr服务器返回JSON格式的数据.解析并确定Solr服务的状态.插件可以接收IP地址用于监控远程服务.但是这里为了演示NERP的插件加载以及JAVA版本的插件使用.默认就是监听本地的Solr服务的状态.

插件编写好的以后需要先测试是否可用.上传插件到目录(/usr/local/nagios/plugins),可以任意指定.在正常开启Solr服务后.

  1. [root@localhost plugins]# python check_solr.py -W solr -p 8080
  2. OK: no issues

OK 插件可以正常工作.配置加载插件.

  1. [root@localhost bin]# vi /usr/local/nagios/etc/objects/commands.cfg
  2. 追加..
  3. define command{
  4. command_name check_solr
  5. command_line python /usr/local/nagios/plugins/check_solr.py -W $ARG1$ -p $ARG2$
  6. }
  7. [root@localhost bin]# vi /usr/local/nagios/etc/objects/localhost.cfg
  8. 追加…
  9. define service{
  10. use local-service
  11. host_name localhost
  12. service_description CheckSolr
  13. check_period 24x7
  14. check_command check_solr!solr!8080
  15. notifications_enabled 0
  16. }

验证插件的正确性

  1. [root@localhost bin]# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
  2. Things look okay - No serious problems were detected during the pre-flight check

重启服务

[root@localhost bin]# /etc/init.d/nagios restart   

在页面上应该可以看到插件已经生效

在NRPE下扩展自己的插件

使用nrpe来测试插件.首先是编写Java版本的插件

  1. package com.iflytek.nagiosPlus;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.net.HttpURLConnection;
  7. import java.net.URL;
  8. import java.util.ArrayList;
  9. import java.util.Iterator;
  10. import org.apache.commons.cli.CommandLine;
  11. import org.apache.commons.cli.CommandLineParser;
  12. import org.apache.commons.cli.HelpFormatter;
  13. import org.apache.commons.cli.Options;
  14. import org.apache.commons.cli.ParseException;
  15. import org.apache.commons.cli.PosixParser;
  16. import com.fasterxml.jackson.core.JsonParseException;
  17. import com.fasterxml.jackson.databind.JsonMappingException;
  18. import com.fasterxml.jackson.databind.JsonNode;
  19. import com.fasterxml.jackson.databind.ObjectMapper;
  20. public class SolrCheck {
  21. /**
  22. * 简单的下载方法
  23. * */
  24. public String getUrl(String urlStr){
  25. try{
  26. URL url = new URL(urlStr);
  27. HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
  28. httpConn.connect();
  29. InputStream cin = httpConn.getInputStream();
  30. BufferedReader reader = new BufferedReader(new InputStreamReader(cin,
  31. "UTF-8"));
  32. StringBuffer sb = new StringBuffer();
  33. String rl = null;
  34. while ((rl = reader.readLine()) != null) {
  35. sb.append(rl).append(System.getProperty("line.separator"));
  36. }
  37. return sb.toString();
  38. }catch(Exception e){
  39. return null;
  40. }
  41. }
  42. private String formatstr = "java solr_check -p [port] -W [slor webapp]";
  43. /**
  44. * 处理命令行的参数
  45. * */
  46. private CommandLine parseOptions(String[] args) {
  47. Options opt = new Options();
  48. opt.addOption("p", true, "solr_server_port");
  49. opt.addOption("W", true, "solr_server_webapp");
  50. HelpFormatter formatter = new HelpFormatter();
  51. CommandLineParser parser = new PosixParser();
  52. CommandLine cl = null;
  53. try {
  54. // 处理Options和参数
  55. cl = parser.parse(opt, args);
  56. } catch (ParseException e) {
  57. formatter.printHelp(formatstr, new Options()); // 如果发生异常,则打印出帮助信息
  58. System.exit(3);
  59. }
  60. if (!cl.hasOption("p") || !cl.hasOption("W")) {
  61. formatter.printHelp(formatstr, new Options()); // 如果发生异常,则打印出帮助信息
  62. System.exit(3);
  63. }
  64. return cl;
  65. }
  66. /**
  67. * 依据URL获取到集合,并且返回所有的集合的名称
  68. * */
  69. private ArrayList<String> listcores(String baseurl) {
  70. String status_cmd = baseurl + "admin/cores?action=status&wt=json";
  71. String src = getUrl(status_cmd);
  72. if (src == null || src.equals(""))
  73. return null;
  74. ObjectMapper mapper = new ObjectMapper();
  75. ArrayList<String> result = new ArrayList<String>();
  76. try {
  77. JsonNode rootNode = mapper.readValue(src, JsonNode.class);
  78. JsonNode jsonArr = rootNode.get("status");
  79. Iterator<JsonNode> it = jsonArr.iterator();
  80. while (it.hasNext()) {
  81. JsonNode cur = it.next();
  82. result.add(cur.get("name").textValue());
  83. }
  84. } catch (JsonParseException e) {
  85. // TODO Auto-generated catch block
  86. e.printStackTrace();
  87. } catch (JsonMappingException e) {
  88. // TODO Auto-generated catch block
  89. e.printStackTrace();
  90. } catch (IOException e) {
  91. // TODO Auto-generated catch block
  92. e.printStackTrace();
  93. }
  94. return result;
  95. }
  96. /**
  97. * 获取到collection的ping值是否正常
  98. * */
  99. private String solrping(String baseurl, String core) {
  100. String ping_cmd = baseurl + core + "/admin/ping?wt=json";
  101. String src = getUrl(ping_cmd);
  102. if (src == null || src.equals(""))
  103. return null;
  104. ObjectMapper mapper = new ObjectMapper();
  105. try {
  106. JsonNode rootNode = mapper.readValue(src, JsonNode.class);
  107. JsonNode jsonArr = rootNode.get("status");
  108. return jsonArr.textValue();
  109. } catch (JsonParseException e) {
  110. // TODO Auto-generated catch block
  111. e.printStackTrace();
  112. } catch (JsonMappingException e) {
  113. // TODO Auto-generated catch block
  114. e.printStackTrace();
  115. } catch (IOException e) {
  116. // TODO Auto-generated catch block
  117. e.printStackTrace();
  118. }
  119. return null;
  120. }
  121. public static void main(String[] args) {
  122. SolrCheck solrCheck = new SolrCheck();
  123. CommandLine cl = solrCheck.parseOptions(args);
  124. String ip = "127.0.0.1";
  125. String port = cl.getOptionValue("p");
  126. String webapp = cl.getOptionValue("W");
  127. String baseurl = "http://" + ip + ":" + port + "/" + webapp + "/";
  128. ArrayList<String> cores = solrCheck.listcores(baseurl);
  129. if(cores==null){
  130. System.err.println("CRITICAL: probably couldn't format JSON data, check SOLR is ok");
  131. System.exit(3);
  132. }
  133. ArrayList<String> errCores = new ArrayList<String>();
  134. String resultErr = "CRITICAL: error pinging core(s) - ";
  135. for (String core : cores) {
  136. if (!solrCheck.solrping(baseurl, core).equals("OK")) {
  137. errCores.add(core);
  138. resultErr += core + ",";
  139. }
  140. }
  141. if (errCores.size() == 0) {
  142. System.err.println("OK: no issues");
  143. System.exit(0);
  144. } else {
  145. System.err.println(resultErr);
  146. System.exit(3);
  147. }
  148. }
  149. }

Java程序和Python不同.需要先打包才能在在别的机器上运行.打包的时候可能需要很多依赖包.为了方便打包.使用Eclipse的插件FatJar来进行打包.

  1. 下载fatjar
  2. http://superb-dca2.dl.sourceforge.net/project/fjep/fatjar/fatjar_0_0_31/net.sf.fjep.fatjar_0.0.31.zip

解压后放到eclipse的plugin目录下即可.

打包后将check_solr.jar上传到服务器(监控机).在被监控的机器上开启Slor后. 验证插件的有效性

  1. [root@localhost myPlugin]# java -jar check_solr.jar -W solr -p 8080
  2. OK: no issues
  3. 在主机上
  4. 配置加载NRPE插件.如果NRPE已经配置过了 则可跳过
  5. [root@localhost bin]# vi /usr/local/nagios/etc/objects/commands.cfg
  6. 追加..
  7. define command{
  8. command_name check_nrpe
  9. command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
  10. }
  11. 配置host以及host .如果配置过 则可以跳过
  12. [root@localhost bin]# vi /usr/local/nagios/etc/objects/hosts.cfg
  13. define host{
  14. use linux-server
  15. host_name SolrServer
  16. alias 192.168.39.251
  17. address 192.168.39.251
  18. }
  19. #定义一个主机组
  20. define hostgroup{
  21. hostgroup_name bsmart-servers
  22. alias bsmart servers
  23. members SolrServer
  24. }
  25. 配置需要监控的服务
  26. [root@localhost bin]# vi /usr/local/nagios/etc/objects/services.cfg
  27. define service{
  28. use local-service
  29. host_name SolrServer
  30. service_description checkSolr
  31. check_command check_nrpe!check_solr
  32. }
  33. 在需要监控的机器上修改配置文件
  34. [root@localhost etc]# vi /usr/local/nagios/etc/nrpe.cfg
  35. 追加..
  36. command[check_solr]=java -jar /usr/local/nagios/myPlugin/check_solr.jar -W solr -p 8080
  37. 重启服务(主机)
  38. [root@localhost bin]# /etc/init.d/nagios restart
  39. 重启服务(监控机)
  40. [root@localhost bin]# service xinetd restart
  41. 访问nagios可以看到.

6 报警方式扩展支持

在理解报警方式实际上也是一种命令以后就比较简单了.实际上对报警方式的扩展就是使用配置一个新的command.cfg,并在contacts.cfg里引用即可.至于报警程序.可以自己编写.也可以使用第三方的插件.

扩展飞信报警

  1. wget http://www.rarlab.com/rar/rarlinux-3.8.0.tar.gz
  2. tar zxvf rarlinux-3.8.0.tar.gz
  3. cd rar
  4. make install
  5. wget http://www.it-adv.net/fetion/linuxso_20101113.rar
  6. unrar x linuxso_20101113.rar
  7. cp lib*so* /usr/lib
  8. echo "/usr/lib" >> /etc/ld.so.conf
  9. ldconfig
  10. chmod 777 fetion
  11. chown nagios:nagios fetion
  12. ./fetion --mobile=18756975268 --pwd=XXXXXX --to=<phone> --msg-utf8=test

这里第一次登陆需要要输入验证码.在linux下只用输入一次即可 如果手机可以正常的收到短信.则表明飞信安装成功

编辑command.cfg 扩展飞信的发送命令

  1. define command {
  2. command_name notify-host-by-fei
  3. command_line /usr/local/fetion --mobile=<phone> --pwd=<ps> --to=$CONTACTPAGER$ --msg-utf8="Host $HOSTSTATE$ alert for $HOSTNAME$! on '$LONGDATETIME$'"
  4. }
  5. define command {
  6. command_name notify-service-by-fei
  7. command_line /usr/local/fetion --mobile=<phone> --pwd=<ps> --to=$CONTACTPAGER$ --msg-utf8="$HOSTADDRESS$ $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ on $LONGDATETIME$"
  8. }

在contacts.cfg里配置 service_notification_commands notify-service-by-email,notify-service-by-fei
host_notification_commands notify-host-by-email,notify-host-by-fei
pager 18756975268

这样,在主机和系统服务产生异常的时候,即可收到短信和邮件

7 数据存储

7.1 文件存储

文件存储是nagios自带的一个功能.一般用来存储性能数据

在Nagios里可以有两大类性能数据:

  1. 1. 检测过程的性能数据
  2. 2. 插件返回的性能数据

检测过程的性能数据是与主机检测和服务检测相关的系统内部数据。这些数据包括象服务检测延时(就是检测实际检测的时刻与其计划时间之间的推后时间)和主机检测与服务检测执行所花费的时间。这类性能数据对全部可执行的检测都适用。$HOSTEXECUTIONTIME$和$SERVICEEXECUTIONTIME$宏定义可用于度量主机或服务检测所运行的时间,$HOSTLATENCY$和$SERVICELATENCY$宏定义可用于度量主机和服务检测的执行延时。

插件返回的性能数据是由主机与服务检测时插件检测结果带出来的外部数据。特定插件的数据,象丢包率、磁盘空闲空间、处理器负荷、当前登录的用户数等,是在执行时由插件自已来测量出来的任何一种类型数据。特定插件数据是可选项并非每个插件都有。(如果有)特定插件数据将包含在$HOSTPERFDATA$和$SERVICEPERFDATA$宏定义里。更多有关如何在Nagios里返回性能数据蕴涵在$HOSTPERFDATA$和$SERVICEPERFDATA$宏里面。 .打开监控

  1. process_performance_data=1
  2. host_perfdata_file=/usr/local/nagios/var/host-perfdata
  3. service_perfdata_file=/usr/local/nagios/var/service-perfdata
  4. host_perfdata_file_template=[HOSTPERFDATA]\t$TIMET$\t$HOSTNAME$\t$HOSTEXECUTIONTIME$\t$HOSTOUTPUT$\t$HOSTPERFDATA$
  5. service_perfdata_file_template=[SERVICEPERFDATA]\t$TIMET$\t$HOSTNAME$\t$SERVICEDESC$\t$SERVICEEXECUTIONTIME$\t$SERVICELATENCY$\t$SERVICEOUTPUT$\t$SERVICEPERFDATA$
  6. // process_performance_data是否启动性能数据收集
  7. // host_perfdata_file文件位置
  8. // service_perfdata_file 文件位置
  9. // host_perfdata_file_template 写文件时的格式化数据
  10. // service_perfdata_file_template写文件时的格式化数据
  11. //现在对于如何定时清空日志还不清楚

7.2 Ndoutils

7.2.1 Ndoutils安装

NDOUtils是一个可以把全部状态信息保存到数据库里的外部构件。另外Nagios的库实例都可以把它们监控的信息保存到统一的中心数据库并集中报告。它将为一个Nagios新的基于PHP的WEB接口程序提供数据源服务。NDOUtils主要支持Mysql数据库

NDOUtils在安装前需要一些mysql的基础的服务,使用命令检查相关依赖的安装情况,如果没有安装则使用yum安装

  1. rpm -q perl-DBD-MySQL
  2. yum install perl-DBD-MySQL
1. 创建数据库及用户,赋给给用户权限.
  1. mysql -u root -p
  2. mysql>create database nagios;
  3. mysql> grant all privileges on nagios.* TO nagios@localhost identified by 'nagios';
  4. mysql>flush privileges;
2. 安装ndoutils
  1. wget http://ncu.dl.sourceforge.net/project/nagios/ndoutils-1.x/ndoutils-1.4b9/ndoutils-1.4b9.tar.gz
  2. tar -xvf ndoutils-1.4b9.tar.gz
  3. cd ndoutils-1.4b9
  4. ./configure --prefix=/usr/local/nagios/ --enable-mysql --disable-pgsql --with-ndo2db-user=nagios --with-ndo2db-group=nagios
  5. make
3. 初始化数据库
  1. cd db
  2. ./installdb -u root -p 您数据库的密码 -d nagios
4. 确认表已经被初始化成功
  1. mysql -u root -p
  2. mysql>use nagios;
  3. mysql>show tables;
  4. mysql>quit
5. 复制各项配置文件
  1. cd ndoutils-1.4b9
  2. cp ./src/ndomod-3x.o /usr/local/nagios/bin/ndomod.o
  3. cp ./src/ndo2db-3x /usr/local/nagios/bin/ndo2db
  4. cp ./config/ndo2db.cfg /usr/local/nagios/etc/ndo2db.cfg
  5. cp ./config/ndomod.cfg /usr/local/nagios/etc/ndomod.cfg
6. 调整配置文件
  1. vim /usr/local/nagios/etc/ndo2db.cfg
  2. #修改ndo的主配置文件
  3. db_name=nagios
  4. #指定数据库为nagios
  5. db_user=nagios
  6. db_pass=nagios
  7. #设置以nagios用户登入mysql的账号密码
  8. vi /usr/local/nagios/etc/nagios.cfg
  9. #修改nagios主配置文件
  10. broker_module=/usr/local/nagios/bin/ndomod.o config_file=/usr/local/nagios/etc/ndomod.cfg
  11. #在末行添加
7. 启动服务
  1. cp ./daemon-init /etc/init.d/ndo2db
  2. chmod +x /etc/init.d/ndo2db
  3. chkconfig --add ndo2db
  4. chkconfig ndo2db on
  5. #添加启动脚本
  6. service nagios restart
  7. service ndo2db start
  8. #重启服务
  9. /usr/local/nagios/bin/ndo2db -c /usr/local/nagios/etc/ndo2db.cfg
  10. Tail –f /usr/local/nagios/var/nagios.log 即可看到

注意: NDOUtils有一个小的BUG.在建立好的数据库中.表nagios\_configfilevariables的默认组合唯一键是instance_id, configfile_id, varname.如果有多个cfg文件则无法写入该表.修改为instance_id, configfile_id, varname,varvalue组合唯一

7.2.2 Ndoutils表说明

1. nagios_objects

ndo里最重要的对象表,里面有nagios所有的对象.在ndo的库里都有一个唯一的标志,就是object_id.而这个id就是在这张表里定义的.表里有两个名字列,name1,name2.这在ndo里面也是很重要的一个标识,这个是我们认为判断这个对象的唯一的标识.对于大部分对象来说,name2都是空的,比如host,name1是host的名字,name2为NULL;对于service,name1是这个service所属的host的名字,name2是service的名字。

字段名称示意
object\_idObject的ID,在其他的各个表中都有引用
name1Host名称,命令名称等
name2监控服务的描述
is\_active是否启用

host部分

2. nagios_hosts

ndo里存储host对象信息的表.表内有nagios内的host信息.但是同样的信息在nagios_hoststatus内也有一份相同的记录.而且nagios_hoststatus内还存在host的当前的状态.但是对于nagios_hoststatus来说.需要的查询字段为host_object_id.而这个字段和host_id的对应关系只存在于该表中.ndo中有模板表.也就是说这个host表以及下面的nagios_hoststatus表中都是存放已经解析后的配置参数

字段名称示意
host\_idhost在表中的唯一标识
host\_object\_idhost在object表中的唯一标识
notification\_interval通知间隔时间

3. nagios_hostgroups

ndo里存储hostgroup对象信息的表,保存了一个唯一的对应关系hostgroup_id到hostgroup_object_id的对应关系.在nagios_hostgroup_members表时.需要先从改变中去到hostgroup_object_id才能确定组内的成员关系

字段名称示意
hostgroup\_id本表的唯一标示
hostgroup\_object\_idhost组在object表中的ID
alias组名称

4. nagios_hostgroup_members

nagios_hostgroup_members是存储host和hostgroup关系的表

字段名称示意
hostgroup\_idnagios\_hostgroups表的唯一标示
host\_object\_idhost在object表中的ID

5. nagios_hoststatus

nagios_hoststatus是一张相当重要的表.表内存储了hots的当前的状态码.性能参数以及host的详细的配置.

字段名称示意
host\_object\_idhost在object表中的ID
output插件返回的正常的显示数据
perfdata插件返回的性能数据
current\_state插件返回的状态值
current\_check\_attempt当前的重试次数
max\_check\_attempts最大的重试次数
last\_check最后一次检查时间
next\_check下一次检查时间
last\_notification最后一次通知时间
next\_notification下一次通知时间
notifications\_enabledhost在object表中的ID
passive\_checks\_enabled是否开启被动检查
active\_checks\_enabled是否开启主动检查
event\_handler\_enabled是否开启事件处理
process\_performance\_data是否开启性能处理
event\_handler事件处理的句柄ID
check\_command命令的ID
normal\_check\_interval正常检查的间隔时间
retry\_check\_interval在发生错误时重启的间隔
execution\_time插件的执行时间

6. nagios_hostchecks

nagios_hostcheck保存了nagios的所有的检查记录.pnp4nagios的记录就是就是从这张表内获取.表中会保存一个星期的结果.

字段名称示意
host\_object\_idhost在object表中的唯一标识
current\_check\_attempt当前的检查次数
max\_check\_attempts最大的检查次数
start\_time插件执行开始时间
end\_time插件执行结束时间
command\_line检查的命令,此处的命令是完整的命令路径并携带参数
execution\_time插件的执行时间
return\_code插件返回的状态值
output插件返回的正常的显示数据
perfdata插件返回的性能数据

Service部分

7. nagios_services

ndo里存储service对象信息的表,在得知主机的object_id,然后查询这个主机上的service相关信息的时候需要用到,因为ndo里只有这张 表存储了host_object_id和service_object_id的对应.其他的字段于host和host_status的关系类似.在services中其他字段在services_status表中也有体现.

这里只列出于host对应关系的列

字段名称示意
host\_object\_idhost在object表中的唯一标识
service\_object\_idservice表中的唯一标示
notification\_interval通知间隔时间

8. nagios_servicestatus

ndo里存储service当前状态信息的表

字段名称示意
service\_object\_idservices在object表中的ID
output插件返回的正常的显示数据
perfdata插件返回的性能数据
current\_state插件返回的状态值
current\_check\_attempt当前的重试次数
max\_check\_attempts最大的重试次数
last\_check最后一次检查时间
next\_check下一次检查时间
last\_notification最后一次通知时间
next\_notification下一次通知时间
notifications\_enabledhost在object表中的ID
passive\_checks\_enabled是否开启被动检查
active\_checks\_enabled是否开启主动检查
event\_handler\_enabled是否开启事件处理
process\_performance\_data是否开启性能处理
event\_handler事件处理的句柄ID
check\_command命令的ID
normal\_check\_interval正常检查的间隔时间
retry\_check\_interval在发生错误时重启的间隔
execution\_time插件的执行时间

9. nagios_servicechecks

nagios_servicechecks保存了nagios的所有services的检查记录.pnp4nagios的记录就是就是从这张表内获取.表中会保存一个星期的结果.

字段名称示意
service\_object\_idservice在object表中的唯一标识
current\_check\_attempt当前的检查次数
max\_check\_attempts最大的检查次数
start\_time插件执行开始时间
end\_time插件执行结束时间
command\_line检查的命令,此处的命令是完整的命令路径并携带参数
execution\_time插件的执行时间
return\_code插件返回的状态值
output插件返回的正常的显示数据
perfdata插件返回的性能数据

Contacts部分

在ndo中 取不到联系人的发送消息的方式.在contact_notificationcommands表中.command最后对应到object中的值没有任何意义

10. nagios_contacts

ndo里存储contacts对象信息的表,contacts对象信息包括联系人的名称,邮件地址,手机号码等.

字段名称示意
contact\_object\_idcontact在object表中的唯一标识
alias名称
email\_address邮件地址
pager\_address一般这里可以定义为手机号码
host\_timeperiod\_object\_idHost通知发送的时间范围
notify\_host\_recoveryHost在recovery是否发送请求
notify\_host\_downHost在宕机时是否发送请求
notify\_host\_unreachableHost在不可达时是否发送请求
notify\_host\_flappingHost在抖动时是否发送请求
notify\_host\_downtimeHost在计划关机时是否发送请求
service\_timeperiod\_object\_idservice通知发送的时间范围
notify\_service\_recoveryservice在recovery是否发送请求
notify\_service\_downservice在宕机时是否发送请求
notify\_service\_unreachableservice在不可达时是否发送请求
notify\_service\_flappingservice在抖动时是否发送请求
notify\_service\_downtimeservice在计划关机时是否发送请求

11. nagios_contactgroups

ndo里存储contacts组对象信息的表,contacts组经常用于表示将消息发送给谁.

字段名称示意
nagios\_contactgroups本表的唯一标示
contactgroup\_object\_idcontacts组在object表中的ID
alias组名称

12. nagios_contactgroup_members

nagios_contactgroup_members是存储contact和contactgroup关系的表

字段名称示意
contactgroup\_idnagios\_contactgroups表的唯一标示
contact\_object\_idcontact在object表中的ID

13. nagios_host_contacts

nagios_host_contacts是存储host和contacts关系的表

字段名称示意
host\_idhost表的唯一标示
contact\_object\_idcontact在object表中的ID

14. nagios_host_contactgroups

nagios_host_contactgroups是存储host和contactgroups关系的表.这张表比nagios_host_contacts更为常用.

字段名称示意
host\_idhost表的唯一标示
contactgroup\_object\_idcontactgroup在object表中的ID

15. nagios_service_contacts

nagios_service_contacts是存储service和contacts关系的表

字段名称示意
service\_idservice表的唯一标示
contact\_object\_idcontact在object表中的ID

16. nagios_service_contactgroups

nagios_service_contactgroups是存储service和contactgroups关系的表.通常service的通知人的管理也都在这张表中

字段名称示意
service\_idservice表的唯一标示
contactgroup\_object\_idcontactgroup在object表中的ID

命令

17. nagios_commands

ndo里存储commands对象信息的表,commands对象主要是定义了命令的脚本以及脚本参数.

字段名称示意
commandscommands表的唯一ID
object\_idcommands表在object表中的唯一ID
command\_line命令及参数的定义

日志记录

17. nagios_conninfo

连接信息,表中记录了客户端连接到ndo的mysql的信息.如果ndo的客户端连接到mysql.表中将存在记录.这张表更像是一个debug的表.

字段名称示意
agent\_name客户端名称
agent\_version客户端版本
connect\_time连接时间
disconnect\_time断开连接的时间

17. nagios_contactnotifications

表中记录了发送联系的历史记录.表中没有详细的联系信息,需要从别的地方查询到.

字段名称示意
contact\_object\_id联系人的ID
contactnotification\_id表中的唯一ID

18. nagios_contactnotificationmethods

表中记录了发送联系的历史记录.

字段名称示意
contactnotification\_idnagios\_contactnotifications中的ID
start\_time命令开始执行的时间,可以看为发送时间
command\_object\_id发送的命令的ID,在object表中

19. nagios_eventhandlers

表中记录host以及services的事件句柄的触发.

字段名称示意
object\_id那个对象触发了eventhandle
start\_time脚本开始执行时间
end\_time脚本结束执行时间
command\_line脚本的命令及参数
execution\_time脚本执行时间
output脚本返回字符串

20. nagios_externalcommands

外部命令的执行记录外部命令包括外部发起的重启,强制修改检查时间等.

字段名称示意
entry\_time外部命令的执行时间
command\_name外部命令的名称
command\_args参数

21. nagios_logentries

ndo用来记录nagios的输出日志的表.

字段名称示意
entry\_time日志的生成时间
logentry\_data日志的内容

22. nagios_notifications

用来记录host及service产生的日志.这些日志可能并没有被发送出去.

字段名称示意
notification\_type消息的类型
object\_id日志的产生对象
start\_time日志的发送时间
output日志的内容
contacts\_notified日志有没有发给联系人

23. nagios_statehistory

nagios host和service的状态记录.

字段名称示意
state\_time状态发生改变的时间
state当前状态
object\_id状态对应对象的ID
current\_check\_attempt当前检查次数
max\_check\_attempts最大检查次数
output插件输出

24. nagios_systemcommands

nagios记录系统的表运行记录的表.系统命令包括process_perfdata.pl,发生feixin等.

字段名称示意
state\_time相当于执行的开始时间
command\_line执行的命令行
return\_code返回状态码
output插件输出

25. nagios_systemcommands

nagios记录系统的表运行记录的表.系统命令包括process_perfdata.pl,发生feixin等.

字段名称示意
state\_time相当于执行的开始时间
command\_line执行的命令行
return\_code返回状态码
output插件输出

8 管理Nagios的配置文件

Nagios的配置文件比较多.而且之前的关系也比较复杂.可以搭建一个界面工具来专门的管理Nagios的配置文件.常见的nagios的管理工具有nagiosql,nconf等.由于nagiosql有中文版,所以这里介绍nagiosql的安装.

NagiosQL实际上是将Nagios的配置文件导入到自己的数据库中.并会在用户配置的目录下重新生成这些文件.当用于在界面上修改后.则刷新这些配置到硬盘.而同时修改Nagios的配置文件的默认指向为NagiosQL.而达到管理的功能.由于NagiosQL允许配置Nagios的命令所在的文件夹.故而在权限允许的情况下.可以远程执行Nagios的命令以达到检查配置文件.以及重启Nagios服务的效果.

1.重新编译PHP.这里需要php对mysql以及gettext支持.所以我们必须要扩展php插件.扩展php插件可以使用动态扩展和从新编译两种.这里使用的是重新编译.

  1. ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs --with-config-file-path=/usr/local/php/etc/ --with-mysql --with-gettext
  2. make && make install

2.下载nagiosQL. http://www.nagiosql.org/files/category/2-download-release.html并安装

  1. tar zxvf nagiosql_311.tar.gz
  2. cd nagiosql
  3. chown -R nagios:nagios /usr/local/nagios/nagiosql
  4. chmod -R 777 /usr/local/nagios/nagiosql/config
  5. #赋值权限
  6. mkdir etc/hosts
  7. mkdir etc/services
  8. mkdir etc/backup/services
  9. mkdir -p etc/backup/services
  10. mkdir -p etc/backup/hosts
  11. chown -R nagios:nagios etc
  12. #创建后面需要的目录
  13. cd /usr/local/nagios/nagiosql/install
  14. touch ./ENABLE_INSTALLER
  15. #启动安装
  16. #修改apache的目录.指向nagiosQL的目录
  17. Alias /nagiosQL "/usr/local/nagios/nagiosql"
  18. <Directory "/usr/local/nagios/nagiosql">
  19. # SSLRequireSSL
  20. Options None
  21. AllowOverride None
  22. Order allow,deny
  23. Allow from all
  24. </Directory>

重启apache并访问http:///nagiosQL即开始安装, 在安装过程中最重要的一步为下图所示

nagiosQL.png

这一步设置无误后即可开始进入系统.

注意:在安装的最后.web页面会提示你删除安装目录以继续.这时只需要把nagiosql下的install目录重新命名即可.

开始配置nagiosQL.点击 [管理]>[域]>[ localhost]>[修改].进入如下页面.配置参数按提示填写真实目录.并在配置完成后点击[工具]>[导入数据]>[选择文件]来将数据导入到nagiosQL.在导入完成后.即可在nagiosQL中查看,修改这些配置信息.

注意:
1.在修改配置信息后.需要点击页面下方的[写入所有配置文件].
2.nagiosQL在配置域信息的时候并不会删除空格.所以在写文件名的时候需要自行检查字符串两边的空格.否则可能无法正常的执行命令..
3.在生成了所有的配置文件以后.修改Nagios配置指向新的配置以生效.

nagiosQLC.png

9 图表

通常来说,nagios的报警机制只提供了瞬时信息.即检查插件的时候,被检查的主机或者是服务是否正常.由于nagios是针对瞬时数据的.所以其本身的报表也就是只支持瞬时数据的显示.但是我们除了关注瞬时数据以外.往往还关心其他的数据.如其内存占用率的曲线是什么样的.CPU使用的曲线是什么样的.这类数据在nagios中被称之为性能数据.上文中我们已经介绍了如何使用工具将性能数据保存下来.但是nagios在保存之后却不会做其他的事情.如果我们需要解释这些性能数据并且绘制成直观的图表.我们就需要借助pnp4nagios.

简单来说pnp4nagios是基于RRD轮循(环状)数据库中所提供的综合信息,以可视化图形的方式呈现给用户的一款nagios插件.如果需要使用RRD轮训.则需要安装rrdtool.

1.安装rrdtool:

  1. 在 /etc/yum.repos.d/下面新建dag.repo文件在文件中输入源地址:
  2. [root@hmg2 yum.repos.d]# cat dag.repo
  3. [dag]
  4. name=Dag RPM Repository for Red Hat Enterprise Linux
  5. baseurl=http://apt.sw.be/redhat/el$releasever/en/$basearch/dag
  6. gpgcheck=1
  7. gpgkey=http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt
  8. enabled=1
  9. yum -y install rrdtool

2.下载安装pnp4nagios

  1. wget http://sourceforge.net/projects/pnp4nagios/files/PNP-0.6/pnp4nagios-0.6.19.tar.gz/download
  2. tar zxvf pnp4nagios-0.6.19.tar.gz
  3. cd pnp4nagios-0.6.19
  4. ./configure --prefix=/usr/local/pnp4nagios --with-nagios-user=nagios
  5. make all
  6. make fullinstall
  7. #安装pnp4nagios
  8. mv share/install.php share/install.php.bak
  9. ln -s /usr/local/pnp4nagios/ /usr/local/apache2/htdocs/pnp4nagios
  10. #建立软连接用于页面访问

3.重命名配置文件

  1. cd /usr/local/pnp4nagios/etc
  2. mv misccommands.cfg-sample misccommands.cfg
  3. mv nagios.cfg-sample nagios.cfg
  4. mv rra.cfg-sample rra.cfg
  5. cd pages
  6. mv web_traffic.cfg-sample web_traffic.cfg
  7. cd ../check_commands
  8. mv check_all_local_disks.cfg-sample check_all_local_disks.cfg
  9. mv check_nrpe.cfg-sample check_nrpe.cfg
  10. mv check_nwstat.cfg-sample check_nwstat.cfg

4.修改 nagios 的配置文件.使用外部命令来处理收集到的性能数据

  1. 打开performance_data
  2. cd /usr/local/nagios/etc
  3. vim nagios.cfg
  4. #打开注视项:
  5. process_performance_data=1
  6. host_perfdata_command=process-host-perfdata
  7. service_perfdata_command=process-service-perfdata
  8. #修改 commands.cfg
  9. cd /usr/local/nagios/etc/objects
  10. vim commands.cfg
  11. ##添加
  12. # 'process-host-perfdata' command definition
  13. define command{
  14. command_name process-host-perfdata
  15. command_line /usr/local/pnp4nagios/libexec/process_perfdata.pl
  16. }
  17. # 'process-service-perfdata' command definition
  18. define command{
  19. command_name process-service-perfdata
  20. command_line /usr/local/pnp4nagios/libexec/process_perfdata.pl
  21. }

5.给nagios的监控项扩展性能监控的图标.

  1. vim templates.cfg
  2. ## 在最后添加
  3. define host {
  4. name host-pnp
  5. action_url /pnp4nagios/graph?host=$HOSTNAME$&srv=_HOST_
  6. register 0
  7. }
  8. define service {
  9. name srv-pnp
  10. action_url /pnp4nagios/graph?host=$HOSTNAME$&srv=$SERVICEDESC$
  11. register 0
  12. }
  13. #修改需要显示的监控项的use属性,如
  14. define host{
  15. use linux-server,host-pnp
  16. # 修改 services.cfg
  17. define service{
  18. use local-service,srv-pnp
  19. …;

6.启动服务

/etc/init.d/npcd restart

即可看到

pnp.png

PNP4Nagios多种模式说明

PNP4Nagios作为一个Nagios的性能数据分析的插件.插件可以解析性能数据生成性能数据图表.
PNP4Nagios有如下几种工作模式.

Synchronous Mode

Synchronous Mode是最简单的一种模式.对于每一个被处理的service/host.他都会调用一次性能数据处理的脚本.据官方数据统计.该模式下每5分钟可以处理1,000条数据.其工作模式如下:

synchronous.png

  1. 1.执行插件获得性能数据
  2. 2.调用性能数据的pl来进行解析
  3. 3.调用RRD来进行计算并最后写成XML

Synchronous Mode的部署方式

  1. 1.在nagios.cfg中修改如下
  2. process\_performance\_data=1
  3. service_perfdata_command=process-service-perfdata
  4. host_perfdata_command=process-host-perfdata
  5. 2.定义命令
  6. define command {
  7. command_name process-service-perfdata
  8. command_line /usr/bin/perl /usr/local/pnp4nagios/libexec/process_perfdata.pl
  9. }
  10. define command {
  11. command_name process-host-perfdata
  12. command_line /usr/bin/perl /usr/local/pnp4nagios/libexec/process_perfdata.pl -d HOSTPERFDATA
  13. }

Synchronous Mode的缺点:很明显.就是同步请求.每条数据都需要调用pl.这种方式在负载量小的情况下没有什么问题.但是在数据量大的情况下.nagios就会出现延迟.

Bulk Mode

Bulk Mode就是在每条数据过来的时候.不再使用pl来处理,而是写一个临时文件.当达到pl设置的处理时间的时候.会调用pl来处理这个临时文件.并且会在处理文件完成后将被处理文件删除.

bulk.png

  1. 1.执行插件获得性能数据
  2. 2.Nagios临时存储这些性能数据
  3. 3.Nagiospl来进行解析性能数据.性能数据从临时文件获取
  4. 4.调用RRD来进行计算并最后写成XML

Bulk Mode的部署方式

  1. 1.在nagios.cfg中修改如下
  2. process\_performance\_data=1
  3. service_perfdata_file=/usr/local/pnp4nagios/var/service-perfdata
  4. service_perfdata_file_template=DATATYPE::SERVICEPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tSERVICEDESC::$SERVICEDESC$\tSERVICEPERFDATA::$SERVICEPERFDATA$\tSERVICECHECKCOMMAND::$SERVICECHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$\tSERVICESTATE::$SERVICESTATE$\tSERVICESTATETYPE::$SERVICESTATETYPE$
  5. service_perfdata_file_mode=a
  6. service_perfdata_file_processing_interval=15
  7. service_perfdata_file_processing_command=process-service-perfdata-file
  8. host_perfdata_file=/usr/local/pnp4nagios/var/host-perfdata
  9. host_perfdata_file_template=DATATYPE::HOSTPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tHOSTPERFDATA::$HOSTPERFDATA$\tHOSTCHECKCOMMAND::$HOSTCHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$
  10. host_perfdata_file_mode=a
  11. host_perfdata_file_processing_interval=15
  12. host_perfdata_file_processing_command=process-host-perfdata-file
  13. 2.定义命令
  14. define command{
  15. command_name process-service-perfdata-file
  16. command_line /usr/local/pnp4nagios/libexec/process_perfdata.pl --bulk=/usr/local/pnp4nagios/var/service-perfdata
  17. }
  18. define command{
  19. command_name process-host-perfdata-file
  20. command_line /usr/local/pnp4nagios/libexec/process_perfdata.pl --bulk=/usr/local/pnp4nagios/var/host-perfdata
  21. }

Bulk Mode的缺点:Bulk Mode相对Synchronous Mode提升了部分的性能.但是Bulk Mode依然需要调用pl来处理性能数据,并且在处理性能数据的时候.nagios无法做出检查的动作

Bulk Mode with NPCD

Bulk Mode with NPCD是一种比较理性的处理方式.他依然不再使用pl来处理,也是写一个临时文件.但是当达到pl设置的处理时间的时候.他还是不会调用pl来处理这个临时文件.而是将这些文件移到一个临时目录.并且等待NPCD来处理这个些文件.Bulk Mode with NPCD在处理数据的时候和Nagios完全脱离.基本不会影响到Nagios的正常使用.

bulk-npcd.png

  1. 1.执行插件获得性能数据
  2. 2.Nagios临时存储这些性能数据
  3. 3.Nagios将性能数据移动到临时文件夹中
  4. 4.NPCD扫描这个文件夹并且调用pl来进行解析性能数据.性能数据从临时文件获取
  5. 5.调用RRD来进行计算并最后写成XML

Bulk Mode with NPCD的部署方式

  1. 1.在nagios.cfg中修改如下
  2. process\_performance\_data=1
  3. service_perfdata_file=/usr/local/pnp4nagios/var/service-perfdata
  4. service_perfdata_file_template=DATATYPE::SERVICEPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tSERVICEDESC::$SERVICEDESC$\tSERVICEPERFDATA::$SERVICEPERFDATA$\tSERVICECHECKCOMMAND::$SERVICECHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$\tSERVICESTATE::$SERVICESTATE$\tSERVICESTATETYPE::$SERVICESTATETYPE$
  5. service_perfdata_file_mode=a
  6. service_perfdata_file_processing_interval=15
  7. service_perfdata_file_processing_command=process-service-perfdata-file
  8. host_perfdata_file=/usr/local/pnp4nagios/var/host-perfdata
  9. host_perfdata_file_template=DATATYPE::HOSTPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tHOSTPERFDATA::$HOSTPERFDATA$\tHOSTCHECKCOMMAND::$HOSTCHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$
  10. host_perfdata_file_mode=a
  11. host_perfdata_file_processing_interval=15
  12. host_perfdata_file_processing_command=process-host-perfdata-file
  13. 2.定义命令
  14. define command{
  15. command_name process-service-perfdata-file
  16. command_line /bin/mv /usr/local/pnp4nagios/var/service-perfdata /usr/local/pnp4nagios/var/spool/service-perfdata.$TIMET$
  17. }
  18. define command{
  19. command_name process-host-perfdata-file
  20. command_line /bin/mv /usr/local/pnp4nagios/var/host-perfdata /usr/local/pnp4nagios/var/spool/host-perfdata.$TIMET$
  21. }

Bulk Mode with NPCD的缺点:Bulk Mode with NPCD基本上没有什么太大的缺点.但是其性能数据无法被其他性能处理的程序使用

Bulk Mode with NPCD and npcdmod

Bulk Mode with NPCD and npcdmod相对于Bulk Mode with NPCD.只是添加了npcdmod.o的模块.配置更加简洁.但是在性能上和功能上和Bulk Mode with NPCD并没有区别:

bulk-npcdmod.png

  1. 1.执行插件获得性能数据
  2. 2.npcdmod临时存储这些性能数据
  3. 3.npcdmod将性能数据移动到临时文件夹中
  4. 4.NPCD扫描这个文件夹并且调用pl来进行解析性能数据.性能数据从临时文件获取
  5. 5.调用RRD来进行计算并最后写成XML

Bulk Mode with NPCD and npcdmod

  1. 在nagios.cfg中修改如下
  2. process_performance_data=1
  3. broker_module=/usr/local/pnp4nagios/lib/npcdmod.o config_file=/usr/local/pnp4nagios/etc/npcd.cfg

缺点:缺点同上.

Gearman Mode

Gearman Mode在0.6.12 PNP4Nagios中才被支持.他可以使Nagios和pnp4Nagios运行在不同的机器上

gearman.png

  1. 1.执行插件获得性能数据
  2. 2.mod_gearman将这些性能数据存储在队列内
  3. 3.pl通过gearman获取到性能数据,并且进行解析
  4. 4.调用RRD来进行计算并最后写成XML

这种方式没有亲测

Bulk Mode with NDO

这种模式在官方文档中并没有出现,其思路来源于<系统架构师>一书.使用NDO的模式可以实现和nagios完全异步并且nagios无需配置性能数据处理选项.另外使用NDO还可以实现类似Gearman模式的Nagios和pnp4Nagios运行在不同的机器上

Bulk-NDO.png

  1. 1.执行插件获得性能数据
  2. 2.ndo-mod自动将性能数据插入数据库
  3. 3.定制crontab计划.定期的调用ndo2pnp.pl文件.从数据库中读出需要的数据
  4. 4.再调用process_perfdata.pl.处理数据 生成XML

Bulk Mode with NDO的部署方式

  1. Bulk Mode with NDO的部署比较简单.
  2. 1.确定NDO已经安装配置完毕.
  3. 2.复制process_ndo2pnp.sh,ndo2pnp.pl到nagios下的libexec/
  4. 3.确认process_ndo2pnp.sh内mysql的用户密码正确.
  5. 4.切换到nagios用户下,新建crontab任务:
  6. */1 * * * * /usr/local/nagios/libexec/process_ndo2pnp.sh 1&2>/dev/null
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号