第3章:配置文件结构
第3章:配置文件结构
Nagios 的强大灵活性来自于其完善的配置文件体系。本章深入讲解配置文件的组织结构、对象定义语法、模板继承机制和宏变量系统,帮助你高效管理大规模监控环境。
一、配置文件层次结构
1.1 整体架构
/etc/nagios/
├── nagios.cfg # 主配置文件(入口)
├── cgi.cfg # CGI Web 界面配置
├── resource.cfg # 资源宏文件(敏感信息)
├── htpasswd.users # Web 认证文件
├── objects/ # 标准对象定义目录
│ ├── commands.cfg # 命令定义
│ ├── contacts.cfg # 联系人定义
│ ├── contactgroups.cfg # 联系人组定义
│ ├── timeperiods.cfg # 时间段定义
│ ├── templates.cfg # 模板定义
│ ├── localhost.cfg # 本机监控
│ ├── windows.cfg # Windows 主机示例
│ ├── switch.cfg # 网络设备示例
│ └── printer.cfg # 打印机示例
└── conf.d/ # 自定义配置目录(推荐)
├── hosts/ # 主机定义目录
│ ├── webservers.cfg
│ ├── dbservers.cfg
│ └── network.cfg
├── services/ # 服务定义目录
│ ├── linux-services.cfg
│ └── web-services.cfg
├── contacts/ # 联系人定义目录
└── hostgroups/ # 主机组定义目录
1.2 配置文件加载方式
Nagios 支持两种配置文件加载方式:
# 方式一:单个文件引入
cfg_file=/etc/nagios/objects/commands.cfg
cfg_file=/etc/nagios/objects/contacts.cfg
# 方式二:目录引入(推荐,加载目录下所有 .cfg 文件)
cfg_dir=/etc/nagios/objects/
cfg_dir=/etc/nagios/conf.d/
推荐做法:使用 cfg_dir 组织配置,按功能或业务模块划分目录。
二、nagios.cfg 主配置详解
2.1 日志配置
# 日志文件位置
log_file=/var/log/nagios/nagios.log
# 日志轮转方式
# n = None, h = Hourly, d = Daily, w = Weekly, m = Monthly
log_rotation_method=d
# 日志归档路径
log_archive_path=/var/log/nagios/archives/
# 是否记录初始状态
log_initial_states=1
# 是否记录当前状态
log_current_states=1
# 是否记录被动检查
log_passive_checks=1
# 是否记录外部命令
log_external_commands=1
# 是否记录主机下服务
log_service_retries=1
log_host_retries=1
# 日志级别(Nagios 4.x)
# 0 = LOG_NOTHING
# 1 = LOG_EVERYTHING
# ...(更多级别见文档)
log_level=LOG_ALL
2.2 状态数据配置
# 状态文件(运行时状态数据)
status_file=/var/log/nagios/status.dat
# 对象缓存文件
object_cache_file=/var/log/nagios/objects.cache
# 保留状态信息
retain_state_information=1
state_retention_file=/var/log/nagios/retention.dat
retention_update_interval=60
# 状态更新间隔
status_update_interval=10
2.3 检查调度配置
# 是否执行服务检查
execute_service_checks=1
# 是否接受被动服务检查
accept_passive_service_checks=1
# 是否执行主机检查
execute_host_checks=1
# 是否接受被动主机检查
accept_passive_host_checks=1
# 服务检查间歇时间(秒,防止检查风暴)
service_inter_check_delay_method=s
service_inter_check_delay=1.0
# 服务检查交错因子
service_interleave_factor=s
# 最大并行服务检查数
max_parallel_service_checks=0 # 0 表示无限制
# 主机检查间歇时间
host_inter_check_delay=5.0
# 最大并行主机检查数
max_parallel_host_checks=0
2.4 通知配置
# 是否启用通知
enable_notifications=1
# 是否执行事件处理器
enable_event_handlers=1
# 服务通知间隔(由模板控制,此处为默认值)
service_notification_timeout=60
# 主机通知间隔
host_notification_timeout=30
2.5 外部命令配置
# 是否检查外部命令
check_external_commands=1
# 命令文件路径(FIFO 管道)
command_file=/var/log/nagios/rw/nagios.cmd
# 命令检查间隔
# -1 = 尽可能频繁
# 0 = 不检查(不推荐)
# > 0 = 指定秒数
command_check_interval=-1
# 命令文件大小限制
external_command_buffer_slots=4096
2.6 事件代理配置
# 事件代理选项(用于性能数据输出等)
event_broker_options=-1
# 自定义代理模块
# broker_module=/path/to/module.o args
2.7 性能数据配置
# 服务性能数据处理命令
service_performance_data_command=process-service-perfdata
# 主机性能数据处理命令
host_performance_data_command=process-host-perfdata
# 服务性能数据文件
service_perfdata_file=/var/log/nagios/service-perfdata
service_perfdata_file_template=DATATYPE::SERVICEPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tSERVICEDESC::$SERVICEDESC$\tSERVICEPERFDATA::$SERVICEPERFDATA$\tSERVICECHECKCOMMAND::$SERVICECHECKCOMMAND$\tHOSTSTATE::$HOSTSTATE$\tHOSTSTATETYPE::$HOSTSTATETYPE$\tSERVICESTATE::$SERVICESTATE$\tSERVICESTATETYPE::$SERVICESTATETYPE$
service_perfdata_file_mode=a
service_perfdata_file_processing_interval=15
service_perfdata_file_processing_command=process-service-perfdata-file
三、对象定义语法
3.1 对象类型概览
Nagios 使用统一的对象定义语法:
define object_type {
object_attribute value
...
}
| 对象类型 | 用途 | 关键属性 |
|---|---|---|
host | 主机定义 | host_name, address, check_command |
hostgroup | 主机组 | hostgroup_name, members |
service | 服务定义 | host_name, service_description, check_command |
servicegroup | 服务组 | servicegroup_name, members |
command | 命令定义 | command_name, command_line |
contact | 联系人 | contact_name, email, host_notification_commands |
contactgroup | 联系人组 | contactgroup_name, members |
timeperiod | 时间段 | timeperiod_name, alias |
hostextinfo | 主机扩展信息 | host_name, icon_image |
serviceextinfo | 服务扩展信息 | host_name, service_description |
3.2 对象继承
Nagios 支持对象继承(通过 use 关键字):
# 父对象(模板)
define host {
name generic-host
notifications_enabled 1
event_handler_enabled 1
flap_detection_enabled 1
process_perf_data 1
retain_status_information 1
retain_nonstatus_information 1
notification_period 24x7
register 0 # 0 = 不注册(仅作为模板)
}
# 子对象(继承模板)
define host {
use generic-host
host_name web-server-01
alias Web Server 01
address 192.168.1.100
}
3.3 多重继承
Nagios 支持通过逗号分隔多个模板:
define host {
use linux-server,high-frequency-check
host_name critical-server-01
alias Critical Server 01
address 192.168.1.200
}
继承规则:
- 从左到右依次继承
- 后面的模板覆盖前面的同名属性
- 子对象的显式定义优先于继承
四、模板系统
4.1 模板定义
模板是 Nagios 对象复用的核心机制:
# /etc/nagios/objects/templates.cfg
########################################
# 通用主机模板
########################################
define host {
name generic-host
notifications_enabled 1
event_handler_enabled 1
flap_detection_enabled 1
process_perf_data 1
retain_status_information 1
retain_nonstatus_information 1
max_check_attempts 3
check_interval 5
retry_interval 1
notification_interval 60
notification_options d,u,r
notification_period 24x7
check_period 24x7
register 0
}
########################################
# Linux 服务器模板
########################################
define host {
name linux-server
use generic-host
check_command check_ping!100.0,20%!500.0,60%
max_check_attempts 5
check_interval 5
retry_interval 1
check_period 24x7
notification_interval 120
notification_options d,u,r
notification_period workhours
contact_groups admins
register 0
}
########################################
# Windows 服务器模板
########################################
define host {
name windows-server
use generic-host
check_command check_ping!100.0,20%!500.0,60%
max_check_attempts 10
check_interval 5
retry_interval 1
check_period 24x7
notification_interval 30
notification_options d,r
notification_period 24x7
contact_groups admins
register 0
}
########################################
# 网络设备模板
########################################
define host {
name generic-switch
use generic-host
check_command check_ping!100.0,20%!500.0,60%
max_check_attempts 3
check_interval 5
retry_interval 1
check_period 24x7
notification_interval 120
notification_options d,u,r
notification_period 24x7
contact_groups admins
register 0
}
########################################
# 通用服务模板
########################################
define service {
name generic-service
active_checks_enabled 1
passive_checks_enabled 1
parallelize_check 1
obsess_over_service 1
check_freshness 0
notifications_enabled 1
event_handler_enabled 1
flap_detection_enabled 1
process_perf_data 1
retain_status_information 1
retain_nonstatus_information 1
notification_interval 60
notification_options w,u,c,r
is_volatile 0
check_period 24x7
normal_check_interval 5
retry_check_interval 1
max_check_attempts 3
notification_period 24x7
contact_groups admins
register 0
}
########################################
# 高频检查服务模板
########################################
define service {
name high-frequency-service
use generic-service
normal_check_interval 1
retry_check_interval 1
max_check_attempts 5
register 0
}
########################################
# 联系人模板
########################################
define contact {
name generic-contact
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-service-by-email
host_notification_commands notify-host-by-email
register 0
}
4.2 模板注册属性
| 属性 | 值 | 说明 |
|---|---|---|
register | 0 | 模板,不作为实际对象注册 |
register | 1 | 实际对象,会参与监控(默认值) |
name | 字符串 | 模板名称,供 use 引用 |
4.3 模板继承优先级
优先级从高到低:
1. 对象自身的显式定义
2. 直接 use 指定的模板(从左到右)
3. 模板链的更深层继承
4. Nagios 默认值
示例:
# 模板 A
define host {
name template-a
max_check_attempts 3
check_interval 5
register 0
}
# 模板 B
define host {
name template-b
use template-a
max_check_attempts 5
register 0
}
# 实际主机
define host {
use template-b
host_name test-server
address 192.168.1.1
check_interval 10 # 显式定义,优先级最高
}
# 最终结果:
# max_check_attempts = 5(来自 template-b)
# check_interval = 10(来自显式定义)
五、宏变量系统
5.1 宏变量类型
Nagios 提供丰富的宏变量(Macro),可以在命令中动态替换:
| 宏类型 | 前缀 | 说明 | 示例 |
|---|---|---|---|
| 主机宏 | $HOST | 主机相关属性 | $HOSTNAME$, $HOSTADDRESS$ |
| 服务宏 | $SERVICE | 服务相关属性 | $SERVICEDESC$, $SERVICESTATE$ |
| 联系人宏 | $CONTACT | 联系人相关属性 | $CONTACTEMAIL$, $CONTACTNAME$ |
| 命令宏 | $ARG | 命令参数 | $ARG1$, $ARG2$ |
| 用户宏 | $USER | resource.cfg 定义 | $USER1$, $USER2$ |
| 全局宏 | $ | 全局时间/状态 | $TIMET$, $LONGDATETIME$ |
5.2 常用主机宏
| 宏 | 说明 | 示例值 |
|---|---|---|
$HOSTNAME$ | 主机短名称 | web-server-01 |
$HOSTALIAS$ | 主机别名 | Web Server 01 |
$HOSTADDRESS$ | 主机地址 | 192.168.1.100 |
$HOSTSTATE$ | 当前状态 | UP, DOWN, UNREACHABLE |
$HOSTSTATETYPE$ | 状态类型 | HARD, SOFT |
$HOSTATTEMPT$ | 当前尝试次数 | 3 |
$MAXHOSTATTEMPTS$ | 最大尝试次数 | 5 |
$HOSTLATENCY$ | 检查延迟 | 0.25 |
$HOSTDURATION$ | 当前状态持续时间 | 2d 3h 15m |
$HOSTDURATIONSEC$ | 持续时间(秒) | 184500 |
$HOSTOUTPUT$ | 检查输出 | PING OK - Packet Loss = 0% |
$HOSTPERFDATA$ | 性能数据 | rta=10.50ms;100;200;0 |
$HOSTCHECKCOMMAND$ | 检查命令 | check_ping!100,20%!500,60% |
$HOSTNOTIFICATIONNUMBER$ | 通知次数 | 3 |
5.3 常用服务宏
| 宏 | 说明 | 示例值 |
|---|---|---|
$SERVICEDESC$ | 服务描述 | HTTP, SSH |
$SERVICESTATE$ | 当前状态 | OK, WARNING, CRITICAL, UNKNOWN |
$SERVICESTATETYPE$ | 状态类型 | HARD, SOFT |
$SERVICEATTEMPT$ | 当前尝试次数 | 2 |
$MAXSERVICEATTEMPTS$ | 最大尝试次数 | 3 |
$SERVICEOUTPUT$ | 检查输出 | HTTP OK: 200 |
$SERVICEPERFDATA$ | 性能数据 | time=0.15s;1;5;0 |
$SERVICECHECKCOMMAND$ | 检查命令 | check_http |
$SERVICEEXECUTIONTIME$ | 执行时间 | 1.235 |
$SERVICELATENCY$ | 检查延迟 | 0.05 |
$SERVICEDURATION$ | 状态持续时间 | 4h 30m |
$SERVICENOTIFICATIONNUMBER$ | 通知次数 | 1 |
5.4 用户宏(resource.cfg)
用户宏在 resource.cfg 中定义,用于存放敏感信息和路径:
# /etc/nagios/resource.cfg
# 插件路径
$USER1$=/usr/local/nagios/libexec
# 自定义插件路径
$USER2$=/usr/local/nagios/custom-plugins
# SNMP 凭据
$USER3$=public
# 邮件服务器
$USER4$=smtp.example.com:25
# 数据库凭据
$USER5$=monitoring_user
$USER6$=secure_password
# Web 服务认证
$USER7$=nagios_api_key
安全提示:resource.cfg 应设置严格的文件权限(600),仅允许 Nagios 用户读取。
5.5 命令参数宏
命令参数通过 ! 分隔符传递:
# 命令定义
define command {
command_name check_ping
command_line $USER1$/check_ping -H $HOSTADDRESS$ -w $ARG1$ -c $ARG2$
}
# 使用命令时传递参数
define service {
use generic-service
host_name web-server-01
service_description PING
check_command check_ping!100.0,20%!500.0,60%
# ARG1=100.0,20% ARG2=500.0,60%
}
多参数示例:
# 带多个参数的命令
define command {
command_name check_http_advanced
command_line $USER1$/check_http -H $HOSTADDRESS$ -p $ARG1$ -u $ARG2$ -e $ARG3$ -s $ARG4$
}
# 使用
define service {
...
check_command check_http_advanced!80!/login!200!Welcome
# ARG1=80 ARG2=/login ARG3=200 ARG4=Welcome
}
5.6 全局时间宏
| 宏 | 说明 | 示例值 |
|---|---|---|
$TIMET$ | Unix 时间戳 | 1704067200 |
$SHORTDATETIME$ | 短日期时间 | 2024-01-01 12:00:00 |
$LONGDATETIME$ | 长日期时间 | Mon Jan 01 12:00:00 CST 2024 |
$DATE$ | 日期 | 2024-01-01 |
$TIME$ | 时间 | 12:00:00 |
$TIMET$ | 时间戳 | 1704067200 |
六、配置组织最佳实践
6.1 按业务模块组织
/etc/nagios/
├── nagios.cfg
├── cgi.cfg
├── resource.cfg
├── templates/
│ ├── hosts.cfg # 主机模板
│ ├── services.cfg # 服务模板
│ ├── contacts.cfg # 联系人模板
│ └── timeperiods.cfg # 时间段模板
├── commands/
│ ├── linux.cfg # Linux 相关命令
│ ├── windows.cfg # Windows 相关命令
│ ├── network.cfg # 网络设备命令
│ └── custom.cfg # 自定义命令
├── hosts/
│ ├── webservers.cfg # Web 服务器
│ ├── dbservers.cfg # 数据库服务器
│ ├── appservers.cfg # 应用服务器
│ └── network.cfg # 网络设备
├── services/
│ ├── linux-services.cfg # Linux 通用服务
│ ├── web-services.cfg # Web 服务
│ ├── db-services.cfg # 数据库服务
│ └── network-services.cfg # 网络设备服务
├── contacts/
│ ├── contacts.cfg # 联系人定义
│ └── contactgroups.cfg # 联系人组定义
├── hostgroups/
│ └── hostgroups.cfg # 主机组定义
└── timeperiods/
└── timeperiods.cfg # 时间段定义
6.2 配置片段示例
# nagios.cfg 中使用 cfg_dir 引入目录
cfg_dir=/etc/nagios/templates/
cfg_dir=/etc/nagios/commands/
cfg_dir=/etc/nagios/hosts/
cfg_dir=/etc/nagios/services/
cfg_dir=/etc/nagios/contacts/
cfg_dir=/etc/nagios/hostgroups/
cfg_dir=/etc/nagios/timeperiods/
6.3 配置文件命名规范
| 文件类型 | 命名格式 | 示例 |
|---|---|---|
| 主机配置 | 业务-环境-类型.cfg | web-prod-servers.cfg |
| 服务配置 | 检查类型.cfg | disk-checks.cfg |
| 命令配置 | 插件名.cfg | check_http.cfg |
| 模板配置 | 对象类型.cfg | host-templates.cfg |
七、配置验证工具
7.1 预检命令
# 验证所有配置
nagios -v /etc/nagios/nagios.cfg
# 输出示例:
# Checking objects...
# Checked 45 services.
# Checked 12 hosts.
# Checked 5 host groups.
# Checked 3 service groups.
# Checked 8 contacts.
# Checked 3 contact groups.
# Checked 24 commands.
# Checked 5 time periods.
#
# Total Warnings: 0
# Total Errors: 0
# Things look okay - No serious problems were detected during the pre-flight check
7.2 常见配置错误
| 错误类型 | 错误信息示例 | 原因 |
|---|---|---|
| 对象引用错误 | Error: Host 'xxx' has no services | 引用了不存在的对象 |
| 循环依赖 | Error: Circular parent/child relationship | 主机父子关系形成循环 |
| 重复定义 | Error: Duplicate definition | 同名对象定义多次 |
| 缺少必需属性 | Error: Missing required attribute | 缺少 host_name 等必需属性 |
| 命令不存在 | Error: Command 'xxx' not found | 引用了未定义的命令 |
| 时间段不存在 | Error: Timeperiod 'xxx' not found | 引用了未定义的时间段 |
7.3 配置调试技巧
# 1. 逐文件验证(注释掉部分 cfg_file 行)
# 2. 使用脚本批量验证
for cfg in /etc/nagios/hosts/*.cfg; do
echo "Checking: $cfg"
nagios -v /etc/nagios/nagios.cfg 2>&1 | grep -i error
done
# 3. 查看对象缓存
cat /var/log/nagios/objects.cache | grep "host_name"
# 4. 使用外部工具
# Adagios - Web 界面配置管理工具
# NagiosQL - 基于 Web 的配置管理
八、高级配置技巧
8.1 条件配置(Nagios 4.x 限制)
Nagios 不支持原生条件配置,但可以通过模板和变量实现:
# 使用不同的模板应对不同环境
define host {
use linux-server-prod # 生产环境模板
host_name web-server-01
address 192.168.1.100
}
define host {
use linux-server-dev # 开发环境模板
host_name dev-server-01
address 10.0.0.100
}
8.2 配置片段文件
使用 #include 引入配置片段:
# /etc/nagios/hosts/webservers.cfg
#include "webservers-common.cfg"
define host {
use linux-server
host_name web-01
address 192.168.1.10
}
define host {
use linux-server
host_name web-02
address 192.168.1.11
}
8.3 配置管理脚本
#!/bin/bash
# add_host.sh - 批量添加主机脚本
HOST_NAME=$1
HOST_IP=$2
HOST_GROUP=$3
cat >> /etc/nagios/hosts/${HOST_GROUP}.cfg << EOF
define host {
use linux-server
host_name ${HOST_NAME}
alias ${HOST_NAME}
address ${HOST_IP}
hostgroups ${HOST_GROUP}
}
EOF
# 验证配置
/usr/local/nagios/bin/nagios -v /etc/nagios/nagios.cfg
if [ $? -eq 0 ]; then
echo "配置验证通过,重启 Nagios..."
systemctl restart nagios
else
echo "配置验证失败,请检查!"
fi
九、注意事项
| 注意事项 | 说明 |
|---|---|
| 配置备份 | 修改前始终备份配置文件 |
| 增量修改 | 每次只修改少量配置,便于定位问题 |
| 验证优先 | 修改后先验证再重启 |
| 文件权限 | 敏感配置文件(resource.cfg)设置严格权限 |
| 注释规范 | 使用 # 注释说明配置用途 |
| 命名规范 | 对象名称使用有意义的命名 |
十、本章小结
本章深入讲解了 Nagios 的配置文件体系,关键要点:
- 配置文件层次清晰,主配置文件引入对象定义文件
- 对象语法统一,通过
define object_type {}定义 - 模板继承是配置复用的核心机制
- 宏变量系统提供动态替换能力
- 配置组织建议按业务模块划分目录
- 配置验证是每次修改后的必要步骤
下一章:第4章:主机管理 - 学习如何定义和管理被监控的主机。