Nagios主机不可达时禁用服务检查的配置问询
解决Nagios主机宕机时服务监控误报的方案
作为常年和Nagios打交道的老运维,我太懂你说的这种烦人的情况了——主机一挂,所有服务监控齐刷刷变红,控制台全是告警,根本分不清到底是主机问题还是服务本身出故障。下面给你几个经过生产环境验证的可行方案,按推荐程度排序:
方案1:主机依赖关系(最推荐,配置简单)
这是Nagios官方提供的原生解决方案,核心思路是让所有属于该主机的服务依赖主机的存活状态。当主机被check-host-alive检测为DOWN/UNREACHABLE时,Nagios会自动跳过该主机上所有服务的检查,自然不会产生一堆无用告警。
配置步骤:
在你的Nagios配置文件(比如hostdependencies.cfg)中添加如下定义:
host_name 你的目标主机名 # 被依赖的主机(就是你监控的那台服务器) dependent_host_name 你的目标主机名 # 依赖方:这里因为服务属于该主机,所以依赖自身的存活状态 execution_failure_criteria n # n代表主机处于非UP状态(DOWN/UNREACHABLE)时,跳过依赖项的检查 notification_failure_criteria n # 同时禁用服务的通知,避免收到服务告警 }
配置完成后,重启Nagios生效。以后主机宕机时,该主机下的所有服务都会显示为“依赖状态未满足”,不会执行检查也不会发告警。
方案2:服务依赖关系(精细控制)
如果你不想让所有服务都依赖主机存活,只想针对特定几个服务做配置,可以用服务依赖。比如某些服务即使主机宕机也需要监控(不过这种场景很少见),或者你想单独控制某几个服务的依赖逻辑。
配置步骤:
在servicedependencies.cfg中为每个需要依赖的服务添加定义:
host_name 你的目标主机名 service_description check-host-alive # 依赖的服务:主机存活检测 dependent_host_name 你的目标主机名 dependent_service_description CPU使用率 # 需要被控制的服务名称 execution_failure_criteria n notification_failure_criteria n }
重复这个配置块,把所有需要依赖的服务都加进去就行。这个方案适合精细化管理,但配置量会大一些。
方案3:自定义事件处理器(灵活度最高)
如果上面两种原生方案满足不了你的需求(比如你需要在主机宕机时执行额外操作,比如暂停相关的自动化任务),可以用事件处理器。核心逻辑是:当主机被检测为DOWN时,执行一个自定义脚本,通过Nagios的命令管道禁用该主机下的所有服务监控;当主机恢复时,再执行脚本启用服务监控。
配置步骤:
- 编写事件处理脚本(比如
/usr/local/nagios/libexec/host_down_handler.sh):
#!/bin/bash HOSTNAME=$1 CMD_PATH="/var/lib/nagios/rw/nagios.cmd" # 获取当前主机的所有服务名称 SERVICES=$(grep -A5 "host_name $HOSTNAME" /etc/nagios/conf.d/services.cfg | grep "service_description" | awk '{print $2}') # 根据主机状态执行对应操作 if [ "$NAGIOS_HOSTSTATE" = "DOWN" ]; then # 禁用所有服务检查 for SERVICE in $SERVICES; do echo "[`date +%s`] DISABLE_SVC_CHECK;$HOSTNAME;$SERVICE" > $CMD_PATH done elif [ "$NAGIOS_HOSTSTATE" = "UP" ]; then # 恢复所有服务检查 for SERVICE in $SERVICES; do echo "[`date +%s`] ENABLE_SVC_CHECK;$HOSTNAME;$SERVICE" > $CMD_PATH done fi
- 给脚本添加执行权限,并确保Nagios用户能读写
nagios.cmd:
chmod +x /usr/local/nagios/libexec/host_down_handler.sh chown nagios:nagios /usr/local/nagios/libexec/host_down_handler.sh
- 在主机定义中添加事件处理器:
host_name 你的目标主机名 ... event_handler host_down_handler.sh!你的目标主机名 event_handler_enabled 1 }
- 重启Nagios生效。
注意事项:
- 脚本中的服务配置路径要根据你的实际环境修改
- 确保
nagios.cmd的权限正确(通常是srw-rw----,属主nagios:nagios)
总结
- 优先用主机依赖,配置简单,维护成本最低,完全满足你的需求
- 有精细化控制需求时用服务依赖
- 需要额外操作时用事件处理器
内容的提问来源于stack exchange,提问作者Amperclock
相关产品推荐
相关产品推荐

