一个在IT行业摸爬打滚的程序猿

0%

最详细nagios配置说明及注意事项

0x00、前言
至于安装这里不再讲述,直接讲述配置出现的小坑、大坑及神坑!!(好了,我也不知道下面提到的算不算神坑)
0x01、依赖环境

先讲述一下这里需要的依赖是:nagios、ganglia、apache、Python2.7(及可能使用到Python2.7,为啥呢?因为你使用py脚本来扩展监控的话,那么,这里也需要安装一下,好像centos或者ubantu都是自带Python2.7的)

0x02、安装文件路径
tips:先来看一下nagios安装之后的路径,这个路径是我目前安装出现的路径,至于其他路径,欢迎各位小伙伴在下面评论里面补充一下,感谢!
1
/usr/local/nagios  # nagios安装路径,修改过默认安装路径的同学,自行替换哈

nagios目录包含如下文件:

1
2
3
4
5
6
7
8
root@localhost:/usr/local$ tree nagios/ -L 1
nagios
├── bin # Nagios 可执行程序所在目录
├── etc # 这个是有nagios重要配置的文件,如nagios.cfg文件
├── libexec # 这个是脚本的存放路径,即Nagios 外部插件所在目录
├── sbin # Nagios CGI 文件所在目录,也就是执行外部命令所需文件所在的目录
├── share # Nagios网页文件所在的目录
└── var # Nagios 日志文件、lock 等文件所在的目录

其中etc文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
root@localhost:/usr/local/nagios$ tree etc/ -L 1

etc/
├── cgi.cfg
├── dallas
├── htpasswd.users
├── nagios.cfg # 这个最为重要的nagios配置文件,包括但不限于定义cfg文件路径
├── objects # 这个是cfg文件所在目录,即配置监控主机的配置文件,建议每个主机建一个目录,然后另外存放来配置,这样好管理、好维护
└── resource.cfg # nagios的变量定义文件,文件内容只有一行,如下:

'''$USER1$=/usr/local/nagios/libexec'''
其中,变量$USER1$指定了安装nagios插件的路径,
如果把插件安装在了其它路径,只需在这里进行修改即可。
需要注意的是,变量必须先定义,然后才能在其它配置文件中进行引用,谨记啊,不然两行泪!!
0x03、配置文件提到的概念

这些文件里面配置涉及的概念有:

host主机、hostname域名、hostgroup主机组;service服务、servicegroup服务组;contacts联系人、contactsgroup联系人组;监控时间、command监控命令;

除了以上还有其他概念,上面列出来的是常提到的概念。

0x04、下面来打个预防针———屡一下配置的思路
配置过程大致分为以下四步:

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

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

03:定义监控的时间段;

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

0x05、开始配置旅程
tips:还是强调一下,最好是一个主机配置一个文件,以便以后好维护
1
2
3
4
5
6
7
8
9
10
cd /usr/local/nagios/etc/objects  # 切换到配置文件路径下

创建对应主机.cfg文件,这里提示一下使用ip最后的数字来起名字,如192.168.1.51,则起名字为:host_51.cfg
tips:这里创建的文件,建议直接复制原来的文件

sudo cp localhost.cfg host_51.cfg

然后其他的文件:
contacts.cfg、command.cfg、timeperiods.cfg、templates.cfg
就用原来的文件即可,只是使用的时候稍稍改一下下

templates.cfg是模板配置文件,很多共性的属性定义成模板,方便多次引用,以及不用重复定义,这就是templates.cfg的作用。

00、templates.cfg里面内容参数说明如下:
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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!
}
01、commands.cfg文件

