自定义编写的 Nagios 插件总是返回不正确的值,但在命令行上工作

Posted

技术标签:

【中文标题】自定义编写的 Nagios 插件总是返回不正确的值,但在命令行上工作【英文标题】:Custom written Nagios plugin always returns incorrect value but works on command line 【发布时间】:2020-06-16 13:38:15 【问题描述】:

我写了一个插件来检查两个主机是否同时在线,如果是,返回一个关键的。当我在命令行本地运行此命令时,逻辑工作正常,并且 echo 语句都根据检查的主机的状态匹配(例如“CRITICAL - 两个测试台控制器都在线”或“OK - $VM1 是唯一的测试台控制器在线。”等)。问题是当我通过./check_nrpe -H <NRPEHost> -c "controller_check" 运行这些命令时(相同的值也显示在 Nagios 网页上)无论主机的状态如何,它总是返回相同的值:“CRITICAL - 当前两个测试平台控制器离线” 回显 $VM1 和 $VM2 的实际值表明初始 if 检查始终设置为 0。

脚本通过从ping -c 1 -W 1 $HOSTNAME 创建二进制值来工作,如果首先检查,然后使用这些值来创建实际的警报/退出值。下面是为主机在线状态创建二进制值的 if 语句:

if ping -c 1 -W 1 $VM1HOSTNAME; then
  VM1=1
else
  VM1=0
fi

if ping -c 1 -W 1 $VM2HOSTNAME; then
  VM2=1
else
  VM2=0
fi

创建 NRPE 的实际逻辑返回:

if [ $VM1 -ne $VM2 ]; then
  if [ $VM1 -gt $VM2 ]; then
    echo "OK - $VM1 is currently the only testbed controller online."
    exit 0
  else
    echo "OK - $VM2 is currently the only testbed controller online."
    exit 0
  fi
elif [ $VM1 -eq $VM2 ]; then
  if [ $VM1 -eq 0 ]; then
    echo "CRITICAL - Both testbed controllers currently offline"
    exit 2
  else
    echo "CRITICAL - Both testbed controllers currently online."
    exit 2
  fi
else
  echo "UNKNOWN - Unable to read output."
  exit 3
fi

我以前从未编写过自己的 NRPE 插件,所以我假设我在这里做错了一些简单的事情,但我在网上看到的 NRPE 插件编写教程似乎与我所写的相匹配。作为旁注,如果我使用check_ping 而不是ping -c 1 -W 1,则返回的值是正确的 Nagios 网页上显示的唯一值是第一个 check_ping 命令的输出。

例如(这是正确的):

./check_nrpe -H ikor -c "check_testbed_controller_status"
PING OK - Packet loss = 0%, RTA = 0.81 ms|rta=0.811000ms;10.000000;20.000000;0.000000 pl=0%;2;5;0
PING OK - Packet loss = 0%, RTA = 0.79 ms|rta=0.787000ms;10.000000;20.000000;0.000000 pl=0%;2;5;0
CRITICAL - Both testbed controllers currently online.

但是 Nagios 状态信息只显示PING OK - Packet loss = 0%, RTA = 0.79 ms 而不是我想要的 echo 语句。

所以我想我是否可以 A)修复使用 /usr/bin/ping 进行 if 检查导致 NRPE 始终将这些主机读取为脱机状态(if 检查始终返回 0)或 B)使用 check_ping 的问题但仅将第三个 stdout 行返回到具有实际状态信息的 Nagios。有人对我有任何想法或阅读建议吗?非常感谢。

【问题讨论】:

Using check_nrpe: 将命令输出通过管道传输到sed '/^PING/d' 在命令行中工作,但看起来将其添加到 Nagios 命令定义中不起作用,因为我仍然在状态信息中获得 ping 信息,但是现在收到一个关键的(以前没问题)。 command_line $USER1$/check_nrpe -2 -H $HOSTADDRESS$ -c "check_testbed_controller_status" | sed '/^PING/d' 【参考方案1】:

原来 SELinux 阻止了 /usr/bin/ping 被 NRPE 守护进程执行。我没有尝试编写 SELinux 策略来允许这样做,而是使用 Nagios 插件 check_ping 并将输出通过管道传输到 /dev/null。 NRPE 插件的最终逻辑如下所示:

if $NRPEPING -H $VM1HOSTNAME -w 10,2% -c 20,5% > /dev/null 2>&1; then
  VM1=1
else
  VM1=0
fi

if $NRPEPING -H $VM2HOSTNAME -w 10,2% -c 20,5% > /dev/null 2>&1; then
  VM2=1
else
  VM2=0
fi

这意味着 A) 我不必将 SELinux 设置为允许或允许 NRPE 守护程序执行 ping 并且 B) 我在 Nagios 状态信息列中的输出正确显示了 echo 语句,没有其他信息。

【讨论】:

以上是关于自定义编写的 Nagios 插件总是返回不正确的值,但在命令行上工作的主要内容,如果未能解决你的问题,请参考以下文章

nagios自定义监控API插件

自定义nagios插件实现主动被动模式以及nagios基于mail的简单告警

nagios-初探

CentOS 7 中自定义nagios 插件脚本

编写Google插件,实现自定义现有网站内容

nagios 添加自定义监控项目监控mysql数据库死锁