Nagios4 系统监控工具安装及配置简介(Ubuntu 19.04)

Nagios 是一款开源的系统监控工具。它主要负责对网络环境中的硬件设备及软件服务进行持续的检查,确保这些设备或服务处于正常运行的状态。一旦发现任何错误,Nagios 会在尽可能短的时间内向工作人员发出警报,同时也会在一定程度上尝试自动修复故障(比如重启设备或服务)。

一、简介

Nagios 监控的对象主要可分为两类:

  • Hosts 表示网络中的物理(或虚拟化的)设备,如服务器、工作站、路由器和打印机等
  • Services 表示网络中某些设施提供的特定功能的集合,如 CPU、内存、磁盘空间等。其他如 sshd 服务等也可被定义为 Service 接受 Nagios 的监控

此外,多台主机还可以被划分到不同的主机组中以方便管理和维护。

plugins

Nagios 提供的所有的监控操作全部都由插件来完成。插件是一些用来传递监控信息的附加组件,Nagios 通过它们执行具体的监控和检查任务,同时对收集到的结果进行统计与整理。

Nagios 默认提供了一些基础的插件,几乎可以满足所有常见的监控任务。此外,如果有特殊的监控需求,也可以自行编写 Nagios 插件。
一般标准插件的默认安装路径为 /usr/lib/nagios/plugins ,插件名称绝大多数以 check_ 开头:

1
2
3
4
5
6
7
$ ls /usr/lib/nagios/plugins
check_apt check_file_age check_imap check_nagios check_pop check_ssmtp
check_breeze check_flexlm check_ircd check_nntp check_procs check_swap
check_by_ssh check_fping check_jabber check_nntps check_radius check_tcp
check_clamd check_ftp check_ldap check_nt check_real check_time
check_cluster check_game check_ldaps check_ntp check_rpc check_udp
...

二、安装 Nagios

我用的是 Ubuntu 19.04 系统,呃,没有尝试过其他的安装方式。就是直接用包管理器(apt-get)安装的,命令(就一条,,,)如下:
$ sudo apt-get install nagios4

该命令会同时安装一些标准的 Nagios 插件以及一个简单的 Web 监控平台(需要 Apache2 服务器和 PHP 语言支持)。
apt-get 命令安装完 Nagios4 之后,Web 监控平台的 Apache2 配置文件会自动添加到 /etc/apache2/conf_enabled 目录下并直接启用。

只不过我这里重启 Apache2 服务时报错,原因是还需要启用额外两个 Apache 的模块,命令如下:

1
2
$ sudo a2enmod auth_digest
$ sudo a2enmod authz_groupfile

重启 Apache2 后访问 http://127.0.0.1/nagios4 链接,即可进入 Web 监控平台,截图如下:
nagios4

三、配置文件介绍

Nagios 的配置文件一般位于 /etc/nagios 或者 /usr/local/etc/nagios 目录下,最主要的配置文件为 nagios.cfg
nagios.cfg 像是一个统领性的大纲文件,它除了定义一些全局范围内的基本配置外,还用于指定其他(更细节的)配置文件的位置或者组织方式,类似于书籍中的目录。

如文件中的 cfg_dircfg_file 两个配置项:

1
2
3
4
5
6
7
8
9
10
11
12
13
...
cfg_dir=/etc/nagios-plugins/config
cfg_dir=/etc/nagios4/conf.d

# You can specify individual object config files as shown below:
cfg_file=/etc/nagios4/objects/commands.cfg
cfg_file=/etc/nagios4/objects/contacts.cfg
cfg_file=/etc/nagios4/objects/timeperiods.cfg
cfg_file=/etc/nagios4/objects/templates.cfg

# Definitions for monitoring the local (Linux) host
cfg_file=/etc/nagios4/objects/localhost.cfg
...

即关于监控对象的详细配置,一般保存在由 cfg_file 指定的配置文件中。或者也可以将包含配置信息的文件放置在由 cfg_dir 指定的目录(及其子目录)下。

比如默认启用的 /etc/nagios4/objects/localhost.cfg 配置文件,其中包含了关联到本地主机的多个监控对象的信息,从中也可以看出 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
29
30
31
32
33
34
35
36
# Define a host for the local machine

define host{
use linux-server ; Name of host template to use
host_name localhost
alias localhost
address 127.0.0.1
}

# Define a service to check the disk space of the root partitio on the local machine. Warning if < 20% free, critical if < 10% free space on partition.

define service{
use local-service ; Name of service template to use
host_name localhost
service_description Root Partition
check_command check_local_disk!20%!10%!/
}

# Define a service to check the number of currently running procs on the local machine. Warning if > 250 processes, critical if > 400 processes.

define service{
use local-service ; Name of service template to use
host_name localhost
service_description Total Processes
check_command check_local_procs!250!400!RSZDT
}

# Define a service to check HTTP on the local machine. Disable notifications for this service by default, as not all users may have HTTP enabled.

