强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

第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 模板注册属性

属性说明
register0模板,不作为实际对象注册
register1实际对象,会参与监控(默认值)
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$
用户宏$USERresource.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 配置文件命名规范

文件类型命名格式示例
主机配置业务-环境-类型.cfgweb-prod-servers.cfg
服务配置检查类型.cfgdisk-checks.cfg
命令配置插件名.cfgcheck_http.cfg
模板配置对象类型.cfghost-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 的配置文件体系,关键要点:

  1. 配置文件层次清晰,主配置文件引入对象定义文件
  2. 对象语法统一,通过 define object_type {} 定义
  3. 模板继承是配置复用的核心机制
  4. 宏变量系统提供动态替换能力
  5. 配置组织建议按业务模块划分目录
  6. 配置验证是每次修改后的必要步骤

下一章第4章:主机管理 - 学习如何定义和管理被监控的主机。