Linux下nagios的安装与配置

nagios struggling 1395次浏览 0个评论
文章目录

一、Nagios概述

1、简介

Nagios是插件式的结构,它本身没有任何监控功能,所有的监控都是通过插件进行的,因此其是高度模块化和富于弹性的。Nagios监控的对象可分为两类:主机和服务。主机通常指的是物理主机,如服务器、路由器、工作站和打印机等,这里的主机也可以是虚拟设备,如xen虚拟出的Linux系统;而服务通常指某个特定的功能,如提供http服务的httpd进程等。而为了管理上的方便,主机和服务还可以分别被规划为主机组和服务组等。

Nagios不监控任何具体数值指标(如操作系统上的进程个数),它仅用四种抽象属性对被监控对象的状态进行描述:0(OK)表示状态正常/绿色、1(WARNING)表示出现警告/黄色、2(CRITICAL)表示出现非常严重的错误/红色、3(UNKNOWN)表示未知错误/深黄色。于是,管理员只需要对某种被监控对象的WARNING和CRITICAL状态的阈值进行关注和定义即可。Nagios通过将WARTING和CRTICAL的阈值传递给插件,并由插件负责某具体对象的监控及结果分析,其输出信息为状态信息(OK,WARNING,CRITICAL或UNKOWN)以及一些附加的详细说明信息。

2、特性

由上述说明可以,Nagios是极富弹性的,其监控功能完全可以按照管理员的期望进行。此外,它外提供了对问题的自动响应能力和一个功能强大的通知系统。所有这些功能的实现是基于一个结构明晰的对象定义系统和少数几个对象类型实现的。

1) 命令(Commands)

“命令”用于定义Nagios如何执行某特定的监控工作。它是基于某特定的Nagios插件定义出的一个抽象层,通常包含一组要执行的操作。

2)时段(Time periods)

“时段”用于定义某“操作”可以执行或不能执行的日期和时间跨度,如工作日内的每天8:00-18:00等;

3)联系人和联系人组(Contacts and contact groups)

“联系人”用于定义某监控事件的通知对象、要通知的信息以及这些接收通知者何时及如何接收通知;一个或多个联系人可以定义为联系人组,而一个联系人也可以属于多个组;

4) 主机和主机组(host and host groups)

“主机”通常指某物理主机,其包括此主机相关的通知信息的接收者(即联系人)、如何及何时进行监控的定义。主机也可以分组,即主机组(host groups),一个主机可同时属于多个组;

5) 服务(Services)

“服务”通常指某主机上可被监控的特定的功能或资源,其包括此服务相关的通知信息的接收者、如何及何时进行监控等。服务也可以分组,即服务组(Service groups),一个服务可同时属于多个服务组;

3、依赖关系

Nagios的强大功能还表现在其成熟的依赖关系系统上。比如,某路由设备故障必然会导致关联在其上的其它主机无法被正常访问,如果不能定义这些设备间的依赖关系,那么监控系统上必然会出现大量的设备故障信息。而Nagios则通过依赖关系来描述网络设备的拓扑结构,并能够实现在某设备故障时不再对依赖于此设备的其它设备进行检测,从而避免了无谓的故障信息,方便管理员及时定位并排除故障。此外,Nagios的依赖关系还可以在服务级别上实现,如果某服务依赖于其它服务时,也能实现类似主机依赖关系的功能。

4、宏

Nagios还能够使用宏,并且宏的定义在整个Nagios系统中具有一致性。宏是能够用于对象定义中的变量,其值通常依赖于上下文。在“命令”中定义的宏,相对于主机、服务或其它许多参数来说,其值会随之不同。比如,某命令可以根据向其传递的IP地址的不同来监控不同的主机。

5、计划中宕机

Nagios还提供了调度性计划中的宕机机制,管理员可以周期性的设定某主机或服务为计划中的不可用状态。这种功能可以阻止Nagios在调度宕机时段通知任何信息。当然,这也可以让Nagios自动通知管理员该进行主机或服务维护了。

6、软状态和硬状态(Soft and Hard States)

如上所述,Nagios的主要工作是检测主机或服务的状态,并将其存储下来。某一时刻,主机或服务状态仅可以是四种可用状态之一,因此,其状态能够正确反映主机或服务的实际状况就显得特别关键。为了避免某偶然的临时性或随机性问题,Nagios引入了软状态和硬状态。在实际的检测中,Nagios一旦发现某主机或服务的状态为UNKOWN或不同于上一次检测时的状态,其将会对此主机或服务进行多次测试以确保此状态的变动是非偶然性的。具体共要做出几次测试是可以配置的,在这个指定次数的测试时段内,Nagios假设此变化后的状态为软件状态。一旦测试完成后状态仍然为新变的状态时,此状态就成了硬状态。


主要功能:

•  网络服务监控(SMTP、POP3、HTTP、NNTP、ICMP、SNMP、FTP、SSH)

•  主机资源监控(CPU load、disk usage、system logs),也包括Windows主机(使用NSClient++ plugin)

•  可以指定自己编写的Plugin通过网络收集数据来监控任何情况(温度、警告……)

•  可以通过配置Nagios远程执行插件远程执行脚本

•  远程监控支持SSH或SSL加通道方式进行监控

