一、配置Nagios
Nagios 主要用于监控一台或者多台本地主机及远程的各种信息,包括本机资源及对外的服务等。默认的Nagios 配置没有任何监控内容,仅是一些模板文件。若要让Nagios 提供服务,就必须修改配置文件,增加要监控的主机和服务,下面将详细介绍。 Nagios 安装完毕后,默认的配置文件在/usr/local/nagios/etc目录下。我们在编译的时候指定了 --sysconfdir=DIR, 所以我们的配置文件目录为/etc/nagios。 1、配置文件的作用概述
备注:Nagios在配置方面非常灵活,默认的配置文件并不是必需的。可以使用这些默认的配置文件,也可以创建自己的配置文件,然后在主配置文件nagios.cfg中引用即可。
实际应用中,这些对象的配置文件我们可以自己命名,可以存放在任何位置,只要在nagios.cfg中引用即可。
2、配置文件之间的关系
在Nagios的配置过程中涉及到的几个定义有:主机、主机组、服务、服务组、联系人、联系人组、时间段、命令等,从这些定义可以看出,nagios各个配置文件之间是互为关联,彼此引用的。
Nagios最重要的概念就是对象(object),以及继承和引用,就是OOP的思想。
在Nagios定义了一些基本的对象:
我们定义一个被监控的服务,当然就要指定被监控的主机,需要监控的时间段,要用哪个命令来完成这个监控操作,出了问题向哪个联系人报告。所有这些对象绝对多数都是需要我们手动定义的,这就是nagios的安装显得复杂的地方.其实了解了原理,做一遍之后余下的工作就是复制粘贴了。
成功配置出一台nagios监控系统,必须要弄清楚每个配置文件之间的依赖与被依赖的关系,最重要的有四点:
- 第一:定义监控哪些主机、主机组、服务和服务组;
- 第二:定义这个监控要用什么命令实现;
- 第三:定义监控的时间段;
- 第四:定义主机或服务出现问题时要通知的联系人和联系人组
3、自定义监控目录
默认情况下nagios.cfg会启用一些对象配置文件,如:commands.cfg, conftacts.cfg, localhost.cfg等,为了更好的对Nagios平台的管理和日后的维护工作,建议在Nagios配置文件目录,自定义一个monitor目录,用来保存所管理的被监控对象。同时注释nagios.cfg配置文件默认定义的对象配置文件,并添加 cfg_dir = /etc/nagios/monitor 即可。
- 创建hosts.cfg文件来定义主机和主机组
- 创建services.cfg文件来定义服务
- 用默认的contacts.cfg文件来定义联系人和联系人组
- 用默认的commands.cfg文件来定义命令
- 用默认的timeperiods.cfg来定义监控时间段
- 用默认的templates.cfg文件作为资源引用文件
我们在nagios.cfg中添加cfg_dir=/etc/nagios/monitor 引入即可。Nagios的配置大多是对监控对象配置文件进行修改配置,这里需要复制objects目录下的所有对象配置文件模板,同时在monitor目录下创建独立的配置文件hosts.cfg和services.cfg来定义主机和服务,至于联系人和监控的时间段,我们保持默认配置。
二、配置文件说明
1、templates.cfg
nagios主要用于监控主机资源以及服务,在nagios配置中称为对象,为了不必重复定义一些监控对象,Nagios引入了一个模板配置文件,将一些共性的属性定义成模板(类),以便于多次引用。这就是templates.cfg的作用。
2、nagios.cfg
nagios.cfg是核心的配置文件,所有的对象配置文件都必须在这个文件中进行定义才能发挥其作用,这里只需将对象配置文件在Nagios.cfg文件中引用即可。
3、commands.cfg
此文件是默认存在,如果有新的命令需要加入,在这个文件中添加即可。
4、localhost.cfg
localhost.cfg 文件是定义监控主机本身的.
5、windows.cfg
windows.cfg 文件是定义windows 主机的
6、contacts.cfg
contacts.cfg是一个定义联系人和联系人组的配置文件,当监控的主机或者服务出现故障,nagios会通过指定的通知方式(邮件或者短信)将信息发给这里指定的联系人或者使用者。
7、 timeperiods.cfg
用于定义时间段。
8、cgi.cfg
此文件用来控制相关cgi脚本,如果想在nagios的web监控界面执行cgi脚本,例如重启nagios进程、关闭nagios通知、停止nagios主机检测等,这时就需要配置cgi.cfg文件了。
nagios默认情况下只有nagiosadmin才有权限执行cgi脚本,其他用户都没有权限。由于nagios的web监控界面验证用户为david,所以只需在cgi.cfg文件中添加此用户的执行权限就可以了,需要修改的配置信息如下:
1
2
3
4
5
6
7
8
| default_user_name=david
authorized_for_system_information=nagiosadmin,david
authorized_for_configuration_information=nagiosadmin,david
authorized_for_system_commands=david
authorized_for_all_services=nagiosadmin,david
authorized_for_all_hosts=nagiosadmin,david
authorized_for_all_service_commands=nagiosadmin,david
authorized_for_all_host_commands=nagiosadmin,david
|
9、resource.cfg
resource.cfg是nagios的环境变量定义文件,文件内容只有一行
1
| $USER1$=/usr/local/nagios/libexec # 定义插件目录,不建议修改$USER1$的值。
|
# Nagios supports up to 32 $USERx$ macros ($USER1$ through $USER32$),环境变量必须先定义,然后才能在其他配置文件中进行引用。
在主配置文件nagios.cfg中,参数resource_file用于定义所有用户变量(宏)的存储文件,它用于存储对象定义中的可以访问的额外信息。这个文件的信息通常比较敏感,一般不允许通过web接口访问。
理解Nagios宏及其工作机制
Nagios还能够使用宏,并且宏的定义在整个Nagios系统中具有一致性。宏是能够用于对象定义中变量,其值通常依赖于上下文。在“命令”中定义的宏,相对于主机、服务其值会随之不同。通过定义宏,Nagios可以灵活的获取主机、服务和其他对象的信息。
在执行命令之前,Nagios将对命令中的宏替换为相应的值。这种宏替换发生在Nagios执行各种类型的宏的时候,如主机和服务的检测、通知、事件处理等。
引用宏
主机宏
1
2
3
4
5
6
| $HOSTNAME$ # 主机简称。取自于主机定义里的host_name域
$HOSTADDRESS$ # 主机地址。取自于主机定义里的address域
$HOSTSTATE$ # 主机当前状态,UP,DOWN,UNREACHABLE三者之一
$HOSTGROUPNAME$ # 主机组名
$LASTHOSTCHECK$ # 上次检测的时间戳
$LISTHOSTSTATE$ # 上一次检测的状态,UP,DOWN,UNREACHABLE三者之一
|
服务宏
1
2
3
| $SERVICESTATE$ # 服务状态描述,有w,u,c
$SERVICEDESC$ # 对当前服务的描述
$SERVICEGROUPNAMES$ # 服务组名
|
联系人宏
1
2
3
| $CONTACTNAME$ # 表示联系人,在联系人文件中定义,取自contact对象的contact_name
$CONTACTALIAS$ # 取自contact对象的alias
$CONTACTEMAIL$ # 取自contact对象的email
|
通知宏
1
| $NOTIFICATIONTYPE$ # 返回下面信息:("PROBLEM", "RECOVERY", "ACKNOWLEDGEMENT", "FLAPPINGSTART", "FLAPPINGSTOP", "FLAPPINGDISABLED", "DOWNTIMESTART", "DOWNTIMEEND", or "DOWNTIMECANCELLED").
|
日期/时间宏
1
| $LONGDATETIME$ # 当前的日期/时间戳
|
文件宏
1
| $LOGFILE$ # 日志文件的保存位置。$MAINCONFIGFILE$ 主配置文件的保存位置。
|
其他宏
1
2
| $ADMINEMAIL$ # 全局的管理员EMail地址
$ARGn$ # 指向第n个命令传递参数(通知、事件处理、服务检测等)。Nagios支持最多32个参数宏
|
语法格式
各个配置文件中的name必须要是全局唯一的,所以每次在定义name的时候,最好使用grep看一下是否被定义。
宏的引用方式: $var_name$
1
2
3
4
5
6
7
8
| # 'check_local_load' command definition
define command{
command_name check_local_load
command_line $USER1$/check_load -w $ARG1$ -c $ARG2$
}
# $USER1$ 是一个宏
# $ARG1$, $ARG2$ 定义参数占位符, 相当于定义 "形参"
|
1
2
3
4
5
6
7
8
9
| define service{
use local-service ; Name of service template to use
host_name localhost
service_description Current Load
check_command check_local_load!5.0,4.0,3.0!10.0,6.0,4.0
}
# use 指令,用来指定使用哪个template
# !用来传递参数, 每一个 !表示一个参数
# $ARG1$ == 5.0,4.0,3.0, $ARG2$ == 10.0,6.0,4.0 , 这里提供"实参"
|
三、实战
1、自定义一个monitor目录,然后修改主配置文件nagios.cfg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| [iyunv@localhost ~]# cd /etc/nagios
[iyunv@localhost nagios]# mkdir monitor
[iyunv@localhost nagios]# touch monitor/hosts.cfg
[iyunv@localhost nagios]# touch monitor/services.cfg
[iyunv@localhost nagios]# cp objects/*.cfg monitor/
### 然后编辑nagios.cfg
# 注释掉下面几行
#cfg_file=/etc/nagios/objects/commands.cfg # 命令配置文件
#cfg_file=/etc/nagios/objects/contacts.cfg # 联系人配置文件
#cfg_file=/etc/nagios/objects/timeperiods.cfg # 监视时段配置文件
#cfg_file=/etc/nagios/objects/templates.cfg # 模板
#cfg_file=/etc/nagios/objects/localhost.cfg # linux主机
# 添加
cfg_dir=/etc/nagios/monitor
|
改check_external_commands=0为check_external_commands=1 .这行的作用是允许在web界面下执行重启nagios、停止主机/服务检查等操作
2、修改CGI脚本配置文件cgi.cfg
先确保use_authentication=1。曾看过不少的文章,都是建议把use_authentication的值设置成”0”来取消验证,这是一个十分糟糕的想法。接下来修改default_user_name=nagiosadmin ,再后面的修改在下表列出
1
2
3
4
5
6
7
| authorized_for_system_information=nagiosadmin,test
authorized_for_configuration_information=nagiosadmin,test
authorized_for_system_commands=nagiosadmin # 多个用户之间用逗号隔开
authorized_for_all_services=nagiosadmin,test
authorized_for_all_hosts=nagiosadmin,test
authorized_for_all_service_commands=nagiosadmin,test
authorized_for_all_host_commands=nagiosadmin,test
|
那么上述用户名打那里来的呢?是执行命令 htpasswd –c /usr/local/nagios/etc/htpasswd test 所生成的,这个要注意,不能随便加没有存在的验证用户,为了安全起见,不要添加过多的验证用户。
3、监控时间段:timeperiods.cfg
我们可以根据实际需要进行修改,这里我保留默认的定义。注意:名称全局唯一,不要有空格
4、定义命令
命令:用于描述如何对主机或服务进行状态检测
1
2
3
4
5
6
7
8
9
10
| define command{
command_name check-host-alive
##command_name的名字必须全局唯一
command_line $USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5
}
## $USER1$/check_ping:引用宏$USER1$路径下的一个叫check_ping的插件
## -H $HOSTADDRESS$ :-H后跟主机地址,应用到哪个对象上,就是那个主机的地址
## -w 3000.0,80%:如果是80%的丢包率,延迟3s,就为警告状态 -w:警告,后跟达到警告的值,单位ms
## -c 5000.0,100% 如果有100%的丢包率,且延迟5s,就是危机状态
## -p:一共检测几个包
|
5、联系人: contacts.cfg
联系人:用于定义某对象出现问题时接收通知的人
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| define contact{
contact_name test # 联系人的名称(全局唯一),这个地方不要有空格
alias sys admin
service_notification_period 24x7
host_notification_period 24x7
service_notification_options w,u,c,r
host_notification_options d,u,r
service_notification_commands notify-by-email
host_notification_commands host-notify-by-email
email yahoon@test.com
pager 1338757xxxx
address1 xxxxx.xyyy@icq.com
address2 555-555-5555
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| ### service_notification_period 24x7
# 服务出了状况通知的时间段,这个时间段就是上面在timeperiods.cfg中定义的
### host_notification_period 24x7
# 主机出了状况通知的时间段, 这个时间段就是上面在timeperiods.cfg中定义的
### service_notification_options w,u,c,r
# 当服务出现w—报警(warning),u—未知(unkown),c—严重(critical),或者r—从异常情况恢复正常,# 在这四种情况下通知联系人.
### host_notification_options d,u,r
# 当主机出现d----—当机(down),u—返回不可达(unreachable),r—从异常情况恢复正常,在这3种情况下 # 通知联系人
#####状态及其表示符号########
w —— WARNING
u —— UNKNOWN
c —— CRITICAL
r —— OK(recovery)
f —— flapping
s —— 调试宕机时间开始或结束
### service_notification_commands notify-by-email
# 服务出问题通知采用的命令notify-by-email,这个命令是在commands.cfg中定义的,作用是给联系人# 发邮件.至于commands.cfg之后将专门介绍
### host_notification_commands host-notify-by-email
# 同上,主机出问题时采用的也是发邮件的方式通知联系人
### email your@test.com
# 联系的人email地址
### pager 1338757xxxx
# 联系人的手机,如果支持短信的通知的话,这个就很有用了。
|
按照这种模式,简单的复制修改即可创建联系人了。
创建联系人组:
1
2
3
4
5
6
| define contactgroup{
contactgroup_name sagroup # 联系人组的名称,同样不能空格
alias System Administrators # 别名
members test
# members 组的成员,来自于上面定义的contacts.cfg,如果有多个联系人则以逗号相隔
}
|
6、主机: hosts.cfg
主机:指的是被监控的机器,可以是物理主机,也可以是虚拟设备。一个主机对象的定义至少应该包含一个name,一个别名,一个IP地址,和用到的检测命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| define host{
host_name nagios-server
# 被监控主机的名称(全局唯一),最好别带空格
alias nagios server
# 别名
address 192.168.0.111
# 被监控主机的IP地址
check_command check-host-alive
# 监控的命令check-host-alive,这个命令来自commands.cfg,用来监控主机是否存活
max_check_attempts 5
# 检查失败后重试的次数
check_period 24x7
# 检查的时间段24x7,同样来自于我们之前在timeperiods.cfg中定义的
contact_groups sagroup
# 联系人组,上面在contactgroups.cfg中定义的sagroup
notification_interval 10
# 提醒的间隔,每隔10秒提醒一次
notification_period 24x7
# 提醒的周期, 24x7,同样来自于我们之前在timeperiods.cfg中定义的
notification_options d,u,r
# 指定什么情况下提醒,具体含义见之前contacts.cfg部分的介绍
}
#########
define host{
use linux-server ## 引用模板 host_name localhost ## 主机名,全局唯一
alias localhost ## 别名
address 127.0.0.1 ## ip地址
}
|
创建主机组:
1
2
3
4
5
6
| define hostgroup{
hostgroup_name sa-servers # 主机组名称
alias sa Servers # 别名
members nagios-server
# 组的成员主机,多个主机以逗号相隔,必须是上面hosts.cfg中定义的
}
|
7、服务: services.cfg
服务:及主机所提供的功能或资源对象,如HTTP服务,存储空间资源或CPU负载等。
假设我们现在要监控一条机器的web服务是否正常,我们需要定义哪些对象呢?最重要的有三点:首先监控哪台主机(host),然后是这个监控用什么命令实现(command),最后是除了问题通知给哪个联系人(contact)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| define service{
host_name nagios-server
# 被监控的主机,hosts.cfg中定义的
service_description check-host-alive
# 这个监控项目的描述(也可以说是这个项目的名称),可以空格,我们这里定义的是监控这个主机是不是存活
check_command check-host-alive
# 所用的命令,是commands.cfg中定义的
max_check_attempts 5
normal_check_interval 3
retry_check_interval 2
check_period 24x7
# 监控的时间段,是timeperiods.cfg中定义的
notification_interval 10
notification_period 24x7
# 通知的时间段, ,是timeperiods.cfg中定义的
notification_options w,u,c,r
# 在监控的结果是wucr时通知联系人,具体含义看前文.
contact_groups sagroup
# 联系人组,是contactgroups.cfg中定义的
}
###########
define service{
use local-service ## 引用模板
host_name localhost ## 先说明是在哪个主机上的服务
service_description PING
##服务名不要求全局唯一的,只要在当前主机上唯一就可以
check_command check_ping!100.0,20%!500.0,60%
##说明使用的是check_ping命令
}
|
服务不能脱离主机而运行,所以定义服务时,必须要说明哪一个主机的服务。
上面使用的check_ping命令是在commands.cfg文件中定义的:
1
2
3
4
5
6
7
8
9
10
| # 'check_ping' command definition
define command{
command_name check_ping
##需事先定义好命令,然后再在服务中引用的
command_line $USER1$/check_ping -H
$HOSTADDRESS$ -w $ARG1$ -c $ARG2$ -p 5
}
## $HOSTADDRESS$:对应于上面主机中的$HOSTADDRESS$就是127.0.0.1
## 定义service时是有两个参数!100.0,20%和!500.0,60%,就是把对应的参数传递给command中的
# $ARG1$和$ARG2$
|
8、模板:templates.cfg
Nagios通过功能强大的继承引擎来实现基于模板的对象继承。这就意味着可以定义将某类型的对象其通用的属性抽象为对象的模板,并在定义对象的时候直接从模板继承相关属性的定义。
从哪个模板继承,就引用哪个模板。
9、对象间的依赖关系
为了描述Nagios对象间的依赖关系,这里提到两个术语:master(被依赖的主机或服务), dependent(依赖于master的Nagios对象)
可以定义对象间的依赖关系,为某对象定义其父对象,也可以指定此依赖关系生效的时段。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| ## 如定义主机间的依赖关系:
define hostdependency
{
dependent_host_name backuphost
##定义dependent主机
host_name vpnserver1 ##定义master主机
dependency_period maintenancewindows
##定义依赖时段
}
##服务间依赖关系的定义类似于主机间的依赖关系,例如:
define servicedependency
{
host_name mysqlserver ##master主机名
service_description mysql ##master服务名
dependent_hostgroup_name apacheservers
##dependent主机组名
dependent_service_description webservice
##denpendent服务名
execution_failure_criteria c,u
##定义master为何种状态时不再对依赖
##于此master的主机或服务进行检测,
notification_failure_criteria c,u,w
##用于定义master处于何种状态时不会
##发送dependent相关的主机问题通知到联系人
}
|
10、验证Nagios配置文件的正确性
1
2
3
4
5
6
7
| [iyunv@localhost ~]# /usr/local/nagios/bin/nagios -v /etc/nagios/nagios.cfg
# 如果看到以下信息,说明配置没有问题,就可以重启nagios服务了
Total Warnings: 0
Total Errors: 0
Things look okay - No serious problems were detected during the pre-flight check
|
Nagios提供的这个验证功能非常有用,在错误信息中通常会打印出错误配置文件名以及文件的哪一行出错,这使得我们排查问题变得简单。
|