nagios详解

  • 时间:2014-01-02
  • 方式:原创

目录  
1   NAGIOS介绍    
    1.1 NAGIOS的简介 
    1.2 NAGIOS的工作原理   
2   NAGIOS搭建    
    2.1 基础安装    
    2.2 NAGIOS安装    
    2.3 APACHE配置    
    2.4 带安全认证的配置    
    2.5 NAGIOS汉化    
3   NAGIOS配置    
    3.1 配置简介    
    3.2 定义检查时间段   
    3.3 定义联系人 
    3.4 定义宏及命令  
    3.5 定义HOST及HOST组    
    3.6 定义服务及服务组    
    3.7 综合  
4   远程监控    
    4.1 使用NRPE做NAGIOS主动监控 
    4.1.1   NRPE安装  
    4.1.2   NRPE使用  
    4.2 使用NSCA做NAGIOS被动监控 
    4.2.1   NSCA安装  
    4.2.2   NSCA使用  
    4.3 NSCP使用  
5   NAGIOS插件扩展  
6   报警方式扩展支持    
7   数据存储    
    7.1 文件存储    
    7.2 Ndoutils    
    7.2.1   Ndoutils安装  
    7.2.2   Ndoutils表说明   
8   管理NAGIOS的配置文件 
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.以便于在远程执行相关的命令.

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

gcc-4.1.2-54.el5
glibc-2.5-107.el5_9.5
glibc-common-2.5-107.el5_9.5
gd-2.0.33-9.4.el5_4.2
package gd-devel is not installed
package xinetd is not installed
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下执行

wget http://archive.apache.org/dist/httpd/httpd-2.2.23.tar.gz
tar zxvf httpd-2.2.23.tar.gz
cd httpd-2.2.23
./configure --prefix=/usr/local/apache2
make && make install


mkdir /usr/local/php
wget http://cn2.php.net/distributions/php-5.4.10.tar.gz
tar zxvf php-5.4.10.tar.gz
cd php-5.4.10
./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs
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

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

重启mysql服务即可 service mysqld restart

2.2 Nagios安装

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

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

安装Nagios

wget http://hivelocity.dl.sourceforge.net/project/nagios/nagios-4.x/nagios-4.0.0/nagios-4.0.0.tar.gz
tar zxvf  nagios-4.0.0.tar.gz
cd nagios
./configure --prefix=/usr/local/nagios
make all
make install
make install-init
make install-config
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个目录的作用是:

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

2.3 Apache配置

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

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

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

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

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

vi /usr/local/apache2/conf/httpd.conf

找到
    User daemon 
    Group daemon 
修改为 
    User nagios 
    Group nagios


然后找到 
    <IfModule dir_module> 
      DirectoryIndex index.html 
    </IfModule> 
修改为 
    <IfModule dir_module> 
      DirectoryIndex index.html index.php 
    </IfModule>

接着增加如下内容:

AddType application/x-httpd-php .php 

ScriptAlias /nagios/cgi-bin "/usr/local/nagios/sbin"
<Directory "/usr/local/nagios/sbin">
     Allow from all
</Directory>

Alias /nagios "/usr/local/nagios/share"
<Directory "/usr/local/nagios/share">
     Allow from all
</Directory>

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

/usr/local/apache2/bin/apachectl start

访问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地址的访问控制的写法如下

vi /usr/local/apache2/conf/httpd.conf

#setting for nagios 
ScriptAlias /nagios/cgi-bin "/usr/local/nagios/sbin" 
<Directory "/usr/local/nagios/sbin"> 
     AuthType Basic 
     Options ExecCGI 
     AllowOverride None 
     Order allow,deny 
     Allow from all 
     AuthName "Nagios Access" 
     AuthUserFile /usr/local/nagios/etc/htpasswd             //用于此目录访问身份验证的文件 
     Require valid-user 
</Directory> 
Alias /nagios "/usr/local/nagios/share" 
<Directory "/usr/local/nagios/share"> 
     AuthType Basic 
     Options None 
     AllowOverride None 
     Order allow,deny 
     Allow from all 
     AuthName "nagios Access" 
     AuthUserFile /usr/local/nagios/etc/htpasswd 
     Require valid-user 
</Directory>

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

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

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

authorized_for_system_information=nagiosadmin, <你的账号>
authorized_for_configuration_information=nagiosadmin, <你的账号>
authorized_for_system_commands= <你的账号>
authorized_for_all_services=nagiosadmin, <你的账号>
authorized_for_all_hosts=nagiosadmin, <你的账号>
authorized_for_all_service_commands=nagiosadmin, <你的账号>
authorized_for_all_host_commands=nagiosadmin, <你的账号>

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