此文件是默认存在的,基本不用怎么修改,当这些基本命令不再满足欲望强烈的你的时候,你可以在这个文件后面添加上你要扩展的命令名及其执行需要的参数,记得添加的命令的脚本要加到对应的文件夹,所谓对应的文件夹就是:==/usr/local/nagios/libexec==,或者你可以直接输入绝对路径也行

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#notify-host-by-email命令的定义 
define command{
command_name notify-host-by-email #命令名称,即定义了一个主机异常时发送邮件的命令。
command_line /usr/bin/printf "%b" "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\nHost: $HOSTNAME$\nState: $HOSTSTATE$\nAddress: $HOSTADDRESS$\nInfo: $HOSTOUTPUT$\n\nDate/Time: $LONGDATETIME$\n" | /bin/mail -s "** $NOTIFICATIONTYPE$ Host Alert: $HOSTNAME$ is $HOSTSTATE$ **" $CONTACTEMAIL$ #命令具体的执行方式。
}
#notify-service-by-email命令的定义
define command{
command_name notify-service-by-email #命令名称,即定义了一个服务异常时发送邮件的命令
command_line /usr/bin/printf "%b" "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$SERVICEOUTPUT$\n" | /bin/mail -s "** $NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" $CONTACTEMAIL$
}
#check-host-alive命令的定义
define command{
command_name check-host-alive #命令名称,用来检测主机状态。
command_line $USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5
# 这里的变量$USER1$在resource.cfg文件中进行定义,即$USER1$=/usr/local/nagios/libexec;
# 那么check_ping的完整路径为/usr/local/nagios/libexec/check_ping;
# “-w 3000.0,80%”中“-w”说明后面的一对值对应的是“WARNING”状态,“80%”是其临界值。
# “-c 5000.0,100%”中“-c”说明后面的一对值对应的是“CRITICAL”,“100%”是其临界值。
# “-p 1”说明每次探测发送一个包。
}
define command{
command_name check_local_disk
command_line $USER1$/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$ #$ARG1$是指在调用这个命令的时候,命令后面的第一个参数。
}
define command{
command_name check_local_load
command_line $USER1$/check_load -w $ARG1$ -c $ARG2$
}
define command{
command_name check_local_procs
command_line $USER1$/check_procs -w $ARG1$ -c $ARG2$ -s $ARG3$
}
define command{
command_name check_local_users
command_line $USER1$/check_users -w $ARG1$ -c $ARG2$
}
define command{
command_name check_local_swap
command_line $USER1$/check_swap -w $ARG1$ -c $ARG2$
}
define command{
command_name check_ftp
command_line $USER1$/check_ftp -H $HOSTADDRESS$ $ARG1$
}
define command{
command_name check_http
command_line $USER1$/check_http -I $HOSTADDRESS$ $ARG1$
}
define command{
command_name check_ssh
command_line $USER1$/check_ssh $ARG1$ $HOSTADDRESS$
}
define command{
command_name check_ping
command_line $USER1$/check_ping -H $HOSTADDRESS$ -w $ARG1$ -c $ARG2$ -p 5
}
define command{
command_name check_nt
command_line $USER1$/check_nt -H $HOSTADDRESS$ -p 12489 -v $ARG1$ $ARG2$
}

/*-----------------------我是超级无敌最可爱的分割线-----------------------*/
# 例如添加以下命令:
define command{
command_name check_procs_nginx
command_line $USER1$/check_procs -c 1: -a '/usr/sbin/nginx'
}


define command{
command_name check_procs_mysql
command_line $USER1$/check_procs -c 1: -a '/usr/sbin/mysqld'
}
# 记得将以上命令的check_procs,记得检查你的脚本是否在/usr/local/nagios/libexec路径当中,不在自己去找一下,这脚本是通用的(算是通用的,别人造好的轮子)
02、resource.cfg文件

这个文件在前提已经提及,请回头查看

03、contacts.cfg文件

是用来定义联系人及联系人组的配置文件,当你要监控的服务出现异常,达到所设置的阈值,它就可以通过这边设置的联系人来发送邮件。

1
2
3
4
5
6
7
8
9
10
11
define contact{
contact_name qizai #联系人的名称,这个地方不要有空格
use generic-contact #引用generic-contact的属性信息,其中“generic-contact”在templates.cfg文件中进行定义
alias Nagios Admin
email qizai.niubi@alimama.cn
}
define contactgroup{
contactgroup_name nagios #联系人组的名称,同样不能空格
alias nagios #联系人组描述
members qizai #联系人组成员,其中“qizai”就是上面定义的联系人,如果有多个联系人则以英文逗号相隔
}
04、timeperiods.cfg文件

这个是定义监控的时间段。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#下面是定义一个名为24x7的时间段,即监控所有时间段  
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
}
#下面是定义一个名为workhours的时间段,即工作时间段。
define timeperiod{
timeperiod_name workhours
alias Normal Work Hours
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
}
05、cgi.cfg文件

