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则需要同时安装在服务器端和客户端。


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


2、安装前的准备工作


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


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

# yum -y installhttpd gcc glibc glibc-common gd gd-devel php php-mysql mysql mysql-develmysql-server


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


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


# groupadd  nagcmd

# useradd -G nagcmdnagios

# passwd nagios


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

# usermod -a -Gnagcmd apache


3、编译安装nagios:


# tar zxfnagios-3.3.1.tar.gz

# cd nagios-3.3.1

# ./configure--with-command-group=nagcmd --enable-event-broker

# make all

# make install

# make install-init

# makeinstall-commandmode

# make install-config



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

# vi/usr/local/nagios/etc/objects/contacts.cfg

email        nagios@localhost       #这个是默认设置


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

# makeinstall-webconf


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

# htpasswd -c/usr/local/nagios/etc/htpasswd.users nagiosadmin

可以进配置界面查看一下是否在这个路径下验证

[root@node4 share]#vim /etc/httpd/conf.d/nagios.conf

<Directory"/usr/local/nagios/share">

#  SSLRequireSSL

  Options None

  AllowOverride None

  Order allow,deny

  Allow from all

#  Order deny,allow

#  Deny from all

#  Allow from 127.0.0.1

  AuthName "Nagios Access"

  AuthType Basic

  AuthUserFile/usr/local/nagios/etc/htpasswd.users

  Require valid-user

</Directory>


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

# service httpdrestart


4、编译、安装nagios-plugins


nagios的所有监控工作都是通过插件完成的,因此,在启动nagios之前还需要为其安装官方提供的插件。


# tar zxfnagios-plugins-1.4.15.tar.gz

# cdnagios-plugins-1.4.15

# ./configure--with-nagios-user=nagios --with-nagios-group=nagios

# make

# make install


5、配置并启动Nagios


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

# chkconfig --addnagios

# chkconfig nagios on


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

#/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg


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

# service nagiosstart


(4)配置selinux

如果您的系统开启了selinux服务,则默认为拒绝nagiosweb cgi程序的运行。您可以通过下面的命令来检查您的系统是否开启了selinux:

#getenforce


如果上面命令的结果显示开启了selinux服务,您可以通过下面的命令暂时性的将其关闭:

#setenforce 0


如果您想在以后完全关闭selinux,可以通过编辑/etc/sysconfig/selinux文件,将其中的selinux后面的值“force”修改为“disable”即可。


当然,您也可以通过以下方式将nagios的CGI程序运行于SELinux/targeted模式而不用关闭selinux:

# chcon -R -thttpd_sys_content_t /usr/local/nagios/sbin

# chcon -R -thttpd_sys_content_t /usr/local/nagios/share


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

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

比如我的页面:192.168.0.4/nagios  账号:nagiosadmin 密码:redhat,如果我们第一次打开这个的时候显示错误,请关闭你的selinux在试一次。

Nagios安装和配置详解_nagios



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


四、配置Nagios


[root@node4 ~]# cd/usr/local/nagios/etc/

[root@node4 etc]# ls

cgi.cfg  cgi.cfg~ htpasswd.users  nagios.cfg  nagios.cfg~ objects  resource.cfg  resource.cfg~


Nagios 相关目录的名称及用途


目录名称

作用

bin

Nagios  可执行程序所在目录

etc

Nagios  配置文件目录

sbin

Nagios  cgi 文件所在目录, 也就是执行外部 命令所需要文件所在的目录

share

Nagios  网页存放路径

libexec

Nagios  外部插件存放目录

var

Nagios  日志文件、Lock 等文件所在的目录

var/archives

Nagios  日志自动归档目录

var/rw

用来存放外部命令文件的目录


配置文件的作用概述


配置文件

说明

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 中引用即可。


1、Nagios的主配置文件


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


log_file:设定Nagios的日志文件;

cfg_file:Nagios对象定义的相关文件,此参数可重复使用多次以指定多个文件;