2.5 Nagios汉化

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

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

wget http://softlayer-dal.dl.sourceforge.net/project/nagios-cn/sourcecode/zh_CN%203.2.3/nagios-cn-3.2.3.tar.bz2
bzip2 -d nagios-cn-3.2.3.tar.bz2
tar xvf nagios-cn-3.2.3.tar
cd nagios-cn-3.2.3
./configure --prefix=/usr/local/nagios
make all
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来验证配置文件是否正确.如果配置有误.该工具会准确的提示错误的文件及行号.

配置文件 说明

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

3.2 定义检查时间段

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

define timeperiod{
    timeperiod_name     24x7                            #名称
    alias               24 Hours A Day, 7 Days A Week       #别名
    sunday              00:00-24:00                     #监控范围
    monday              00:00-24:00
    tuesday             00:00-24:00
    wednesday           00:00-24:00
    thursday            00:00-24:00
    friday              00:00-24:00
    saturday            00:00-24:00
}

3.3 定义联系人

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

define contact{
    contact_name    联系人的名称
    alias   联系人别名
    contactgroups   联系人的组名称//这里不是加入组 而是引用组
    host_notifications_enabled  [0/1]是否发送主机通知
    service_notifications_enabled   [0/1]是否发送服务通知
    host_notification_period    主机通知时间段
    service_notification_period 服务通知时间段
    host_notification_options   [d,u,r,n]定义哪些状态下可以发送
    service_notification_options    [w,u,c,r,n] 定义哪些状态下可以发送
    host_notification_commands  需要通知时的发送命令
    service_notification_commands   需要通知时的发送命令
    email   定义收件人的邮件地址$CONTACTEMAIL$
    pager   寻呼机?
    addressx    定义通讯地址,手机等$CONTACTADDRESSx$
    retain_status_information   [0/1]是否允许状态信息保留
    retain_nonstatus_information    [0/1]是否允许非状态信息保留
    }



define contactgroup{
    contactgroup_name   组名
    alias   组别名
    members 将联系人加入该组
    contactgroup_members    将分组加入该组
    }

3.4 定义宏及命令

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

定义命令

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

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

3.5 定义Host及Host组

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

define host{
    host_name   主机名, $HOSTNAME$使用的是这个字段
    alias   别名$HOSTALIAS$使用了这个字段
    display_name    显示名称
    address IP地址
    hostgroups  Host所在的主机组 以逗号分割
    check_command   指定检查主机的命令
    max_check_attempts  对主机最大的检查次数.如果不想检查主机是否存活check_command留空. max_check_attempts这个值最少是1用于表示检查到几次异常报警
    check_interval  检查时间间隔.单位是分钟
    retry_interval  重试次数.发现异常后多久重试一次,触发到重试上限后发送异常报警 单位是分钟
    active_checks_enabled   [0/1] 是否启用主动监控
    passive_checks_enabled  [0/1] 是否启动被动监控
    check_period    定义需要检查的时间段.需要在时间段文档中定义
    event_handler   自定义事件处理程序.(主机UP/Down是生效)
    event_handler_enabled   [0/1]是否启动事件处理程序
    process_perf_data   [0/1] 设定启用进程性能数据记录
    retain_status_information   [0/1] 设定启用状态信息保存功能。当Nagios重新启动的时候不会是空数据,而是先显示上次离线时最后保留的状态数据。
    retain_nonstatus_information    [0/1] 设定启用非状态信息保存功能。当Nagios重新启动的时候不会是空数据,而是先显示上次离线时最后保留的非状态数据。
    contacts    通知人
    contact_groups  通知组
    notification_interval   主机在故障后 再次发送通知的间隔时间
    first_notification_delay    主机故障后 第一次发送时间的延迟
    notification_period 主机故障时发送通知的时间范围
    notification_options    [d,u,r] d代表down奔溃;u代表不可达 r代表recover恢复
    notifications_enabled   [0/1]  是否发送通知
    register    0 表示是一个模板

    use generic-host    #use 表示引用
    }   

define hostgroup{
    hostgroup_name  Host组名
    alias   组别名
    members 填写已经声明的host 将host引入该组,以逗号分隔
    hostgroup_members   填写已经声明的组 引入子组
    notes   说明 用于界面显示
}

3.6 定义服务及服务组

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