•  简单的plugin设计允许用户很容易的开发自己需要的检查服务,支持很多开发语言(shell scripts、C++、Perl、ruby、Python、PHP、C#等)

•  包含很多图形化数据Plugins(Nagiosgraph、Nagiosgrapher、PNP4Nagios等)

•  可并行服务检查

•  能够定义网络主机的层次,允许逐级检查,就是从父主机开始向下检查

•  当服务或主机出现问题时发出通告,可通过email, pager, sms 或任意用户自定义的plugin进行通知

•  能够自定义事件处理机制重新激活出问题的服务或主机

•  自动日志循环

•  支持冗余监控

•  包括Web界面可以查看当前网络状态,通知,问题历史,日志文件等

二、安装Nagios

1、Nagios程序简介

Nagios通常由一个主程序(Nagios)、一个插件程序(Nagios-plugins)和四个可选的ADDON(NRPE、NSCA、NSClient++和NDOUtils)组成。Nagios的监控工作都是通过插件实现的,因此,Nagios和Nagios-plugins是服务器端工作所必须的组件。而四个ADDON中,NRPE用来在监控的远程Linux/Unix主机上执行脚本插件以实现对这些主机资源的监控;NSCA用来让被监控的远程Linux/Unix主机主动将监控信息发送给Nagios服务器(这在冗余监控模式中特别要用到);

NSClient++是用来监控Windows主机时安装在Windows主机上的组件;而NDOUtils则用来将Nagios的配置信息和各event产生的数据存入数据库,以实现这些数据的快速检索和处理。这四个ADDON(附件)中,NRPE和NSClient++工作于客户端,NDOUtils工作于服务器端,而NSCA则需要同时安装在服务器端和客户端。它们之间的关系如下图所示:

30172017-a0cab434c3184ee48163b3c2f86d0299

目前,Nagios只能安装在Linux系统主机上,其编译需要用到gcc。同时,如果打算使用web界面的管理工具的话,还需要有apache服务器和GD图形库的支持。以下示例基于CentOS6.6进行安装。

监控端: 192.168.1.106
被监控端: 192.168.1.116

2、安装前的准备工作

(1)解决安装Nagios的依赖关系:

Nagios基本组件的运行依赖于httpd、gcc和gd。可以通过以下命令来检查nagios所依赖的rpm包是否已经完全安装:

[root@localhost ~]# yum -y install httpd gcc glibc glibc-common gd gd-devel php php-mysql mysql mysql-devel mysql-server

说明:以上软件包您也可以通过编译源代码的方式安装,只是后面许多要用到的相关文件的路径等需要按照您的源代码安装时的配置逐一修改。此外,您还得按需启动必要的服务,如httpd等。

(2)添加nagios运行所需要的用户和组:

[root@localhost ~]# groupadd nagcmd
[root@localhost ~]# useradd -s /sbin/nologin nagios
[root@localhost ~]# usermod -a -G nagcmd nagios

把apache加入到nagcmd组,以便于在通过web Interface操作nagios时能够具有足够的权限:

[root@localhost ~]# usermod -a -G nagcmd apache

3、编译安装nagios,nagios可以在https://assets.nagios.com/downloads/nagioscore/releases/nagios-4.1.1.tar.gz下载:

[root@localhost ~]# wget https://assets.nagios.com/downloads/nagioscore/releases/nagios-4.1.1.tar.gz
[root@localhost ~]# tar zxfnagios-4.1.1.tar.gz
[root@localhost ~]# cd nagios-4.1.1
[root@localhost nagios-4.1.1]# ./configure --sysconfdir=/etc/nagios --with-command-group=nagcmd --enable-event-broker
[root@localhost nagios-4.1.1]# make all
[root@localhost nagios-4.1.1]# make install
[root@localhost nagios-4.1.1]# make install-init
[root@localhost nagios-4.1.1]# make install-commandmode
[root@localhost nagios-4.1.1]# make install-config

为email指定您想用来接收nagios警告信息的邮件地址,默认是本机的nagios用户:

[root@localhost ~]# vi /usr/local/nagios/etc/objects/contacts.cfg
email nagios@localhost #这个是默认设置

在httpd的配置文件目录(conf.d)中创建Nagios的Web程序配置文件:

[root@localhost ~]# make install-webconf

创建一个登录nagios web程序的用户,这个用户帐号在以后通过web登录nagios认证时所用:

[root@localhost ~]# htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin

以上过程配置结束以后需要重新启动httpd:

[root@localhost ~]# service httpd restart

4、编译、安装nagios-plugins

nagios的所有监控工作都是通过插件完成的,因此,在启动nagios之前还需要为其安装官方提供的插件。nagios插件可以在http://www.nagios-plugins.org/download/nagios-plugins-2.1.1.tar.gz此处下载!

[root@localhost ~]# tar zxf nagios-plugins-2.1.1.tar.gz
[root@localhost ~]# cd nagios-plugins-2.1.1
[root@localhost nagios-plugins-2.1.1]# ./configure --with-nagios-user=nagios --with-nagios-group=nagios
[root@localhost nagios-plugins-2.1.1]# make
[root@localhost nagios-plugins-2.1.1]# make install

5、配置并启动Nagios

(1)把nagios添加为系统服务并将之加入到自动启动服务队列:

[root@localhost ~]# chkconfig --add nagios
[root@localhost ~]# chkconfig nagios on

(2)检查其主配置文件的语法是否正确:

[root@localhost ~]# /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

(3)如果上面的语法检查没有问题,接下来就可以正式启动nagios服务了:

[root@localhost ~]# service nagios start

(5)通过web界面查看nagios:

http://your_nagios_IP/nagios

主界面

登录时需要指定前面设定的web认证帐号和密码。

注意:为了nagios系统的安全,建议您使用信息摘要强认证模式(如MD5),强制使用web的TSL/SSL安全通讯模式,并且通过访问控制列表设定能访问nagios的web界面的客户端地址。

三、配置Nagios

1、Nagios的配置文件

安装完nagios后,由于指定安装目录为/etc/nagios,所以其配置文件默认在此目录。

[root@localhost nagios]# ls -R
.:
cgi.cfg htpasswd.users nagios.cfg objects resource.cfg

./objects:
commands.cfg linhost.cfg printer.cfg templates.cfg windows.cfg
contacts.cfg localhost.cfg switch.cfg timeperiods.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各个配置文件之间是互为关联,彼此引用的。

成功配置出一台nagios监控系统,必须要弄清楚每个配置文件之间依赖与被依赖的关系,最重要的有四点:

第一:定义监控哪些主机、主机组、服务和服务组;

第二:定义这个监控要用什么命令实现;

第三:定义监控的时间段;

第四:定义主机或服务出现问题时要通知的联系人和联系人组。

为了能更清楚的说明问题,同时也为了维护方便,建议将nagios各个定义对象创建独立的配置文件,nagios的配置步骤如下:

  •  创建hosts.cfg文件来定义主机和主机组
  •  创建services.cfg文件来定义服务
  •  用默认的contacts.cfg文件来定义联系人和联系人组
  •  用默认的commands.cfg文件来定义命令
  •  用默认的timeperiods.cfg来定义监控时间段
  •  用默认的templates.cfg文件作为资源引用文件

Nagios的主配置文件为nagios.cfg,其语法非常简洁,通常#开头的行为注释行,而参数的设置格式为=;其中,有些参数是可以重复出现的。其中常用的参数说明如下:

log_file=/usr/local/nagios/var/nagios.log # 定义nagios日志文件的路径
cfg_file=/usr/local/nagios/etc/objects/commands.cfg # “cfg_file”变量用来引用对象配置文件,如果有更多的对象配置文件,在这里依次添加即可。
cfg_file=/usr/local/nagios/etc/objects/contacts.cfg
cfg_file=/usr/local/nagios/etc/objects/hosts.cfg
cfg_file=/usr/local/nagios/etc/objects/services.cfg
cfg_file=/usr/local/nagios/etc/objects/timeperiods.cfg
cfg_file=/usr/local/nagios/etc/objects/templates.cfg
cfg_file=/usr/local/nagios/etc/objects/localhost.cfg # 本机配置文件
cfg_file=/usr/local/nagios/etc/objects/windows.cfg # windows 主机配置文件
object_cache_file=/usr/local/nagios/var/objects.cache # 该变量用于指定一个“所有对象配置文件”的副本文件,或者叫对象缓冲文件
precached_object_file=/usr/local/nagios/var/objects.precache
resource_file=/usr/local/nagios/etc/resource.cfg # 该变量用于指定nagios资源文件的路径,可以在nagios.cfg中定义多个资源文件。
status_file=/usr/local/nagios/var/status.dat # 该变量用于定义一个状态文件,此文件用于保存nagios的当前状态、注释和宕机信息等。
status_update_interval=10 # 该变量用于定义状态文件(即status.dat)的更新时间间隔,单位是秒,最小更新间隔是1秒。
nagios_user=nagios # 该变量指定了Nagios进程使用哪个用户运行。
nagios_group=nagios # 该变量用于指定Nagios使用哪个用户组运行。
check_external_commands=1 # 该变量用于设置是否允许nagios在web监控界面运行cgi命令;
# 也就是是否允许nagios在web界面下执行重启nagios、停止主机/服务检查等操作;
# “1”为运行,“0”为不允许。
command_check_interval=10s # 该变量用于设置nagios对外部命令检测的时间间隔,如果指定了一个数字加一个"s"(如10s);
# 那么外部检测命令的间隔是这个数值以秒为单位的时间间隔;
# 如果没有用"s",那么外部检测命令的间隔是以这个数值的“时间单位”的时间间隔。
interval_length=60 # 该变量指定了nagios的时间单位,默认值是60秒,也就是1分钟;
# 即在nagios配置中所有的时间单位都是分钟。

2、resource_file和宏定义

在主配置文件中,参数resource_file用于定义所有用户变量(即“宏”)的存储文件,它用于存储对象定义中的可以访问的额外信息,如访问某服务的密码等;因此,这些信息通常都是些敏感数据,一般不允许通过Web接口来访问。此文件中可以定义的宏可多达32个,它们分别为$USER1$,$USER2$…$USER32,这些宏一般在check命令中引用。通常情况下$USER1$用于引用Nagios插件所在目录这个路径信息,因此,一般不建议修改其值。

Nagios事先定义了许多宏,它们的值通常依赖于其上下文。如下:


HOSTNAME: 用于引用host_name指定所定义的主机的主机名;每个主机的主机名都是唯一的;

HOSTADDRESS: 用于引用host对象中的address指令的值,它通常可以为IP地址或主机名;

HOSTDISPLAYNAME: 用于引用host对象中alias指令的值,用以描述当前主机,即主机的显示名称;

HOSTSTATE:某主机的当前状态,为UP,DOWN,UNREACHABLE三者之一;

HOSTGROUPNAMES: 用于引用某主机所属的所有主机组的简名,主机组名称之间以逗号分隔;

LASTHOSTCHECK:用于引用某主机上次检测的时间和日期,Unix时间戳格式;

LISTHOSTSTATE:用于引用某主机前一次检测时的状态,为UP,DOWN或UNREACHABLE三者之一;

SERVICEDESC: 用于引用对应service对象中的desccription指令的值;

SERVICESTATE: 用于引用某服务的当前状态,为OK,WARNING,UNKOWN或CRITICAL四者之一;

SERVICEGROUPNAMES: 用于引用某服务所属的所有服务组的简名,服务组名称之间以逗号分隔;

CONTACTNAME: 用于引用某contact对象中contact_name指令的值;

CONTACTALIAS: 用于引用某contact对象中alias指令的值;

CONTACTEMAIL: 用于引用某contact对象中email指令的值;

CONTACTGROUPNAMES: 用于引用某contact所属的所有contact组的简名,contact组名称之间以逗号分隔;


Nagios 3还支持自定义宏,只是它的定义和使用方式比较独特。管理员可以在某类型对象的定义中使用额外的指令,并能够在命令中使用特别格式的宏来引用此指令的值。其引用方式根据对象类型的不同也有所不同,具体如下:

$_HOST$ – 引用在主机对象中定义的指令的值;

$_SERVICE$ – 引用在服务对象中定义的指令的值;

$_CONTACT$ – 引用在联系人对象中定义的指令的值;


一个简单的例子如下:

如某主机定义为:

define host
{
host_name somemachine
address 10.0.0.1
_MAC 12:34:56:78:90:ab
check_command check-host-by-mac
}

对应的检测命令则可以定义为:

define command
{
command_name check-host-by-mac
command_line $USER1$/check_hostmac -H $HOSTADDRESS$ -m $_HOSTMAC$
}

3、定义主机对象

“主机”指的是被监控的机器,可是物理主机,也可以是虚拟设备。一个主机对象的定义至少应该包含一个简名(short name)、一个别名、一个IP地址和用到的检测命令。此外,很多时候,其定义中还应该包含监控时段、联系人及要通知的相关问题、检测的频率、重试检测的方式、发送通知的频率等。具体的各指令及说明请参见官方文档:http://nagios.sourceforge.net/docs/3_0/objectdefinitions.html#host。

一个主机定义的例子:

define host
{
host_name webserver1
hostgroups webservers
alias www.magedu.com
address 172.16.100.11
check_command check-host-alive
check_interval 5
retry_interval 1
max_check_attempts 5
check_period 24x7
contact_groups linux-admins
notification_interval 30
notification_period 24x7
notification_options d,u,r
}

其中的notification_options用于指定当主机处于什么状态时应该发送通知。其各状态及其表示符如下:

d —— DOWN
u —— UNREACHABLE
r —— UP(host recovery)
f —— flapping
s —— 调试宕机时间开始或结束

主机可以被划分成组,这些组即主机组。每一个主机组对象一般包含一个全局唯一的简名、一个描述名以及属于这个组的成员。此外,一个主机组的成员也可以是其它主机组。主机组的定义例子如下:

define hostgroup
{
hostgroup_name webservers
alias Linux web servers
members webserver1
}

4、定义服务对象

“服务”即某“主机”所提供的功能或资源对象,如HTTP服务、存储空间资源或CPU负载等。服务附属于主机,每一个服务使用服务名来标识,此服务名要求在特定的主机上具有唯一性。每一个服务对象还通常定义一个检测命令及如何进行问题通知等。

define service
{
host_name webserver1
service_description www
check_command check_http
check_interval 10
check_period 24x7
retry_interval 3
max_check_attempts 3
notification_interval 30
notification_period 24x7
notification_options w,c,u,r
contact_groups linux-admins
}

其中的notification_options用于指定当服务处于什么状态时应该发送通知。其各状态及其表示符如下:

w —— WARNING

u —— UNKNOWN

c —— CRITICAL

r —— OK(recovery)

f —— flapping

s —— 调试宕机时间开始或结束


与主机对象有所不同的是,有时个,多个主机可能会提供同样的服务,比如多台服务器同时提供Web等。因此,在定义服务对象时,其host_name可以为逗号隔开的多个主机。

服务可以被划分成组,这些组即服务组。每一个服务组对象一般包含一个全局唯一的简名、一个描述名以及属于这个组的成员。此外,一个服务组的成员通常是某主机上的某服务,其指定时使用,的格式,多个服务也使用逗号分隔。服务组的定义例子如下:

define servicegroup
{
servicegroup_name webservices
alias All services related to web
members webserver1,www,webserver2,www
}

5、定义命令对象

“命令”用于描述如何对主机或服务进行状态检测。服务对象的定义包含两个指令:名字(command_name)和命令行(command_line);名字用于标识此命令对象,命令行则是执行检测时真正要执行的命令。

当命令对象用于检测其它对象时,其通常需要用到额外的参数以标识要检测的某特定对象,此时,命令对象需要以command_name[!arg1][!arg2][…]的语法格式进行引用。因此,命令对象的定义中,命令行指令中通常会用到宏$ARG1$, $ARG2$…,对应用于接收[!arg1][!arg2][…]传递而来的参数。

如下命令对象的定义:

define command
{
command_name check_local_swap
command_line $USER1$/check_swap -w $ARG1$ -c $ARG2$
}

如下的服务中使用上面定义的命令对象来检测服务对象:

define service
{
host_name localhost
service_description Swap Usage
check_command check_local_swap!20!10
}

6、定义“时段”对象

“时段”用于定义某“操作”可以执行或不能执行的日期和时间跨度,如工作日内的每天8:00-18:00等,其可以在多个不同的操作中重复引用。一个时段对象的定义包含一个全局唯一的名称标识及一个或多个时间跨度。例如:

define timeperiod
{
timeperiod_name workinghours
alias Working Hours, from Monday to Friday
monday 09:00-17:00
tuesday 09:00-17:00
wednesday 09:00-17:00
thursday 09:00-17:00
friday 09:00-17:00
}

其中,时间的指定格式有许多方式:

日历时间:格式为YYYY-MM-DD,如2012-04-21;

日期:如 April 21;

每月的某一天:如 day 21,指每月的21号;

每月的第几个周几:如 saturday 1,指每月的第一个星期六;

星期几:如monday, tuesday等;

7、定义联系人对象

“联系人”对象用于定义某主机设备的拥有者或某问题出现时接受通知者。联系人对象的定义包含一个全局唯一的标识名称、一个描述名及一个或多个邮件地址等。此外,其通常还应该包括对相应的主机或服务出现故障时所用到的通知命令。例如:

define contact
{
contact_name mageedu
alias Mage Education
email linuxedu@magedu.com
host_notification_period workinghours
service_notification_period workinghours
host_notification_options d,u,r
service_notification_options w,u,c,r
host_notification_commands host-notify-by-email
service_notification_commands notify-by-email
}

联系人也可划分为组,即联系人组。一个联系人组对象包含一个全局惟一的标识名称,一个描述名称和属于此联系人组的联系人成员(members)或其人联系人组成员(contactgroup_members)。例如:

define contactgroup
{
contactgroup_name linux-admins
alias Linux Administrators
members magedu, mageedu
}

在主机或服务对象的定义中,既可以指定联系人,也可以指定联系人组。当然,某主机的问题联系人与其上运行的服务的联系人也可以不同。

8、模板及对象继承

Nagios通过功能强大的继承引擎来实现基于模板的对象继承。这就意味着可以定义将某类型的对象的通用属性组织起来定义为对象模板,并在定义其类型中的对象时直接从此模板继承其相关属性的定义。定义对象模板的方法很简单,通常只需要在定义某类型对象时使用register指令并将其值设定为0即可。对象模板的名称通常使用name指令定义,这与某特定类型对象使用的指令也有所不同。而定义此种类型的对象时,只需要使用use指令并将其值设定为对应模板的名称即可。

下面详细介绍下templates.cfg文件中每个参数的含义:

define contact{
        name                            generic-contact    ; 联系人名称
        service_notification_period     24x7               ; 当服务出现异常时,发送通知的时间段,这个时间段"24x7"在timeperiods.cfg文件中定义
        host_notification_period        24x7               ; 当主机出现异常时,发送通知的时间段,这个时间段"24x7"在timeperiods.cfg文件中定义
        service_notification_options    w,u,c,r            ; 这个定义的是“通知可以被发出的情况”。w即warn,表示警告状态,u即unknown,表示不明状态;
                                                           ; c即criticle,表示紧急状态,r即recover,表示恢复状态;
                                                           ; 也就是在服务出现警告状态、未知状态、紧急状态和重新恢复状态时都发送通知给使用者。
        host_notification_options       d,u,r                   ; 定义主机在什么状态下需要发送通知给使用者,d即down,表示宕机状态;
                                                                ; u即unreachable,表示不可到达状态,r即recovery,表示重新恢复状态。
        service_notification_commands   notify-service-by-email ; 服务故障时,发送通知的方式,可以是邮件和短信,这里发送的方式是邮件;
                                                                ; 其中“notify-service-by-email”在commands.cfg文件中定义。
        host_notification_commands      notify-host-by-email    ; 主机故障时,发送通知的方式,可以是邮件和短信,这里发送的方式是邮件;
                                                                ; 其中“notify-host-by-email”在commands.cfg文件中定义。 
        register                        0                    ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL CONTACT, JUST A TEMPLATE!
        }
define host{
        name                            generic-host    ; 主机名称,这里的主机名,并不是直接对应到真正机器的主机名;
                                                        ; 乃是对应到在主机配置文件里所设定的主机名。
        notifications_enabled           1               ; Host notifications are enabled
        event_handler_enabled           1               ; Host event handler is enabled
        flap_detection_enabled          1               ; Flap detection is enabled
        failure_prediction_enabled      1               ; Failure prediction is enabled
        process_perf_data               1               ; 其值可以为0或1,其作用为是否启用Nagios的数据输出功能;
                                                        ; 如果将此项赋值为1,那么Nagios就会将收集的数据写入某个文件中,以备提取。
        retain_status_information       1               ; Retain status information across program restarts
        retain_nonstatus_information    1               ; Retain non-status information across program restarts
        notification_period             24x7            ; 指定“发送通知”的时间段,也就是可以在什么时候发送通知给使用者。
        register                        0               ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL HOST, JUST A TEMPLATE!
        }
define host{
        name                            linux-server    ; 主机名称
        use                             generic-host    ; use表示引用,也就是将主机generic-host的所有属性引用到linux-server中来;
                                                        ; 在nagios配置中,很多情况下会用到引用。
        check_period                    24x7            ; 这里的check_period告诉nagios检查主机的时间段
        check_interval                  5               ; nagios对主机的检查时间间隔,这里是5分钟。
        retry_interval                  1               ; 重试检查时间间隔,单位是分钟。
        max_check_attempts              10              ; nagios对主机的最大检查次数,也就是nagios在检查发现某主机异常时,并不马上判断为异常状况;
                                                        ; 而是多试几次,因为有可能只是一时网络太拥挤,或是一些其他原因,让主机受到了一点影响;
                                                        ; 这里的10就是最多试10次的意思。
        check_command                   check-host-alive ; 指定检查主机状态的命令,其中“check-host-alive”在commands.cfg文件中定义。
        notification_period             24x7            ; 主机故障时,发送通知的时间范围,其中“workhours”在timeperiods.cfg中进行了定义;
                                                        ; 下面会陆续讲到。
        notification_interval           10              ; 在主机出现异常后,故障一直没有解决,nagios再次对使用者发出通知的时间。单位是分钟;
                                                        ; 如果你觉得,所有的事件只需要一次通知就够了,可以把这里的选项设为0
        notification_options            d,u,r           ; 定义主机在什么状态下可以发送通知给使用者,d即down,表示宕机状态;
                                                        ; u即unreachable,表示不可到达状态;
                                                        ; r即recovery,表示重新恢复状态。
        contact_groups                  ts              ; 指定联系人组,这个“admins”在contacts.cfg文件中定义。
        register                        0               ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL HOST, JUST A TEMPLATE!
        }
define host{
        name                    windows-server  ; The name of this host template
        use                     generic-host    ; Inherit default values from the generic-host template
        check_period            24x7            ; By default, Windows servers are monitored round the clock
        check_interval          5               ; Actively check the server every 5 minutes
        retry_interval          1               ; Schedule host check retries at 1 minute intervals
        max_check_attempts      10              ; Check each server 10 times (max)
        check_command           check-host-alive        ; Default command to check if servers are "alive"
        notification_period     24x7            ; Send notification out at any time - day or night
        notification_interval   10              ; Resend notifications every 30 minutes
        notification_options    d,r             ; Only send notifications for specific host states
        contact_groups          ts              ; Notifications get sent to the admins by default
        hostgroups              windows-servers ; Host groups that Windows servers should be a member of
        register                0               ; DONT REGISTER THIS - ITS JUST A TEMPLATE
        }
define service{
        name                            generic-service         ; 定义一个服务名称
        active_checks_enabled           1                       ; Active service checks are enabled
        passive_checks_enabled          1                       ; Passive service checks are enabled/accepted
        parallelize_check               1                       ; Active service checks should be parallelized;
                                                                ; (disabling this can lead to major performance problems)
        obsess_over_service             1                       ; We should obsess over this service (if necessary)
        check_freshness                 0                       ; Default is to NOT check service 'freshness'
        notifications_enabled           1                       ; Service notifications are enabled
        event_handler_enabled           1                       ; Service event handler is enabled
        flap_detection_enabled          1                       ; Flap detection is enabled
        failure_prediction_enabled      1                       ; Failure prediction is enabled
        process_perf_data               1                       ; Process performance data
        retain_status_information       1                       ; Retain status information across program restarts
        retain_nonstatus_information    1                       ; Retain non-status information across program restarts
        is_volatile                     0                       ; The service is not volatile
        check_period                    24x7             ; 这里的check_period告诉nagios检查服务的时间段。
        max_check_attempts              3                ; nagios对服务的最大检查次数。
        normal_check_interval           5                ; 此选项是用来设置服务检查时间间隔,也就是说,nagios这一次检查和下一次检查之间所隔的时间;
                                                         ; 这里是5分钟。
        retry_check_interval            2                ; 重试检查时间间隔,单位是分钟。
        contact_groups                  ts           ; 指定联系人组
        notification_options            w,u,c,r          ; 这个定义的是“通知可以被发出的情况”。w即warn,表示警告状态;
                                                         ; u即unknown,表示不明状态;
                                                         ; c即criticle,表示紧急状态,r即recover,表示恢复状态;
                                                         ; 也就是在服务出现警告状态、未知状态、紧急状态和重新恢复后都发送通知给使用者。
        notification_interval           10               ; Re-notify about service problems every hour
        notification_period             24x7             ; 指定“发送通知”的时间段,也就是可以在什么时候发送通知给使用者。
        register                        0                ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL SERVICE, JUST A TEMPLATE!
        }
define service{
        name                            local-service           ; The name of this service template
        use                             generic-service         ; Inherit default values from the generic-service definition
        max_check_attempts              4             ; Re-check the service up to 4 times in order to determine its final (hard) state
        normal_check_interval           5             ; Check the service every 5 minutes under normal conditions
        retry_check_interval            1             ; Re-check the service every minute until a hard state can be determined
        register                        0             ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL SERVICE, JUST A TEMPLATE!
        }

例如:

define host
{
name generic-server
check_command check-host-alive
check_interval 5
retry_interval 1
max_check_attempts 5
check_period 24x7
notification_interval 30
notification_period 24x7
notification_options d,u,r
register 0
}

define host
{
use generic-server
name webserver1
alias Web Server 01
address 172.16.100.11
contact_groups linux-admins
}

一个对象在定义时也以同时继承多个模板,此时只需要为use指令指定以逗号分隔的多个模板名称即可。同时,Nagios也支持模板的多级继承。

9、依赖关系

为了描述Nagios对象间的依赖关系,这里要用到两个术语:master(被依赖的主机或服务)和dependent(依赖关系中的依赖于master的Nagios对象)。Nagios可以定义对象间的彼此依赖性,也可以为某对象定义其父对象,甚至也可以指定此依赖关系生效的时段。下面是一个关于依赖关系定义的例子:

define hostdependency
{
dependent_host_name backuphost
host_name vpnserver1
dependency_period maintenancewindows
}

其中host_name用于定义master主机,dependent_host_name定义dependent主机。而在依赖关系的定义中,通常还会用到execution_failure_criteria定义master主机为何种状态时不再对依赖于此master的主机进行检测,notification_failure_criteria用于定义master处于何种状态时不会发送dependent相关的主机问题通知到联系人。

服务间依赖关系的定义类似于主机间的依赖关系,例如:

define servicedependency
{
host_name mysqlserver
service_description mysql
dependent_hostgroup_name apacheservers
dependent_service_description webservice
execution_failure_criteria c,u
notification_failure_criteria c,u,w
}

四、基于NRPE监控远程Linux主机

1、NRPE简介

Nagios监控远程主机的方法有多种,其方式包括SNMP、NRPE、SSH和NCSA等。这里介绍其通过NRPE监控远程Linux主机的方式。

NRPE(Nagios Remote Plugin Executor)是用于在远端服务器上运行检测命令的守护进程,它用于让Nagios监控端基于安装的方式触发远端主机上的检测命令,并将检测结果输出至监控端。而其执行的开销远低于基于SSH的检测方式,而且检测过程并不需要远程主机上的系统帐号等信息,其安全性也高于SSH的检测方式。

NRPE 工作原理:

30172019-7263dc2d9c9a40dbaa158ed0969e06d4


NRPE 总共由两部分组成:

check_nrpe 插件,位于监控主机上

NRPE daemon,运行在远程的Linux主机上(通常就是被监控机)
按照上图,整个的监控过程如下:

当Nagios 需要监控某个远程Linux 主机的服务或者资源情况时:

Nagios 会运行check_nrpe 这个插件,告诉它要检查什么;

check_nrpe 插件会连接到远程的NRPE daemon,所用的方式是SSL;

NRPE daemon 会运行相应的Nagios 插件来执行检查;

NRPE daemon 将检查的结果返回给check_nrpe 插件,插件将其递交给nagios做处理。

注意:NRPE daemon 需要Nagios 插件安装在远程的Linux主机上,否则,daemon不能做任何的监控。


2、安装配置被监控端

1)先添加nagios用户