此文件用来控制相关cgi脚本,如果想在nagios的web监控界面执行cgi脚本,例如重启nagios进程、关闭nagios通知、停止nagios主机检测等,这时就需要配置cgi.cfg文件了。由于nagios的web监控界面验证用户为chd,所以只需在cgi.cfg文件中添加此用户的执行权限就可以了,需要修改的配置信息如下:

1
2
3
4
5
6
7
8
default_user_name=chd
authorized_for_system_information=nagiosadmin,chd
authorized_for_configuration_information=nagiosadmin,chd
authorized_for_system_commands=chd
authorized_for_all_services=nagiosadmin,chd
authorized_for_all_hosts=nagiosadmin,chd
authorized_for_all_service_commands=nagiosadmin,chd
authorized_for_all_host_commands=nagiosadmin,chd
06、host_51.cfg文件

这个host_51.cfg文件就是定义监控192.168.1.51主机,下面这些是我的配置文件跟原来的有所改动,里面有很多要注意的地方,我已经标了注释,请详细看看,==前面的配置文件还有个坑==,在这个配置文件里面已经补上了,看看你能不能找出来,==我最后再回头补上这个坑==( ☺☺奸笑!!!哈哈哈,好了我不笑了,万一被打…)

tips:从这个host_51.cfg配置的形式跟前面的.cfg的文件对比,你就可以发现!

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
define host {
use linux-server
host_name 192.168.1.51 ; 这里你使用name,前端nagios展示的就是啥名,而且这里的name是在后面的service用到的,请留意,骚不注意两行泪啊!!!
address 192.168.1.51
}


define hostgroup {
hostgroup_name 51_ganglia-servers ; 这个name也是要在hostgroup中全局唯一的,而且也是在下面使用到
alias nagios server
members 192.168.1.51 ; 这里的成员名字是上面host里面的host_name字段的值,如果是多个成员,记得使用英文逗号隔开
}

define servicegroup {
servicegroup_name 51_ganglia-metrics ; 这个name也是在servicegroup中是唯一的,且在后面使用到
alias Ganglia Metrics
}

define command {
command_name 50_check_ganglia ; 这个是扩展的脚本命令,暂时不用管
command_line python2 $USER1$/check_ganglia.py -h $HOSTNAME$ -m $ARG1$ -w $ARG2$ -c $ARG3$ -o $ARG4$
}

define service {
use generic-service ; 这个use字段来源于模板templates.cfg里面的,一般引用即可
name 51_ganglia-service ; 这个name是在service中要全局唯一,且在下面的每一个service里面使用到,所以这里是什么name,下面的就是要use 这个name,不然前端页面是看不到下面那些配置的service的,记得!!巨坑,两行泪啊!
hostgroup_name 51_ganglia-servers ;这个name是前面的hostgroup里面的
service_groups 51_ganglia-metrics ; 这个也是前面对应的
notifications_enabled 1 ; 这个是表示是否发送警报,1表示发送,0表示不发送
notification_interval 10 ; 这个表示重新发送警报的时间间隔
register 0
}

define service{
use 51_ganglia-service
service_description 内存状态
check_period 24x7 ; 检测的时间段
max_check_attempts 3 ; 最大检测次数,这个时间单位在timeperiods.cfg里面定义的,好像默认是分钟
normal_check_interval 3 ; 这个是正常检测的时间间隔(指没有出现异常的情况)
retry_check_interval 2 ;这个是出现问题之后,重新尝试的时间间隔
contact_groups admins ; 发生故障通知的联系人组
notification_interval 30 ;这个是重新发送警报的时间间隔
notification_period 24x7 ; 发送警报的时间段
notification_options w,u,c,r ;发送警报的类型.warming警告、unknown不可达/未知、critical致命错误、recovery恢复正常

check_command check_mem!90!90 ;执行脚本的命令,及其相关的参数第一个90表示warming,第二个90表示critical等级
}


define service{
;use ganglia-service ; Name of service template to use
use 51_ganglia-service
service_description 根分区
check_period 24x7 ; 检测的时间段
max_check_attempts 3 ; 最大检测次数
normal_check_interval 3
retry_check_interval 2
contact_groups admins ; 发生故障通知的联系人组
notification_interval 360
notification_period 24x7 ; 通知的时间段
notification_options w,u,c,r

check_command check_local_disk!15%!10%!/
}