define service{
    host_name   主机名,这里指定的是host的名字 多个host之前用,隔开
    hostgroup_name  组名.监控主机组上的所有服务.通常host_name和group只指定一个
    service_description 服务的描述信息
    display_name    服务的显示名称
    parents 服务依赖 很少使用到
    servicegroups   指定多个服务组 使多个服务组使用相同配置
    check_command   用于检查这个服务的命令
    max_check_attempts  重试次数
    check_interval  检查间隔
    retry_interval  重试间隔
    active_checks_enabled   主动监控
    passive_checks_enabled  被动监控
    check_period    监控的时间范围
    event_handler   自定义事件处理
    event_handler_enabled   启用事件处理
    process_perf_data   [0/1] 记录性能参数
    retain_status_information   [0/1] 设定启用状态信息保存功能。当Nagios重新启动的时候不会是空数据,而是先显示上次离线时最后保留的状态数据。
    retain_nonstatus_information    [0/1] 设定启用非状态信息保存功能。当Nagios重新启动的时候不会是空数据,而是先显示上次离线时最后保留的非状态数据。
    notification_interval   主机在故障后 再次发送通知的间隔时间
    first_notification_delay    通知延迟
    notification_period 主机故障时发送通知的时间范围
    notification_options    [w,u,c,r,] w代表warning告警 u代表unknown未知 c代表critical严重 r代表recover恢复 d代表down奔溃
    notifications_enabled   [0/1] 是否通知
    contacts    联系人
    contact_groups  联系人组
    }


define servicegroup{
    servicegroup_name   服务组名称
    alias   服务组名称
    members 将服务加到服务组内
    servicegroup_members    将服务组加到服务组内,子组
    notes   说明 用于界面展示
    }

服务组将已经定义的主机和主机的服务放到一起.主要是用于生成报表.比如运行某一服务的所有机器一周内的情况等.
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插件运行时需要的账号及必要权限

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

下载并安装插件

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

修改目录权限并复制插件

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

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

wget http://prdownloads.sourceforge.net/sourceforge/nagios/nrpe-2.13.tar.gz
tar zxvf nrpe-2.13.tar.gz
cd nrpe-2.13
./configure
make all

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

make install-daemon
make install-daemon-config
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是否安装完成.

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

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

在监控端

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

wget http://prdownloads.sourceforge.net/sourceforge/nagios/nrpe-2.13.tar.gz
tar zxvf nrpe-2.13.tar.gz
cd nrpe-2.13
./configure
make all
make install-plugin

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

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

4.1.2 NRPE使用

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

配置监控主机

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

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

[root@localhost bin]# vi /usr/local/nagios/etc/objects/hosts.cfg 

define host{
        use                    linux-server
        host_name               SolrServer
        alias                   192.168.39.251
        address                 192.168.39.251
 }
#定义一个主机组
define hostgroup{
        hostgroup_name          bsmart-servers
        alias                    bsmart servers
        members                SolrServer
 }

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

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

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

[root@localhost bin]# vi /usr/local/nagios/etc/objects/services.cfg 

define service{
        use                     local-service
        host_name               SolrServer
        service_description     checkSolr
        check_command           check_nrpe!check_solr
}

重启nagios以加载配置

/etc/init.d/nagios restart

配置被监控主机

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

[root@localhost etc]# vi /usr/local/nagios/etc/nrpe.cfg
追加..
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

wget http://nchc.dl.sourceforge.net/sourceforge/nagios/nsca-2.7.2.tar.gz
tar zxvf nsca-2.7.2.tar.gz
cd nsca-2.7.2
./configure
make all
cp src/nsca /usr/local/nagios/bin/
cp src/ send_nsca /usr/local/nagios/bin/
cp sample-config/nsca.cfg /usr/local/nagios/etc/
cp sample-config/send_nsca.cfg /usr/local/nagios/etc/
cp sample-config/nsca.xinetd /etc/xinetd.d/nsca
chomd 777 /usr/local/nagios/etc/

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

nsca            5667/tcp                        #NRPE

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

启动service xinetd start

被监控主机

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

wget http://nchc.dl.sourceforge.net/sourceforge/nagios/nsca-2.7.2.tar.gz
tar zxvf nsca-2.7.2.tar.gz
cd nsca-2.7.2
./configure
make all
cp src/nsca /usr/local/nagios/bin/
cp src/ send_nsca /usr/local/nagios/bin/
cp sample-config/nsca.cfg /usr/local/nagios/etc/
cp sample-config/send_nsca.cfg /usr/local/nagios/etc/
cp sample-config/nsca.xinetd /etc/xinetd.d/nsca
chomd 777 /usr/local/nagios/etc/

4.2.2 NSCA使用

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

监控主机

定义监控所需要的命令