[root@localhost ~]# useradd -s /sbin/nologin nagios

2)NRPE依赖于nagios-plugins,因此,需要先安装之

[root@localhost ~]# tar zxf nagios-plugins-2.1.1.tar.gz
[root@localhost ~]# cd nagios-plugins-2.1.1
[root@localhost nagios-plugins-2.1.1]# ./configure --with-nagios-user=nagios --with-nagios-group=nagios
[root@localhost nagios-plugins-2.1.1]# make
[root@localhost nagios-plugins-2.1.1]# make install

3)安装NRPE,nrpe下载地址:nrpe下载地址:http://sourceforge.net/projects/nagios/files/nrpe-2.x/

[root@localhost ~]# tar -zxvf nrpe-2.15.tar.gz
[root@localhost ~]# cd nrpe-2.15
[root@localhost nrpe-2.15]# ./configure  \
--with-nrpe-user=nagios \
--with-nrpe-group=nagios \
--with-nagios-user=nagios \
--with-nagios-group=nagios \
--enable-command-args \
--enable-ssl
[root@localhost nrpe-2.15]# make all
[root@localhost nrpe-2.15]# make install-plugin
[root@localhost nrpe-2.15]# make install-daemon
[root@localhost nrpe-2.15]# make install-daemon-config

注意:编译时可以加上–sysconfdir=/etc选项将其安装在/etc下。
4)配置NRPE

