一.前言

要想成功的配置一台Nagios,就必须熟悉其配置文件之间的关系,以及各配置文件的语法。


二.Nagios的配置文件:

Nagios安装后有几种常用的配置文件,分别是:主配置文件、CGI配置文件、资源定义文件、对象定义文件。


1.主配置文件(nagios.cfg):

Nagios的主配置文件是用来定义Nagios服务的基本参数信息的,其中包括:对象定义文件的声明、CGI配置文件的声明、资源定义文件的声明等。其常用参数如下:

#常用参数详解log_file=/usr/local/nagios/var/nagios.log#日志文件cfg_file=/etc/nagios/objects/commands.cfg#命令定义文件resource_file=/etc/nagios/resource.cfg#资源(宏)定义文件status_file=/usr/local/nagios/var/status.dat#Nagios状态文件,获取到的监控信息存在该文件中,CGI就展示该文件信息status_update_interval=10#状态文件多少秒更新一次nagios_user=nagios#nagios服务的运行者nagios_group=nagios#nagios服务的运行组check_external_commands=1#是否允许CGI执行外部脚本(是否允许通过Web做一些监控管理操作)command_check_interval=-1#外部命令检测间隔,-1代表尽可能多的检测,这个值的时间单位依赖于interval_length值interval_length=60#设定时间单位长度,默认为60scommand_file=/usr/local/nagios/var/rw/nagios.cmd#命令定义文件external_command_buffer_slots=4096#外部命令缓冲区大小,从命令定义文件读取过来命令但Nagios进程还没处理所存放的位置enable_notifications={1|0}#Nagios是否启用通知功能,1表示启用通知,0表示关闭通知。service_check_timeout=60#设定服务检测命令的执行超时时长,一般是插件出问题超时host_check_timeout=30#设定主机检测命令的执行超时时长,一般是插件出问题超时notification_timeout=30#设定通知命令的执行超时时长,一般是插件出问题超时execute_service_checks={1|0}#设定Nagios是否启用主动服务检测机制,1表示启用,0表示关闭。accept_passive_service_checks={1|0}#设定Nagios是否接受被动服务检测的结果,1表示接受,0表示拒绝。execute_host_checks={1|0}#设定Nagios是否启用主动主机检测机制,1表示启用,0表示关闭。accept_passive_host_checks={1|0}#设定Nagios是否接受被动主机检测的结果,1表示接受,0表示拒绝。enable_event_handlers=1#设定Nagios是否启用时间处理机制,1表示启用,0表示关闭。log_rotation_method={n|h|d|w|m}#指定日志滚动方法,日志滚动就是将日志分开,n代表不做日志回滚


2.CGI配置文件(cgi.cfg):

CGI配置文件是用来定义Nagios在提供Web接口的CGI的配置,例如网页目录、认证用户等等。CGI的配置在主配置文件也有一部分。其常用参数:

#常用参数main_config_file#主配置文件是哪个physical_html_path=/usr/local/nagios/share#网页目录url_html_path=/nagios#URL路径use_authentication=1#是否启用认证use_ssl_authentication=0#认证是否启用SSL加密#认证各权限相关,nagiosadmin是CGI用户authorized_for_system_information=nagiosadminauthorized_for_configuration_information=nagiosadminauthorized_for_system_commands=nagiosadminauthorized_for_all_services=nagiosadminauthorized_for_all_hosts=nagiosadminauthorized_for_all_service_commands=nagiosadminauthorized_for_all_host_commands=nagiosadmin

3.资源定义文件(resource.cfg):

资源定义文件用来定义Nagios的配置文件中的宏,"宏"就是一类常量,其可以灵活的引用到不同监控对象获得不同值(一旦获得值后就不可修改),Nagios支持用户自定义32个宏,从$USER1~$USER32$。CGI程序不会读取资源定义文件,所以除了宏外,还可以在其中定义一些敏感信息,例如访问某服务的密码等,从而避免这些敏感信息被展示到Web接口上。

资源定义文件中默认只有一行宏定义:

$USER1$=/usr/local/nagios/libexec#定义$USER1$宏是/usr/local/nagios/libexec

除了自定义宏外,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组名称之间以逗号分隔;


4.对象定义文件(objec_name.cfg):


Nagios中,需要定义的监控我们称作一个对象,对象定义文件用来定义对哪些对象进行什么样的监控,注:需要事先在主配置文件中声明才会生效。Nagios常定义的对象有如下几个:

主机主机组服务服务组联系人联系人组时间周期外部命令依赖关系模板


①主机定义:

“主机”指的是被监控的机器,可是物理主机,也可以是虚拟设备。一个主机对象的定义至少应该包含一个简名(short name)、一个别名、一个IP地址和用到的检测命令。此外,很多时候,其定义中还应该包含监控时段、联系人及要通知的相关问题、检测的频率、重试检测的方式、发送通知的频率等。主机的定义例子如下:

