Nagios 是一款开源的系统监控工具。它主要负责对网络环境中的硬件设备及软件服务进行持续的检查,确保这些设备或服务处于正常运行的状态。一旦发现任何错误,Nagios 会在尽可能短的时间内向工作人员发出警报,同时也会在一定程度上尝试自动修复故障(比如重启设备或服务)。
一、简介
Nagios 监控的对象主要可分为两类:
- Hosts 表示网络中的物理(或虚拟化的)设备,如服务器、工作站、路由器和打印机等
- Services 表示网络中某些设施提供的特定功能的集合,如 CPU、内存、磁盘空间等。其他如
sshd
服务等也可被定义为 Service 接受 Nagios 的监控
此外,多台主机还可以被划分到不同的主机组中以方便管理和维护。
plugins
Nagios 提供的所有的监控操作全部都由插件来完成。插件是一些用来传递监控信息的附加组件,Nagios 通过它们执行具体的监控和检查任务,同时对收集到的结果进行统计与整理。
Nagios 默认提供了一些基础的插件,几乎可以满足所有常见的监控任务。此外,如果有特殊的监控需求,也可以自行编写 Nagios 插件。
一般标准插件的默认安装路径为 /usr/lib/nagios/plugins
,插件名称绝大多数以 check_
开头:
$ 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 的模块,命令如下:
$ sudo a2enmod auth_digest
$ sudo a2enmod authz_groupfile
重启 Apache2 后访问 http://127.0.0.1/nagios4 链接,即可进入 Web 监控平台,截图如下:
三、配置文件介绍
Nagios 的配置文件一般位于 /etc/nagios
或者 /usr/local/etc/nagios
目录下,最主要的配置文件为 nagios.cfg
。
nagios.cfg
像是一个统领性的大纲文件,它除了定义一些全局范围内的基本配置外,还用于指定其他(更细节的)配置文件的位置或者组织方式,类似于书籍中的目录。
如文件中的 cfg_dir
和 cfg_file
两个配置项:
...
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 在配置监控对象时所遵循的基本语法:
# 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
的模板:
$ 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 配置文件的组织架构设计成便于管理的形式。比如:
$ tree /etc/nagios4/conf.d
/etc/nagios4/conf.d
├── commands
├── contactgroups
├── contacts
├── hostgroups
├── hosts
│ └── server2.cfg
├── servicegroups
├── services
└── timeperiods
四、定义监控对象
宏指令
能够通过宏指令来简化配置,是 Nagios 的关键特性之一。宏的运用在很大程度上提高了定义对象和命令的灵活性。如下面的配置示例:
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 地址。
定义主机
简单的示例代码如下:
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
定义主机组
示例代码如下:
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-servers
、aix-servers
),同时还定义了包含这两个主机组的“大”主机组(unix-servers
)。即主机组的定义支持嵌套。
定义服务
示例代码如下:
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
定义时间段
示例代码如下:
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
}
定义联系人
示例代码如下:
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
}