cfg_dir: 设定Nagios对象定义的相关文件所在的目录,此目录中的所有文件都会被作为对象定义的文件;此参数可重复使用多次以指定多个目录;

resource_file:设定Nagios附加的宏定义的相关文件;

status_file:设定Nagios存储所有主机和服务当前状态信息的文件;

status_update_interval:设定status_file指定的文件中状态信息的更新频率;

service_check_timeout:设定服务检测的超时时间,默认为60秒;

host_check_timeout:设定主机检测的超时时间,默认为30秒;

notification_timeout:设定通知信息发送尝试的超时时间,默认为30秒;

command_check_interval=-1 #command每隔多长时间监测一次,-1的话是尽可能多的去监控

command_file:定义command执行权限和执行身份的

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组名称之间以逗号分隔;


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


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

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

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


一个简单的例子如下:


如某主机定义为:

definehost

 {

   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、定义主机对象


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


一个主机定义的例子:

definehost

{

host_namewebserver1

hostgroupswebservers

alias www.example.com

address172.16.100.11

check_commandcheck-host-alive

check_interval5

retry_interval1

max_check_attempts5

check_period24x7

contact_groupslinux-admins

notification_interval30

notification_period24x7

notification_optionsd,u,r

}


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

d—— DOWN

u—— UNREACHABLE

r—— UP(host recovery)

f—— flapping

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


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


definehostgroup

{

hostgroup_namewebservers

aliasLinux web servers

memberswebserver1

}


4、定义服务对象


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


defineservice

{

host_namewebserver1

service_descriptionwww

check_commandcheck_http

check_interval10

check_period24x7

retry_interval3

max_check_attempts3

notification_interval30

notification_period24x7

notification_optionsw,c,u,r

contact_groupslinux-admins

}


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

w—— WARNING

u—— UNKNOWN

c—— CRITICAL

r—— OK(recovery)

f—— flapping

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


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


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


defineservicegroup

{

servicegroup_namewebservices

aliasAll services related to web

members webserver1,wwwwebserver2,www

}


5、定义命令对象


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


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


如下命令对象的定义:

definecommand

{

command_name        check_local_swap

command_line        $USER1$/check_swap-w $ARG1$ -c $ARG2$

}


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


defineservice

{

   host_name localhost

   service_description  Swap Usage

check_command        check_local_swap!20!10

 }


6、定义“时段”对象


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


definetimeperiod

{

timeperiod_nameworkinghours

aliasWorking Hours, from Monday to Friday

monday09:00-17:00

tuesday09:00-17:00

wednesday09:00-17:00

thursday09:00-17:00

friday09:00-17:00

}


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

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

日期:如April 21;

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

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

星期几:如monday,tuesday等;


7、定义联系人对象


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


definecontact

{

contact_namemageedu

aliasMage Education

nagios@example.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     notify-host-by-email

service_notification_commands   notify-service-by-email

}


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


definecontactgroup

{

contactgroup_namelinux-admins

aliasLinux Administrators

membersmagedu, mageedu

}


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


8、模板及对象继承


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


definehost

{

namegeneric-server

check_commandcheck-host-alive

check_interval5

retry_interval1

max_check_attempts5

check_period24x7

notification_interval30

notification_period24x7

notification_optionsd,u,r

register 0

}


definehost

{

use generic-server

namewebserver1

aliasWeb Server 01

address172.16.100.11

contact_groupslinux-admins

}


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


9、依赖关系


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


definehostdependency

{

dependent_host_namebackuphost

host_namevpnserver1

dependency_periodmaintenancewindows

}


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


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


defineservicedependency

{

host_namemysqlserver

service_descriptionmysql

dependent_hostgroup_nameapacheservers

dependent_service_descriptionwebservice

execution_failure_criteriac,u

notification_failure_criteriac,u,w

}


默认模板配置文件


definecontact{

namegeneric-contact #联系人名称

service_notification_period24x7 #当服务出现异常时,发送通知的时间段,时间段是 7x24 小时

host_notification_period24x7 #当主机出现异常时,发送通知的时间段,时间段是 7x24 小时

service_notification_optionsw,u,c,r #这个定义的是“通知可以被发出的情况”。w 即 warning,表示警告状态,u 即 unknown,表示不明状态,c 即criticle,表示紧急状态,r 即 recover,表示恢复状态

host_notification_optionsd,u,r #定义主机在什么状态下需要发送通知给使用者,d 即 down,表示宕机状态,u 即 unreachable,表示不可到达状态,r 即recovery,表示重新恢复状态。

service_notification_commandsnotify-service-by-email#服务故障时,发送通知的方式,可以是邮件和短信,这里发送的方式是邮件,其中“notify-service-by-email”在 commands.cfg文件中定义。

host_notification_commandsnotify-host-by-email#主机故障时,发送通知的方式,可以是邮件和短信,这里发送的方式是邮件,其中“notify-host-by-email”在 commands.cfg文件中定义。

}


definehost{

namelinux-server #主机名称

usegeneric-host #use 表示引用,也就是将主机 generic-host 的所有属性引用到 linux-server 中来,在 nagios配置中,很多情况下会用到引用。

check_period24x7 #这里的 check_period 告诉 nagios 检查主机的时间段

check_interval5 #nagios 对主机的检查时间间隔,这里是 5 分钟。

retry_interval1 #重试检查时间间隔,单位是分钟。

max_check_attempts10 #nagios 对主机的最大检查次数, check_command check-host-alive#指定检查主机状态的命令,其中“check-host-alive”在 commands.cfg 文件中定义。

notification_periodworkhours #主机故障时,发送通知的时间范围,其中“workhours”在 timeperiods.cfg 中进行了定义,下面会陆续讲到。


notification_interval30 #在主机出现异常后,故障一直没有解决,nagios 再次对使用者发出通知的时间。单位是分钟

notification_optionsd,u,r #定义主机在什么状态下可以发送通知给使用者,d 即 down,表示宕机状态,u 即 unreachable,表示不可到达状态,r 即recovery,表示重新恢复状态。

contact_groupsadmins #指定联系人组,这个“admins”在 contacts.cfg 文件中定义。


defineservice{

namelocal-service #定义一个服务名称

usegeneric-service #引用服务 local-service 的属性信息,local-service 主机在 templates.cfg文件中进行了定义

max_check_attempts4 #最大检测 4 次,为了确定服务最终状态

normal_check_interval5 #每 5 分钟检测一次

retry_check_interval1 #每 1 分钟重新检测服务,最终的状态能被确定

}

host.cfg 文件

此文件默认情况下不存在,需要手动创建。hosts.cfg主要用来指定被监控的主机地址及相关属性信息。配置如下表:

定义主机配置实例


definehost {

uselinux-server #引用主机 linux-server 的属性信息,linux-server 主机在 templates.cfg 文件中进行了定义。

host_nameDirHost162 #被监控主机名


aliasRHEL6.3_CSDA-FVT-Server #被监控主机别名


address192.168.1.162 ##被监控主机 IP 地址


}

........

services.cfg 文件

此文件在默认情况下也不存在,需要手动创建。services.cfg文件主要用于定义监控的服务和主机资源,例如监控 HTTP 服务、FTP 服务、主机磁盘空间、主机系统负载等。

定义服务配置


#DefineDirHost162


defineservice{

uselocal-service #引用服务 local-service 的属性信息,local-service 主机在 templates.cfg文件中进行了定义。

host_nameDirHost162 #被监控主机名

service_descriptionSSH #监控的服务

check_commandcheck_ssh # nagios 插件监控指令

}


defineservice{

uselocal-service,services-pnp

host_nameDirHost162

service_descriptionSSHD

check_commandcheck_tcp!22 # 使用的检测命令, 同时多个参数匹配用 “!” 分隔,如:check_ping!100.0,20%!500.0,60%


}

…….