define command{
        command_name        check_dummy
        command_line        /usr/local/nagios/libexec/check_dummy $ARG1$
}

定义监控所需要的服务

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

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

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

service xinetd restart
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的状态

/usr/local/nsca-2.7.2/src/send_nsca 是发送脚本所在的位置
-H                              是nagios的主机地址
-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.定义要监控的项目

定义命令

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

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

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

5 Nagios插件扩展

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

插件的协议

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

插件返回值 服务状态    主机状态
0   正常(OK)  运行(UP)
1   告警(WARNING) 运行(UP)但是出现问题
2   紧急(CRITICAL)    宕机(DOWN)
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 定义插件的命令(编辑commands.cfg)
2 定义要监控的服务(编辑localhost.cfg)

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

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

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

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

插件编写和配置示例

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

Python部分的代码如下:

#!/usr/bin/env python


import urllib, json, sys
from optparse import OptionParser

def listcores():
    status_cmd  = baseurl + core_admin_url + urllib.urlencode({'action':'status','wt':'json'})
    cores       = []

    res         = urllib.urlopen(status_cmd)
    data        = json.loads(res.read())

    core_data   = data['status']

    for core_name in core_data:
        cores.append(core_name)

    return cores

def solrping(core):
    ping_cmd = baseurl + core + '/admin/ping?' + urllib.urlencode({'wt':'json'})

    res = urllib.urlopen(ping_cmd)
    data = json.loads(res.read())

    status = data.get('status')

    return status

def main():
    global baseurl, core_admin_url, threshold_warn, threshold_crit

    cmd_parser = OptionParser(version="%prog 0.1")
    cmd_parser.add_option("-p", "--port", type="string", action="store", dest="solr_server_port", help="SOLR Server port")
    cmd_parser.add_option("-W", "--webapp", type="string", action="store", dest="solr_server_webapp", help="SOLR Server webapp path")

    (cmd_options, cmd_args) = cmd_parser.parse_args()

    if not (cmd_options.solr_server_port and cmd_options.solr_server_webapp):
        cmd_parser.print_help()
        return(3)

    solr_server         = "127.0.0.1"
    solr_server_port    = cmd_options.solr_server_port
    solr_server_webapp  = cmd_options.solr_server_webapp

    core_admin_url      = 'admin/cores?'
    baseurl             = 'http://' + solr_server + ':' + solr_server_port + '/' +  solr_server_webapp + '/'

    pingerrors          = []

    try:
        cores = listcores()
    except IOError as (errno, strerror):
        print "CRITICAL: {0} - {1}".format(errno,strerror)
        return(2)
    except (ValueError, TypeError):
        print "CRITICAL: probably couldn't format JSON data, check SOLR is ok"
        return(3)
    except:
        print "CRITICAL: Unknown error" 
        return(3)

    # XXX: This is ugly...
    try:
        for core in cores:
            if solrping(core) != 'OK':
                pingerrors.append(core)
    except IOError as (errno, strerror):
        print "CRITICAL: {0} {1} ".format(errno, strerror)
        return(2)
    except KeyError as strerror:
        if 'slave' in strerror: 
            print "CRITCAL: This doesn't seem to be a slave, are you sure you meant to call -r?"
            return(2)
        else:
            print "CRITICAL: unknown error (error string: {0})".format(strerror)
            print strerror
            return(3)

    if pingerrors:
        print "CRITICAL: error pinging core(s) - ",
        print ", ".join(pingerrors)
        return(2)
    else:
        print "OK: no issues"
        return(0)

if __name__ == '__main__':
    sys.exit(main())

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

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

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

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

[root@localhost bin]# vi /usr/local/nagios/etc/objects/commands.cfg

追加..

define command{
command_name    check_solr
 command_line    python /usr/local/nagios/plugins/check_solr.py -W $ARG1$ -p $ARG2$
}

[root@localhost bin]# vi /usr/local/nagios/etc/objects/localhost.cfg  
追加…

define service{
        use                             local-service
        host_name                       localhost
        service_description                     CheckSolr
        check_period                        24x7
        check_command                       check_solr!solr!8080
        notifications_enabled                   0
}

验证插件的正确性

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

重启服务

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

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

在NRPE下扩展自己的插件

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