[root@localhost ~]# vim /usr/local/nagios/etc/nrpe.conf
log_facility=daemon
pid_file=/var/run/nrpe.pid
server_port=5666
nrpe_user=nagios
nrpe_group=nagios
allowed_hosts=192.168.1.106
dont_blame_nrpe=0
allow_bash_command_substitution=0
debug=0
command_timeout=60
connection_timeout=300
command[check_users]=/usr/local/nagios/libexec/check_users -w 5 -c 10
command[check_load]=/usr/local/nagios/libexec/check_load -w 15,10,5 -c 30,25,20
command[check_sda1]=/usr/local/nagios/libexec/check_disk -w 20% -c 10% -p /dev/sda1
command[check_sda2]=/usr/local/nagios/libexec/check_disk -w 20% -c 10% -p /dev/sda2
command[check_zombie_procs]=/usr/local/nagios/libexec/check_procs -w 5 -c 10 -s Z
command[check_total_procs]=/usr/local/nagios/libexec/check_procs -w 150 -c 200 

我们可以很容易知道上面最后这6行定义的命令分别是检测登陆用户数,cpu负载,sda1的容量,sda2的容量,僵尸进程,总进程数。
上述配置指令可以做到见名知义,因此,配置过程中根据实际需要进行修改即可。其中,需要特定说明的是allowed_hosts指令用于定义本机所允许的监控端的IP地址。