define service{
use local-service ; Name of service template to use
host_name localhost
service_description HTTP
check_command check_http
notifications_enabled 0
}

至于 /etc/nagios4/objects 目录下默认启用的几个配置文件,则包含了一些自定义命令(commands.cfg)、联系人信息(contacts.cfg)、时间段配置(timeperiods.cfg)以及主机和服务的模板(templates.cfg)等。

比如 localhost.cfg 中的 use linux-server 配置项,即使用了由 templates.cfg 文件定义的名为 linux-server 的模板:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ cat /etc/nagios4/objects/templates.cfg
...
define host{
name linux-server ; The name of this host template
use generic-host ; This template inherits other values from the generic-host template
check_period 24x7 ; By default, Linux hosts are checked round the clock
check_interval 5 ; Actively check the host every 5 minutes
retry_interval 1 ; Schedule host check retries at 1 minute intervals
max_check_attempts 10 ; Check each Linux host 10 times (max)
check_command check-host-alive ; Default command to check Linux hosts
notification_period workhours ; Linux admins hate to be woken up, so we only notify during the day
notification_interval 120 ; Resend notifications every 2 hours
notification_options d,u,r ; Only send notifications for specific host states
contact_groups admins ; Notifications get sent to the admins by default
register 0 ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL HOST, JUST A TEMPLATE!
}
...

其他由 Nagios 默认提供的主机或服务模板、联系人模板等也都保存在该文件中。

总的来说,在创建自定义配置时,objects 目录下的配置文件可以作为很有价值的参考示例,同时其中定义的命令、联系人和模板等也可在需要时直接通过名称调用,减少相关代码的编写。

对于设备数量庞大且种类较复杂的场景,建议将 Nagios 配置文件的组织架构设计成便于管理的形式。比如:

1
2
3
4
5
6
7
8
9
10
11
$ tree /etc/nagios4/conf.d
/etc/nagios4/conf.d
├── commands
├── contactgroups
├── contacts
├── hostgroups
├── hosts
│   └── server2.cfg
├── servicegroups
├── services
└── timeperiods

四、定义监控对象

宏指令

能够通过宏指令来简化配置,是 Nagios 的关键特性之一。宏的运用在很大程度上提高了定义对象和命令的灵活性。如下面的配置示例:

1
2
3
4
5
6
7
8
9
10
11
define host{
use linux-server
host_name server2
address 192.168.1.102
check_command check-host-ssh
}

define command{
command_name check-host-ssh
command_line $USER1$/check_ssh -H $HOSTADDRESS$
}

其中的 $USER1$$HOSTADDRESS$ 即是预先定义的两个宏。
$USER1$ 是在资源配置文件(/etc/nagios4/resource.cfg)中指定的 Nagios 插件的安装路径。
$HOSTADDRESS$ 则表示 host 定义中的 address 项的内容,即主机的 IP 地址。

定义主机

简单的示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
define host{
host_name server1
hostgroups linux-servers
alias Ubuntu 19.04
address 192.168.1.101
check_command check-host-alive
check_interval 10
retry_interval 1
max_check_attempts 5
check_period 24x7
contact_groups admins
notification_interval 30
notification_period 24x7
notification_options d,u,r
}

关于 notification_options:

  • d : the host DOWN state
  • u : the host UNREACHABLE state
  • r : host recovery (UP state)
  • f : the host starts and stops flapping
  • s : notify when scheduled downtime starts or ends
定义主机组

示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
define hostgroup{
hostgroup_name linux-servers
alias Linux servers
members server1,server2
}

define hostgroup{
hostgroup_name aix-servers
alias AIX servers
members aixbox1,aixbox2
}

define hostgroup{
hostgroup_name unix-servers
alias UNIX servers
hostgroup_members linux-servers,aix-servers
}

其中定义了两个分别包含两台主机的主机组(linux-serversaix-servers),同时还定义了包含这两个主机组的“大”主机组(unix-servers)。即主机组的定义支持嵌套。

定义服务

示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
define service{
host_name server2
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 admins
}

关于 notification_options:

  • w : the service WARNING state
  • u : the service UNKNOWN state
  • c : the service CRITICAL state
  • r : the service recovery (back to OK) state
  • f : the host starts and stops flapping
  • s : notify when the scheduled downtime starts or ends
定义时间段

示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
define timeperiod{
timeperiod_name workinghours
alias Working Hours, excluding lunch break
monday 09:00-13:00,14:00-17:00
tuesday 09:00-13:00,14:00-17:00
wednesday 09:00-13:00,14:00-17:00
thursday 09:00-13:00,14:00-17:00
friday 09:00-13:00,14:00-17:00
}

define timeperiod{
timeperiod_name weekends
alias Weekends all day long
saturday 00:00-24:00
sunday 00:00-24:00
}

定义联系人

示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
define contact{
contact_name jdoe
alias John Doe
email john.doe@gmail.com
contactgroups admins
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
}

参考资料

Learning Nagios - Third Edition