机器 A = nagios 主服务器,机器 B = 边缘机器。
在机器 A 的 host.cfg 中我有:
define command {
command_name check_tok
command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c check_tok 123
}
define service
use bg-service
hostgroup_name test_oob1
service_description Recall12
check_command check_tok
servicegroups nrpe
}
在机器 B 的 /etc/nrpe.d 中的 command.cfg 中我有:
command[check_tok]=/usr/lib64/nagios/plugins/check_test.sh
在机器B的/usr/lib64/nagios/plugins中,我有check_test.py和check_test.sh。
check.test.sh 如下所示:
#!/bin/sh
/usr/bin/sudo /usr/lib64/nagios/plugins/check_test.py
exit $?
check_test.py 如下所示:
#!/usr/bin/env python
import sys
if __name__ == "__main__":
if sys.argv == '123'
print("this ok")
sys.exit(0)
else:
print('this is not 123')
sys.exit(2)
在机器B中 /etc/sudoers.d/nrpe
nrpe ALL = (ALL) NOPASSWD: /usr/lib64/nagios/plugins/check_test.py
如您所见,我粘贴到 check_test.py 的参数是“123”,它应该导致 sys.exit(0)。但是,在我的 nagios mon 中,它显示“NRPE: 无法读取输出”
答案1
默认情况下,nrpe 不允许参数。您可以通过dont_blame_nrpe=1
在 nrpe 配置中进行设置来绕过此问题。此外,您的 nrpe 必须使用 构建--enable-command-args
。但请注意:
*** ENABLING THIS OPTION IS A SECURITY RISK! ***
话虽这么说,你确实应该在客户端将你的参数硬编码到 nrpe 命令中。
此外,您还必须将参数从 shell 脚本传递到 python 解释器。添加"$@"
应该可以解决问题:
#!/bin/sh
/usr/bin/sudo /usr/lib64/nagios/plugins/check_test.py "$@"
exit $?
并且sys.argv
您的 python 脚本中有一个列表,因此您应该sys.argv[1]
这样写。
我建议您先在本地测试您的脚本,然后再尝试从 nagios 端连接。
答案2
您需要使用-a
将参数传递给 NRPE。
另外,进行-c
命令调用$ARG1$
,这样您就不必为每个不同的 NRPE 调用编写单独的命令对象。
例如:
define command {
command_name check_nrpe_arg
command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -a $ARG2$
}
以及服务定义:
define service {
use bg-service
hostgroup_name test_oob1
service_description Recall12
check_command check_nrpe_arg!check_tok!123
servicegroups nrpe
}
您还需要 NRPE 守护进程端的命令来对参数执行某些操作(它不会神奇地获取它):
command[check_tok]=/usr/lib64/nagios/plugins/check_test.sh $ARG1$
然后,您将有一个单独的check_nrpe
for 调用,它不接受任何参数,-a $ARG2$1
末尾没有。(这与 Debian/Ubuntu 软件包中的命令的概念类似,只是反过来。)