5)启动NRPE

[root@localhost ~]# /usr/local/nagios/bin/nrpe -c /usr/local/nagios/etc/nrpe.cfg –d

为了便于NRPE服务的启动,可以将如下内容定义为/etc/init.d/nrped脚本:

#!/bin/bash
# chkconfig: 2345 88 12
# description: NRPE DAEMON

NRPE=/usr/local/nagios/bin/nrpe
NRPECONF=/usr/local/nagios/etc/nrpe.cfg

case "$1" in
start)
echo -n "Starting NRPE daemon..."
$NRPE -c $NRPECONF -d
echo " done."
;;
stop)
echo -n "Stopping NRPE daemon..."
pkill -u nagios nrpe
echo " done."
;;
restart)
$0 stop
sleep 2
$0 start
;;
*)
echo "Usage: $0 start|stop|restart"
;;
esac
exit 0

或者,也可以在/etc/xinetd.d目录中创建nrpe文件,使其成为一个基于非独立守护进程的服务,文件内容如下:

service nrpe
{
flags = REUSE
socket_type = stream
wait = no
user = nagios
group = nagios
server = /usr/local/nagios/bin/nrpe
server_args = -c /etc/nagios/nrpe.cfg -i
log_on_failure += USERID
disable = no
}

此种情况下启动NRPE进程需要通过重启xinetd来实现。