package com.iflytek.nagiosPlus;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class SolrCheck {

    /**
     * 简单的下载方法
     * */
    public String getUrl(String urlStr){
        try{
            URL url = new URL(urlStr);
            HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
            httpConn.connect();
            InputStream cin = httpConn.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(cin,
                    "UTF-8"));
            StringBuffer sb = new StringBuffer();
            String rl = null;
            while ((rl = reader.readLine()) != null) {
                sb.append(rl).append(System.getProperty("line.separator"));
            }
            return sb.toString();
        }catch(Exception e){
            return null;
        }
    }

    private String formatstr = "java solr_check -p [port] -W [slor webapp]";

    /**
     * 处理命令行的参数
     * */
    private CommandLine parseOptions(String[] args) {
        Options opt = new Options();
        opt.addOption("p", true, "solr_server_port");
        opt.addOption("W", true, "solr_server_webapp");
        HelpFormatter formatter = new HelpFormatter();
        CommandLineParser parser = new PosixParser();
        CommandLine cl = null;
        try {
            // 处理Options和参数
            cl = parser.parse(opt, args);
        } catch (ParseException e) {
            formatter.printHelp(formatstr, new Options()); // 如果发生异常,则打印出帮助信息
            System.exit(3);
        }

        if (!cl.hasOption("p") || !cl.hasOption("W")) {
            formatter.printHelp(formatstr, new Options()); // 如果发生异常,则打印出帮助信息
            System.exit(3);
        }
        return cl;
    }

    /**
     * 依据URL获取到集合,并且返回所有的集合的名称
     * */
    private ArrayList<String> listcores(String baseurl) {
        String status_cmd = baseurl + "admin/cores?action=status&wt=json";
        String src = getUrl(status_cmd);
        if (src == null || src.equals(""))
            return null;

        ObjectMapper mapper = new ObjectMapper();
        ArrayList<String> result = new ArrayList<String>();
        try {
            JsonNode rootNode = mapper.readValue(src, JsonNode.class);
            JsonNode jsonArr = rootNode.get("status");
            Iterator<JsonNode> it = jsonArr.iterator();
            while (it.hasNext()) {
                JsonNode cur = it.next();
                result.add(cur.get("name").textValue());
            }
        } catch (JsonParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JsonMappingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return result;
    }

    /**
     * 获取到collection的ping值是否正常
     * */
    private String solrping(String baseurl, String core) {

        String ping_cmd = baseurl + core + "/admin/ping?wt=json";
        String src = getUrl(ping_cmd);

        if (src == null || src.equals(""))
            return null;

        ObjectMapper mapper = new ObjectMapper();
        try {
            JsonNode rootNode = mapper.readValue(src, JsonNode.class);
            JsonNode jsonArr = rootNode.get("status");
            return jsonArr.textValue();
        } catch (JsonParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JsonMappingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return null;
    }

    public static void main(String[] args) {
        SolrCheck solrCheck = new SolrCheck();
        CommandLine cl = solrCheck.parseOptions(args);
        String ip = "127.0.0.1";
        String port = cl.getOptionValue("p");
        String webapp = cl.getOptionValue("W");

        String baseurl = "http://" + ip + ":" + port + "/" + webapp + "/";
        ArrayList<String> cores = solrCheck.listcores(baseurl);

        if(cores==null){
            System.err.println("CRITICAL: probably couldn't format JSON data, check SOLR is ok");
            System.exit(3);
        }

        ArrayList<String> errCores = new ArrayList<String>();
        String resultErr = "CRITICAL: error pinging core(s) - ";
        for (String core : cores) {
            if (!solrCheck.solrping(baseurl, core).equals("OK")) {
                errCores.add(core);
                resultErr += core + ",";
            }
        }

        if (errCores.size() == 0) {
            System.err.println("OK: no issues");
            System.exit(0);
        } else {
            System.err.println(resultErr);
            System.exit(3);
        }

    }
}

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

下载fatjar
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后. 验证插件的有效性

[root@localhost myPlugin]# java -jar check_solr.jar -W solr -p 8080
OK: no issues

在主机上
配置加载NRPE插件.如果NRPE已经配置过了 则可跳过

[root@localhost bin]# vi /usr/local/nagios/etc/objects/commands.cfg

追加..

define command{
        command_name    check_nrpe
        command_line    $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
}


配置host以及host .如果配置过 则可以跳过
[root@localhost bin]# vi /usr/local/nagios/etc/objects/hosts.cfg 

define host{
        use                     linux-server
        host_name               SolrServer
        alias                   192.168.39.251
        address                 192.168.39.251
        }
#定义一个主机组
define hostgroup{
        hostgroup_name          bsmart-servers
        alias                   bsmart servers
        members                 SolrServer
        }

配置需要监控的服务
[root@localhost bin]# vi /usr/local/nagios/etc/objects/services.cfg 

define service{
        use                     local-service
        host_name               SolrServer
        service_description           checkSolr
        check_command           check_nrpe!check_solr
}


在需要监控的机器上修改配置文件

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



重启服务(主机)
[root@localhost bin]# /etc/init.d/nagios restart   


重启服务(监控机)
[root@localhost bin]# service xinetd restart


访问nagios可以看到.

6 报警方式扩展支持

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

扩展飞信报警

wget http://www.rarlab.com/rar/rarlinux-3.8.0.tar.gz  
tar zxvf rarlinux-3.8.0.tar.gz   
cd rar  
make install  

wget http://www.it-adv.net/fetion/linuxso_20101113.rar  
unrar x linuxso_20101113.rar  
cp lib*so* /usr/lib  
echo "/usr/lib" >> /etc/ld.so.conf  
ldconfig  

chmod 777 fetion   
chown nagios:nagios fetion  
./fetion --mobile=18756975268 --pwd=XXXXXX --to=<phone> --msg-utf8=test

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

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

define command {  
    command_name    notify-host-by-fei  
    command_line    /usr/local/fetion --mobile=<phone> --pwd=<ps> --to=$CONTACTPAGER$ --msg-utf8="Host $HOSTSTATE$ alert for $HOSTNAME$! on '$LONGDATETIME$'" 
}  

define command {  
    command_name         notify-service-by-fei  
    command_line         /usr/local/fetion --mobile=<phone> --pwd=<ps> --to=$CONTACTPAGER$ --msg-utf8="$HOSTADDRESS$ $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ on $LONGDATETIME$" 
}  

在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.  检测过程的性能数据
2.  插件返回的性能数据

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

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

process_performance_data=1
host_perfdata_file=/usr/local/nagios/var/host-perfdata
service_perfdata_file=/usr/local/nagios/var/service-perfdata
host_perfdata_file_template=[HOSTPERFDATA]\t$TIMET$\t$HOSTNAME$\t$HOSTEXECUTIONTIME$\t$HOSTOUTPUT$\t$HOSTPERFDATA$
service_perfdata_file_template=[SERVICEPERFDATA]\t$TIMET$\t$HOSTNAME$\t$SERVICEDESC$\t$SERVICEEXECUTIONTIME$\t$SERVICELATENCY$\t$SERVICEOUTPUT$\t$SERVICEPERFDATA$

// process_performance_data是否启动性能数据收集
// host_perfdata_file文件位置
// service_perfdata_file 文件位置
// host_perfdata_file_template 写文件时的格式化数据
// service_perfdata_file_template写文件时的格式化数据

//现在对于如何定时清空日志还不清楚

7.2 Ndoutils

7.2.1 Ndoutils安装

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

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

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

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\_id Object的ID,在其他的各个表中都有引用
name1 Host名称,命令名称等
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\_id host在表中的唯一标识
host\_object\_id host在object表中的唯一标识
notification\_interval 通知间隔时间

3. nagios_hostgroups

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

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

4. nagios_hostgroup_members

nagios_hostgroup_members是存储host和hostgroup关系的表

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

5. nagios_hoststatus

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

字段名称 示意
host\_object\_id host在object表中的ID
output 插件返回的正常的显示数据
perfdata 插件返回的性能数据
current\_state 插件返回的状态值
current\_check\_attempt 当前的重试次数
max\_check\_attempts 最大的重试次数
last\_check 最后一次检查时间
next\_check 下一次检查时间
last\_notification 最后一次通知时间
next\_notification 下一次通知时间
notifications\_enabled host在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\_id host在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\_id host在object表中的唯一标识
service\_object\_id service表中的唯一标示
notification\_interval 通知间隔时间

8. nagios_servicestatus

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

字段名称 示意
service\_object\_id services在object表中的ID
output 插件返回的正常的显示数据
perfdata 插件返回的性能数据
current\_state 插件返回的状态值
current\_check\_attempt 当前的重试次数
max\_check\_attempts 最大的重试次数
last\_check 最后一次检查时间
next\_check 下一次检查时间
last\_notification 最后一次通知时间
next\_notification 下一次通知时间
notifications\_enabled host在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\_id service在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\_id contact在object表中的唯一标识
alias 名称
email\_address 邮件地址
pager\_address 一般这里可以定义为手机号码
host\_timeperiod\_object\_id Host通知发送的时间范围
notify\_host\_recovery Host在recovery是否发送请求
notify\_host\_down Host在宕机时是否发送请求
notify\_host\_unreachable Host在不可达时是否发送请求
notify\_host\_flapping Host在抖动时是否发送请求
notify\_host\_downtime Host在计划关机时是否发送请求
service\_timeperiod\_object\_id service通知发送的时间范围
notify\_service\_recovery service在recovery是否发送请求
notify\_service\_down service在宕机时是否发送请求
notify\_service\_unreachable service在不可达时是否发送请求
notify\_service\_flapping service在抖动时是否发送请求
notify\_service\_downtime service在计划关机时是否发送请求

11. nagios_contactgroups

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

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

12. nagios_contactgroup_members

nagios_contactgroup_members是存储contact和contactgroup关系的表

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

13. nagios_host_contacts

nagios_host_contacts是存储host和contacts关系的表

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

14. nagios_host_contactgroups

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

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

15. nagios_service_contacts

nagios_service_contacts是存储service和contacts关系的表

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

16. nagios_service_contactgroups

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

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

命令

17. nagios_commands

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

字段名称 示意
commands commands表的唯一ID
object\_id commands表在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\_id nagios\_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插件可以使用动态扩展和从新编译两种.这里使用的是重新编译.

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

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

tar zxvf nagiosql_311.tar.gz 
cd nagiosql

chown -R nagios:nagios /usr/local/nagios/nagiosql
chmod -R 777 /usr/local/nagios/nagiosql/config
#赋值权限

mkdir etc/hosts
mkdir etc/services
mkdir etc/backup/services
mkdir -p etc/backup/services
mkdir -p etc/backup/hosts
chown -R nagios:nagios etc
#创建后面需要的目录

cd /usr/local/nagios/nagiosql/install
touch ./ENABLE_INSTALLER
#启动安装

#修改apache的目录.指向nagiosQL的目录
Alias /nagiosQL "/usr/local/nagios/nagiosql"
<Directory "/usr/local/nagios/nagiosql">
    # SSLRequireSSL
    Options None
    AllowOverride None
    Order allow,deny
    Allow from all
</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:

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

yum -y install rrdtool

2.下载安装pnp4nagios

wget http://sourceforge.net/projects/pnp4nagios/files/PNP-0.6/pnp4nagios-0.6.19.tar.gz/download
tar zxvf   pnp4nagios-0.6.19.tar.gz 
cd pnp4nagios-0.6.19
./configure --prefix=/usr/local/pnp4nagios   --with-nagios-user=nagios 

make all
make fullinstall
#安装pnp4nagios

mv share/install.php share/install.php.bak
ln -s /usr/local/pnp4nagios/ /usr/local/apache2/htdocs/pnp4nagios   
#建立软连接用于页面访问

3.重命名配置文件

cd /usr/local/pnp4nagios/etc
mv misccommands.cfg-sample  misccommands.cfg
mv nagios.cfg-sample  nagios.cfg
mv rra.cfg-sample rra.cfg

cd pages
mv web_traffic.cfg-sample web_traffic.cfg

cd ../check_commands
mv check_all_local_disks.cfg-sample  check_all_local_disks.cfg
mv check_nrpe.cfg-sample  check_nrpe.cfg
mv check_nwstat.cfg-sample  check_nwstat.cfg

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

打开performance_data
cd /usr/local/nagios/etc
vim nagios.cfg
#打开注视项:
process_performance_data=1
host_perfdata_command=process-host-perfdata
service_perfdata_command=process-service-perfdata
#修改 commands.cfg
cd /usr/local/nagios/etc/objects
vim commands.cfg
##添加
# 'process-host-perfdata' command definition
define command{
    command_name    process-host-perfdata
    command_line    /usr/local/pnp4nagios/libexec/process_perfdata.pl
}
# 'process-service-perfdata' command definition
define command{
    command_name    process-service-perfdata
    command_line    /usr/local/pnp4nagios/libexec/process_perfdata.pl
}

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

vim templates.cfg
## 在最后添加
define host {
    name       host-pnp
    action_url /pnp4nagios/graph?host=$HOSTNAME$&srv=_HOST_
    register   0
}
define service {
    name       srv-pnp
    action_url /pnp4nagios/graph?host=$HOSTNAME$&srv=$SERVICEDESC$
    register   0
}


#修改需要显示的监控项的use属性,如

define host{
        use                     linux-server,host-pnp  
        …
# 修改 services.cfg
define service{
        use                                     local-service,srv-pnp      
        …;

6.启动服务

/etc/init.d/npcd restart

即可看到

pnp.png

PNP4Nagios多种模式说明

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

Synchronous Mode

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

synchronous.png

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

Synchronous Mode的部署方式

1.在nagios.cfg中修改如下
    process\_performance\_data=1
    service_perfdata_command=process-service-perfdata
    host_perfdata_command=process-host-perfdata
2.定义命令
    define command {
           command_name    process-service-perfdata
           command_line    /usr/bin/perl /usr/local/pnp4nagios/libexec/process_perfdata.pl
    }
    define command {
           command_name    process-host-perfdata
           command_line    /usr/bin/perl /usr/local/pnp4nagios/libexec/process_perfdata.pl -d HOSTPERFDATA
    }

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

Bulk Mode

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

bulk.png

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

Bulk Mode的部署方式

1.在nagios.cfg中修改如下
    process\_performance\_data=1

    service_perfdata_file=/usr/local/pnp4nagios/var/service-perfdata
    service_perfdata_file_template=DATATYPE::SERVICEPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tSERVICEDESC::$SERVICEDESC$\tSERVICEPERFDATA::$SERVICEPERFDATA$\tSERVICECHECKCOMMAND::$SERVICECHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$\tSERVICESTATE::$SERVICESTATE$\tSERVICESTATETYPE::$SERVICESTATETYPE$
    service_perfdata_file_mode=a
    service_perfdata_file_processing_interval=15
    service_perfdata_file_processing_command=process-service-perfdata-file

    host_perfdata_file=/usr/local/pnp4nagios/var/host-perfdata
    host_perfdata_file_template=DATATYPE::HOSTPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tHOSTPERFDATA::$HOSTPERFDATA$\tHOSTCHECKCOMMAND::$HOSTCHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$
    host_perfdata_file_mode=a
    host_perfdata_file_processing_interval=15
    host_perfdata_file_processing_command=process-host-perfdata-file

2.定义命令
    define command{
           command_name    process-service-perfdata-file
           command_line    /usr/local/pnp4nagios/libexec/process_perfdata.pl --bulk=/usr/local/pnp4nagios/var/service-perfdata
    }

    define command{
           command_name    process-host-perfdata-file
           command_line    /usr/local/pnp4nagios/libexec/process_perfdata.pl --bulk=/usr/local/pnp4nagios/var/host-perfdata
    }

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

Bulk Mode with NPCD的部署方式

1.在nagios.cfg中修改如下
    process\_performance\_data=1

    service_perfdata_file=/usr/local/pnp4nagios/var/service-perfdata
    service_perfdata_file_template=DATATYPE::SERVICEPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tSERVICEDESC::$SERVICEDESC$\tSERVICEPERFDATA::$SERVICEPERFDATA$\tSERVICECHECKCOMMAND::$SERVICECHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$\tSERVICESTATE::$SERVICESTATE$\tSERVICESTATETYPE::$SERVICESTATETYPE$
    service_perfdata_file_mode=a
    service_perfdata_file_processing_interval=15
    service_perfdata_file_processing_command=process-service-perfdata-file

    host_perfdata_file=/usr/local/pnp4nagios/var/host-perfdata
    host_perfdata_file_template=DATATYPE::HOSTPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tHOSTPERFDATA::$HOSTPERFDATA$\tHOSTCHECKCOMMAND::$HOSTCHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$
    host_perfdata_file_mode=a
    host_perfdata_file_processing_interval=15
    host_perfdata_file_processing_command=process-host-perfdata-file

2.定义命令
    define command{
           command_name    process-service-perfdata-file
           command_line    /bin/mv /usr/local/pnp4nagios/var/service-perfdata /usr/local/pnp4nagios/var/spool/service-perfdata.$TIMET$
    }

    define command{
           command_name    process-host-perfdata-file
           command_line    /bin/mv /usr/local/pnp4nagios/var/host-perfdata /usr/local/pnp4nagios/var/spool/host-perfdata.$TIMET$
    }

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

Bulk Mode with NPCD and npcdmod

在nagios.cfg中修改如下
    process_performance_data=1
    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.执行插件获得性能数据
2.mod_gearman将这些性能数据存储在队列内
3.pl通过gearman获取到性能数据,并且进行解析
4.调用RRD来进行计算并最后写成XML

这种方式没有亲测

Bulk Mode with NDO

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

Bulk-NDO.png

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

Bulk Mode with NDO的部署方式

Bulk Mode with NDO的部署比较简单.
1.确定NDO已经安装配置完毕.
2.复制process_ndo2pnp.sh,ndo2pnp.pl到nagios下的libexec/
3.确认process_ndo2pnp.sh内mysql的用户密码正确.
4.切换到nagios用户下,新建crontab任务:
    */1 * * * * /usr/local/nagios/libexec/process_ndo2pnp.sh 1&2>/dev/null