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