6)配置允许远程主机监控的对象

在被监控端,可以通过NRPE监控的服务或资源需要通过nrpe.conf文件使用命令进行定义,定义命令的语法格式为:command[]=。比如:

command[check_rootdisk]=/usr/local/nagios/libexec/check_disk -w 20% -c 10% -p /
command[check_swap]=/usr/local/nagios/libexec/check_disk -w 40% -c 20%
command[check_sensors]=/usr/local/nagios/libexec/check_sensors
command[check_users]=/usr/local/nagios/libexec/check_users -w 10 -c 20
command[check_load]=/usr/local/nagios/libexec/check_load -w 10,8,5 -c 20,18,15
command[check_zombies]=/usr/local/nagios/libexec/check_procs -w 5 -c 10 -s Z
command[check_all_procs]=/usr/local/nagios/libexec/check_procs -w 150 -c 200

3、配置监控端

1)安装NRPE

[root@localhost ~]# tar -zxvf nrpe-2.15.tar.gz
[root@localhost ~]# cd nrpe-2.15
[root@localhost nrpe-2.15]# ./configure  \
--with-nrpe-user=nagios \
--with-nrpe-group=nagios \
--with-nagios-user=nagios \
--with-nagios-group=nagios \
--enable-command-args \
--enable-ssl
[root@localhost nrpe-2.15]# make all
[root@localhost nrpe-2.15]# make install-plugin