define service{
;use ganglia-service 这里的use使用模板就是指当前文件的模板,去前面service找
use 51_ganglia-service
service_description 系统负载
check_period 24x7 ; 检测的时间段
max_check_attempts 3 ; 最大检测次数
normal_check_interval 3
retry_check_interval 2
contact_groups admins ; 发生故障通知的联系人组
notification_interval 20
notification_period 24x7 ; 通知的时间段
notification_options w,u,c,r

check_command check_local_load!15,10,5!30,25,20

}


define service {
use 51_ganglia-service
service_description 主机是否运行中 ; 服务描述
check_period 24x7 ; 检测的时间段
max_check_attempts 3 ; 最大检测次数
normal_check_interval 3
retry_check_interval 2
contact_groups admins ; 发生故障通知的联系人组
notification_interval 10
notification_period 24x7 ; 通知的时间段
notification_options w,u,c,r

check_command check-host-alive!3000,80%!5000,100%
}

define service {
use 51_ganglia-service ; Name of service template to use
service_description PING
check_period 24x7 ; 检测的时间段
max_check_attempts 3 ; 最大检测次数
normal_check_interval 3
retry_check_interval 2
contact_groups admins ; 发生故障通知的联系人组
notification_interval 30
notification_period 24x7 ; 通知的时间段
notification_options w,u,c,r

check_command check_ping!100.0,60%!500.0,80% ;设定ping包平均时长100ms,丢包率为60%触发w告警;ping包平均响应时长为500ms,触发c告警
}


define service {
use 51_ganglia-service ; Name of service template to use
service_description 当前用户
check_period 24x7 ; 检测的时间段
max_check_attempts 3 ; 最大检测次数
normal_check_interval 3
retry_check_interval 2
contact_groups admins ; 发生故障通知的联系人组
notification_interval 120
notification_period 24x7 ; 通知的时间段
notification_options w,u,c,r

check_command check_local_users!20!50
}


define service {
use 51_ganglia-service ; Name of service template to use
service_description Total Processes
check_period 24x7 ; 检测的时间段
max_check_attempts 3 ; 最大检测次数
normal_check_interval 3
retry_check_interval 2
contact_groups admins ; 发生故障通知的联系人组
notification_interval 30
notification_period 24x7 ; 通知的时间段
notification_options w,u,c,r

check_command check_local_procs!250!400!RSZDT
}


define service {
use 51_ganglia-service ; Name of service template to use
service_description Swap Usage
check_period 24x7 ; 检测的时间段
max_check_attempts 3 ; 最大检测次数
normal_check_interval 3
retry_check_interval 2
contact_groups admins ; 发生故障通知的联系人组
notification_interval 30
notification_period 24x7 ; 通知的时间段
notification_options w,u,c,r

check_command check_local_swap!15%!10%
}




define service {
use 51_ganglia-service ; Name of service template to use
service_description HTTP
check_period 24x7 ; 检测的时间段
max_check_attempts 3 ; 最大检测次数,达到之后即发送警报
normal_check_interval 3 ; 正常监测时间间隔
retry_check_interval 2 ; 异常重试时间间隔
contact_groups admins ; 发生故障通知的联系人组
notification_interval 0 ; 发送警报时间间隔,单位为分钟
notification_period 24x7 ; 通知的时间段
notification_options w,u,c,r

check_command check_http
}


define service {
use 51_ganglia-service ; Name of service template to use
service_description nginx
check_period 24x7 ; 检测的时间段
max_check_attempts 3 ; 最大检测次数,达到之后即发送警报
normal_check_interval 3 ; 正常监测时间间隔
retry_check_interval 2 ; 异常重试时间间隔
contact_groups admins ; 发生故障通知的联系人组
notification_interval 0 ; 发送警报时间间隔,单位为分钟,为0表示仅仅发送一次
notification_period 24x7 ; 通知的时间段
notification_options w,u,c,r

check_command check_procs_nginx
}