definehost{#主机定义声明host_nameweb1#设定主机名hostgroupsweb#所属主机组,可以替代hostgroupaliaswww;主机别名address172.16.100.11#主机IP地址check_commandcheck-host-alive#检测命令check_interval5#检测间隔retry_interval1#重试间隔,一次检测失败后,重试的间隔max_check_attempts5#最大检测次数,一次检测失败后,重复检测的次数check_period24x7#检测的时间段contact_groupslinux-admins#联系人组notification_interval30#再次通知间隔notification_period24x7#通知时间notification_optionsd,u,r#哪种状态进行通知;d(Down),u(UNREACHABLE),r(recovery),f,s}

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

d——DOWN#挂掉了u——UNREACHABLE#不可达r——UP(hostrecovery)#重新恢复态f——flapping#异常s——调试宕机时间开始或结束


②主机组定义:

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

definehostgroup{#主机组定义声明hostgroup_nameWeb#主机组的名字aliasLinuxWebServers#主机组别名membersweb1,web2#组中的主机有哪些}


③服务定义:

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

defineservice{host_nameweb1,web2,...#主机名,可能有多个主机提供相同的服务service_descriptionwww#服务的描述check_commandcheck_http#检测的命令check_interval10#检测时间间隔check_period24x7#检测的时间retry_interval3#重试时间间隔max_check_attempts3#最大检测次数notification_interval30#再次同时间隔notification_period24x7#通知时间notification_optionsw,c,u,r#哪种状态进行通知:w(warning)/c(critical)/u(unknown)/r(recovery)contact_groupslinux-admins#通知组}

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

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

w——WARNING#警告u——UNKNOWN#未知c——CRITICAL#紧急r——OK(recovery)#重新恢复f——flapping#异常s——调试宕机时间开始或结束


④服务组定义:

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

defineservicegroup{servicegroup_namewebservices#服务组名aliasAllservicesrelatedtoweb#别名memberswe1,www,web2,www#主机的服务}


⑤联系人定义:

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

definecontact{contact_nameAdmin#联系人名字aliasNagiosAdmin#别名emailAdmin@logsite.cn#邮件地址host_notification_periodworkinghours#主机通知时间service_notification_periodworkinghours#服务通知时间host_notification_optionsd,u,r#主机什么状态发生通知,d(down)、u(UNREACHABLE)、r(recovery)service_notification_optionsw,u,c,r#服务声明状态发生通知,w(warning)、u(unkown)、c(critical)、r(recover)host_notification_commandshost-notify-by-email#主机通知命令service_notification_commandsnotify-by-email#通知命令}


⑥联系人组定义:

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

definecontactgroup{contactgroup_nameadmins#组名aliasNagiosAdministrators#别名membersnagiosadmin#组成员}


⑦时间周期定义:

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

definetimeperiod{timeperiod_namenonworkhours#日程名称aliasNon-WorkHours#别名sunday00:00-24:00;EverySundayofeveryweekmonday00:00-09:00,17:00-24:00;EveryMondayofeveryweektuesday00:00-09:00,17:00-24:00;EveryTuesdayofeveryweekwednesday00:00-09:00,17:00-24:00;EveryWednesdayofeveryweekthursday00:00-09:00,17:00-24:00;EveryThursdayofeveryweekfriday00:00-09:00,17:00-24:00;EveryFridayofeveryweeksaturday00:00-24:00;EverySaturdayofeveryweek}


⑧监控命令定义:

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

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

definecommand{command_namenotify-host-by-email#命令名,用于调用command_line/usr/bin/printf"%b""*****Nagios*****\n\nNotificationType:$NOTIFICATIONTYPE$\nHost:$HOSTNAME$\nState:$HOSTSTATE$\nAddress:$HOSTADDRESS$\nInfo:$HOSTOUTPUT$\n\nDate/Time:$LONGDATETIME$\n"|/bin/mail-s"**$NOTIFICATIONTYPE$HostAlert:$HOSTNAME$is$HOSTSTATE$**"$CONTACTEMAIL$}


⑨模板定义及继承:

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

##host模板定义:模板定义使用register0作为关键字definehost{namegeneric-server#模板名字check_commandcheck-host-alive#命令check_interval5#多久检测一次retry_interval1#当服务出现问题,多久重试一次max_check_attempts5#最大重试次数check_period24x7#监控的时间周期notification_interval30#错误通知间隔时长notification_period24x7#通知时间周期notification_optionsd,u,r#变为何种状态通知register0#模板定义关键字}##host模板继承:继承一般在对象定义文件中使用Use继承definehost{usegeneric-server#继承generic-server模板host_namewebserver1#主机名aliasWebServer01#主机别名address172.16.100.11#IP地址contact_groupslinux-admins#联系组}

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


⑩依赖关系:

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

definehostdependency{dependent_host_namebackuphost#定义dependent主机host_name***server1#dependent主机名dependency_periodweb1#依赖的主机execution_failure_criteriac,u#定义master为何种状态时不再对依赖此master的主dependent机进行检测notification_failure_criteriac,u,w#定义master处于何种状态时不会发送dependent相关的主机问题通知到联系人。}

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

defineservicedependency{host_namemysqlserver#运行该服务的主机service_descriptionmysql#服务描述dependent_hostgroup_nameapacheservers#dependent主机组dependent_service_descriptionwebservice#dependent服务描述execution_failure_criteriac,u#定义master为何种状态时不再对依赖此master的主机进行检测notification_failure_criteriac,u,w#定义master处于何种状态时不会发送dependent相关的主机问题通知到联系人。}