2)定义如何监控远程主机及服务:

通过NRPE监控远程Linux主机要使用chech_nrpe插件进行,其语法格式如下:

check_nrpe -H [-n] [-u] [-p ] [-t ] [-c <command></command>] [-a ]

定义完成后先进行测试:

[root@localhost ~]# cd /usr/local/nagios/libexec
[root@localhost libexec]# ./check_nrpe -H 192.168.1.116  #说明已经可以通信了
NRPE v2.15

使用示例1:

定义监控远程Linux主机swap资源的命令,先在/etc/nagios/objects/commands.cfg如下定义:

define command
{
command_name check_swap_nrpe
command_line $USER1$/check_nrpe –H "$HOSTADDRESS$" -c "check_swap"
}

定义远程Linux主机的swap资源:

define service
{
use generic-service
host_name linuxserver1,linuxserver2
hostgroup_name linux-servers
service_description SWAP
check_command check_swap_nrpe
normal_check_interval 30
}

使用示例2:

如果希望上面的command定义更具有通用性,那么上面的定义也可以修改为如下:

定义监控远程Linux主机的命令:

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

定义远程Linux主机的swap资源:

define service
{
use generic-service
host_name linuxserver1,linuxserver2
hostgroup_name linux-servers
service_description SWAP
check_command check_nrpe!check_swap
normal_check_interval 30
}