define service {
use 51_ganglia-service ; Name of service template to use
service_description mysql
check_period 24x7 ; 检测的时间段
max_check_attempts 3 ; 最大检测次数,达到之后即发送警报
normal_check_interval 3 ; 正常监测时间间隔
retry_check_interval 2 ; 异常重试时间间隔
contact_groups admins ; 发生故障通知的联系人组
notification_interval 0 ; 发送警报时间间隔,单位为分钟,为0表示仅仅发送一次
notification_period 24x7 ; 通知的时间段
notification_options w,u,c,r

check_command check_procs_mysql
}
注意:在/usr/local/nagios/etc/objects 下默认有localhost.cfg 和windows.cfg 这两个配置文件,localhost.cfg 文件是定义监控主机本身的,windows.cfg 文件是定义windows 主机的,其中包括了对host 和相关services 的定义。所以在本次实验中,将直接在localhost.cfg 中定义监控主机(Nagios-Server),在windows.cfg中定义windows 主机(Nagios-Windows)。根据自己的需要修改其中的相关配置,详细如下:
原来的localhost.cfg内容如下:
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
define host{
use linux-server ; Name of host template to use
; This host definition will inherit all variables that are defined
; in (or inherited by) the linux-server host template definition.
host_name Nagios-Server
alias Nagios-Server
address 127.0.0.1
}
define hostgroup{
hostgroup_name linux-servers ; The name of the hostgroup
alias Linux Servers ; Long name of the group
members Nagios-Server ; Comma separated list of hosts that belong to this group
}
define service{
use local-service ; Name of service template to use
host_name Nagios-Server
service_description PING
check_command check_ping!100.0,20%!500.0,60%
}
define service{
use local-service ; Name of service template to use
host_name Nagios-Server
service_description Root Partition
check_command check_local_disk!20%!10%!/
}
define service{
use local-service ; Name of service template to use
host_name Nagios-Server
service_description Current Users
check_command check_local_users!20!50
}
define service{
use local-service ; Name of service template to use
host_name Nagios-Server
service_description Total Processes
check_command check_local_procs!250!400!RSZDT
}
define service{
use local-service ; Name of service template to use
host_name Nagios-Server
service_description Current Load
check_command check_local_load!5.0,4.0,3.0!10.0,6.0,4.0
}
define service{
use local-service ; Name of service template to use
host_name Nagios-Server
service_description Swap Usage
check_command check_local_swap!20!10
}
define service{
use local-service ; Name of service template to use
host_name Nagios-Server
service_description SSH
check_command check_ssh
notifications_enabled 0
}
define service{
use local-service ; Name of service template to use
host_name Nagios-Server
service_description HTTP
check_command check_http
notifications_enabled 0
}
windows.cfg 文件内容:
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
define host{
use windows-server ; Inherit default values from a template
host_name Nagios-Windows ; The name we're giving to this host
alias My Windows Server ; A longer name associated with the host
address 192.168.1.113 ; IP address of the host
}
define hostgroup{
hostgroup_name windows-servers ; The name of the hostgroup
alias Windows Servers ; Long name of the group
}
define service{
use generic-service
host_name Nagios-Windows
service_description NSClient++ Version
check_command check_nt!CLIENTVERSION
}
define service{
use generic-service
host_name Nagios-Windows
service_description Uptime
check_command check_nt!UPTIME
}
define service{
use generic-service
host_name Nagios-Windows
service_description CPU Load
check_command check_nt!CPULOAD!-l 5,80,90
}
define service{
use generic-service
host_name Nagios-Windows
service_description Memory Usage
check_command check_nt!MEMUSE!-w 80 -c 90
}
define service{
use generic-service
host_name Nagios-Windows
service_description C:\ Drive Space
check_command check_nt!USEDDISKSPACE!-l c -w 80 -c 90
}
define service{
use generic-service
host_name Nagios-Windows
service_description W3SVC
check_command check_nt!SERVICESTATE!-d SHOWALL -l W3SVC
}
define service{
use generic-service
host_name Nagios-Windows
service_description Explorer
check_command check_nt!PROCSTATE!-d SHOWALL -l Explorer.exe
}
08、services.cfg文件

此文件默认也不存在,需要手动创建,services_50.cfg文件主要用于定义监控的服务和主机资源,例如监控http服务、ftp服务、主机磁盘空间、主机系统负载等等。Nagios-Server 和Nagios-Windows 相关服务已在相应的配置文件中定义,所以这里只需要定义Nagios-Linux 相关服务即可,这里只定义一个检测是否存活的服务来验证配置文件的正确性,其他服务的定义将在后面讲到。

但是,这里的services.cfg我是没有创建的,因为我的host_51.cfg文件就已经包含那些服务了,所以我这里不创建这个文件了
09、nagios.cfg文件

nagios.cfg默认的路径为/usr/local/nagios/etc/nagios.cfg,是nagios的核心配置文件,所有的对象配置文件都必须在这个文件中进行定义才能发挥其作用,这里只需将对象配置文件在Nagios.cfg文件中进行引用即可。

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
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/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/windows.cfg # windows 主机配置文件
#cfg_file=/usr/local/nagios/etc/objects/localhost.cfg

