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

Bash 自定义编写的Nagios插件总是返回不正确的值,但可以在命令行上运行,bash,shell,scripting,nagios,nrpe,Bash,Shell,Scripting,Nagios,Nrpe,我写了一个插件,可以检查两台主机是否同时在线,如果是,则返回一个临界值。当我在命令行本地运行该命令时,逻辑工作正常,echo语句都匹配,这取决于所检查主机的状态(例如,“临界-两个测试床控制器联机”或“确定-$VM1是唯一的测试床控制器联机”等)。问题是,当我通过/check\u nrpe-H-c“controller\u check”运行这些命令时(相同的值也显示在Nagios网页上),无论主机的状态如何,它总是返回相同的值:“严重-两个测试床控制器当前都处于脱机状态”回显$VM1和$VM2的

我写了一个插件,可以检查两台主机是否同时在线,如果是,则返回一个临界值。当我在命令行本地运行该命令时,逻辑工作正常,echo语句都匹配,这取决于所检查主机的状态(例如,“临界-两个测试床控制器联机”或“确定-$VM1是唯一的测试床控制器联机”等)。问题是,当我通过
/check\u nrpe-H-c“controller\u check”
运行这些命令时(相同的值也显示在Nagios网页上),无论主机的状态如何,它总是返回相同的值:“严重-两个测试床控制器当前都处于脱机状态”回显$VM1和$VM2的实际值表明初始if检查始终设置为0

该脚本的工作原理是,如果先进行检查,则从ping-c1-w1$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-c1-w1
返回的值是正确的,但是Nagios网页上显示的唯一值是第一个check_-ping命令的输出

例如(这是正确的):

但是Nagios状态信息只显示
PING OK-数据包丢失=0%,RTA=0.79 ms
,而不是我想要的echo语句


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

结果是SELinux阻止了NRPE守护进程执行/usr/bin/ping。我没有尝试编写SELinux策略来实现这一点,而是使用Nagios插件检查并将输出管道连接到/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设置为permissive或允许NRPE守护进程执行ping,B)我在Nagios状态信息列中的输出正确地显示了echo语句,没有其他信息。

使用check\u NRPE:Piping将命令输出传输到
sed'/^ping/d'
在命令行上工作,但看起来像将其添加到Nagios命令定义中不起作用,因为我仍然在状态信息中获得ping信息,但现在收到一个临界值(以前是OK)<代码>命令行$USER1$/check\u nrpe-2-H$HOSTADDRESS$-c“检查测试台\u控制器\u状态”| sed'/^PING/d'
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