使用示例3:

如果还希望在监控远程Linux主机时还能向其传递参数,则可以使用类似如下方式进行:

定义监控远程Linux主机disk资源的命令:

define command
{
command_name check_swap_nrpe
command_line $USER1$/check_nrpe –H "$HOSTADDRESS$" -c "check_swap" -a $ARG1$ $ARG2$
}

定义远程Linux主机的swap资源:

define service
{
use generic-service
host_name linuxserver1,linuxserver2
hostgroup_name linux-servers
service_description SWAP
check_command check_swap_nrpe!20!10
normal_check_interval 30
}

看完示例后,然后开始定义,首先定义命令:

[root@cacti libexec]# vim /etc/nagios/objects/commands.cfg 
# 'check_nrpe' command definition
define command{
        command_name    check_nrpe         # 定义命令名称为check_nrpe,在services.cfg中要使用这个名称.
        command_line    $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$       #这是定义实际运行的插件程序.
                        # 这个命令行的书写要完全按照check_nrpe这个命令的用法,不知道用法的就用check_nrpe –h查看.
        }

然后定义服务:

[root@cacti objects]# cp windows.cfg linhost.cfg    #新建一个文件定义主机
[root@localhost objects]# cat linhost.cfg | grep -v '^#'|  grep -v '^$'
define host{
	use		linux-server	; Inherit default values from a template
	host_name	linhost	; The name we're giving to this host
	alias		My Linux Server	; A longer name associated with the host
	address		192.168.1.116	; IP address of the host
	}
define service{
	use			generic-service
	host_name		linhost
	service_description	CHECK USER
	check_command		check_nrpe!check_users
	}
define service{
	use			generic-service
	host_name		linhost
	service_description	Load 
	check_command		check_nrpe!check_load
	}
define service{
	use			generic-service
	host_name		linhost
	service_description	SDA1
	check_command		check_nrpe!check_sda1
	}
define service{
	use			generic-service
	host_name		linhost
	service_description	SDA2
	check_command		check_nrpe!check_sda2
	}
define service{
	use			generic-service
	host_name		linhost
	service_description	Zombie        
	check_command		check_nrpe!check_zombie_procs
	}
define service{
	use			generic-service
	host_name		linhost
	service_description	Total procs        
	check_command		check_nrpe!check_total_procs
	}

被监控端还开启了http 服务,需要监控一下,按照上面的做法,在被监控机(192.1687.1.116)上增加check_http 命令的定义.

[root@localhost nagios]# vim /usr/local/nagios/etc/nrpe.cfg 

增加下面这一行:

command[check_http]=/usr/local/nagios/libexec/check_http -I 127.0.0.1

在监控机(192.168.1.106)上增加check_http 监控项目:

define service{
        use                     local-service
        host_name               Nagios-Linux
        service_description     HTTP
        check_command           check_nrpe!check_http
        }

定义完成后:

[root@cacti nagios]# vim  nagios.cfg

cfg_file=/etc/nagios/objects/linhost.cfg  #添加一行,启用

然后检查语法 :

[root@cacti nagios]# /usr/local/nagios/bin/nagios -v /etc/nagios/nagios.cfg 

Nagios Core 4.1.1
Copyright (c) 2009-present Nagios Core Development Team and Community Contributors
Copyright (c) 1999-2009 Ethan Galstad
Last Modified: 08-19-2015
License: GPL

Website: https://www.nagios.org
Reading configuration data...
   Read main config file okay...
   Read object config files okay...

Running pre-flight check on configuration data...

Checking objects...
	Checked 14 services.
	Checked 2 hosts.
	Checked 1 host groups.
	Checked 0 service groups.
	Checked 1 contacts.
	Checked 1 contact groups.
	Checked 25 commands.
	Checked 5 time periods.
	Checked 0 host escalations.
	Checked 0 service escalations.
Checking for circular paths...
	Checked 2 hosts
	Checked 0 service dependencies
	Checked 0 host dependencies
	Checked 5 timeperiods
Checking global event handlers...
Checking obsessive compulsive processor commands...
Checking misc settings...

Total Warnings: 0
Total Errors:   0

Things look okay - No serious problems were detected during the pre-flight check

[root@localhost objects]# service nagios reload

[root@cacti libexec]# ./check_http -H 192.168.1.116
HTTP OK: HTTP/1.1 200 OK - 290 bytes in 0.003 second response time |time=0.003358s;;;0.000000 size=290B;;;0

然后在浏览器中查看:

界面


DevOps-田飞雨 》》转载请注明源地址
喜欢 (0)or分享 (0)
发表我的评论
取消评论
*

表情 贴图 加粗 链接 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址