# 下面这个就是我们配置的监控的主机
cfg_file=/usr/local/nagios/etc/objects/host_51.cfg

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配置中所有的时间单位都是分钟。
0x06、至此配置首先完成一部分,下面来检验一下这些配置是否正确

检验的正确性的命令如下:

1
sudo /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

当你看到下面的输出的时候:

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
31
32
33
34
35
36
37
38
39
40
41
Nagios Core 4.4.3
Copyright (c) 2009-present Nagios Core Development Team and Community Contributors
Copyright (c) 1999-2009 Ethan Galstad
Last Modified: 2019-01-15
License: GPL

Website: https://www.nagios.org
Reading configuration data...
Read main config file okay...
WARNING: The normal_check_interval attribute is deprecated and will be removed in future versions. Please use check_interval instead.

........
省略中间一大部分
........

Running pre-flight check on configuration data...

Checking objects...
Checked 20 services.
Checked 2 hosts.
Checked 2 host groups.
Checked 2 service groups.
Checked 1 contacts.
Checked 1 contact groups.
Checked 38 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

睁大眼睛啦,上面中,最重要的是这两句(0:warming;0:error),才是正确的配置:

1
2
Total Warnings: 0
Total Errors: 0

如果你看到有报错,那也不用慌,看他提示的报错信息来,经过我个人的踩坑,发现提示的错误信息包括有:重复定义(host组名、service组名)、service找不到,如果你按照我前面提示的去配置,这里就不会出现这种问题了,不过难免第一次会踩坑,多踩人生才精彩!!!

目前截图保留的报错如下:
报错信息

0x07、启动与停止

简单粗暴的shell通过脚本来启动与停止(这样不知道好不好,反正是挺方便的,哈哈哈)

**启动:
1
2
3
4
5
6
7
8
#!/bin/bash
source /etc/profile

#sudo /etc/init.d/gmetad restart # 可以忽略这几个
#sudo /etc/init.d/ganglia-monitor restart
#sudo /etc/init.d/apache2 restart
sudo service nagios restart
sudo service sendmail restart

启动之后,如果你的配置是错误的话,那么前端页面看到的结果是:
配置错误导致启动不了

**停止:
1
2
3
4
5
#!/bin/bash
source /etc/profile

sudo service nagios stop
sudo service sendmail stop
**也可以通过nagios页面来启动和停止:
1
2
通过web监控页的"Process Info" -> "Restart the Nagios process"来重启nagios
通过web监控页的"Process Info" -> "Shutdown the Nagios process"来停止nagios

正常启动之后,可以通过界面来重启等,如下:
nagios-web端重启、启动

0x08、查看配置成果
Tips:我这里是做了端口映射,你们要对应的修改一下

启动完成之后,可以通过浏览器登录Nagios Web监控页,账号密码就是前边配置的账号密码,我前边配置的账号密码都是nagios

1
2
http://192.168.1.51:8888/nagios/
# http://你的ip:你的端口/nagios/

然后查看相关信息。

1
2
点击左面的Current Status -> Hosts 可以看到所定义的主机
点击左面的Current Status -> Services 可以看到对应主机的服务

图片如下:
查看nagios配置的主机情况

查看配置的services配置情况

必杀技来了,看好了!!!
1
2
3
4
5
6
前面提到的坑就是,在host_51.cfg这种.cfg文件当中,
记得注释的时候是使用英文的分号;来注释,
并不能使用井号#来注释,经过亲身经历之后,
发现英文的分号注释是没有问题的!!
谨记啊!!!真的很痛苦,检查了很多遍,配置很多遍,才能通过。
希望你们看到这段话的同时不要恨我、别喷我,你目前只有回头修改,溜了溜了....

至此,nagios配置本机的监控完毕,上面的记录当中可能有些不完整,因为我是配置好了之后,过了一段时间才从新写下来记录的,如有不妥的地方欢迎各位大佬指正,感谢!

本文教程写完了,希望能够帮助到各位在运维路上的小伙伴们,觉得不错点个赞呗
感谢认真读完的这篇教程的您

先别走呗,这里有可能有你需要的干货文章:

运维必备:ganglia集群监控服务端及客户端配置实战