机器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的commands.cfg中/etc/nrpe.d我有:
command[check_tok]=/usr/lib64/nagios/plugins/check_test.sh
在机器的B的/ usr / lib64 / nagios /插件,我有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星期一它说:“NRPE:无法读取输出”
默认情况下nrpe不允许参数。 你可以通过在nrpeconfiguration中设置dont_blame_nrpe=1
来绕过这个。 你的nrpe也必须用--enable-command-args
来构build。 但请注意:
*** ENABLING THIS OPTION IS A SECURITY RISK! ***
这就是说,你真的应该硬编码您的参数在客户端的nrpe命令。
你也必须从shell脚本传递参数给python解释器。 添加"$@"
应该做的诀窍:
#!/bin/sh /usr/bin/sudo /usr/lib64/nagios/plugins/check_test.py "$@" exit $?
而你的python脚本中的sys.argv
是一个列表,所以你应该编写sys.argv[1]
。
我build议你先在本地testing脚本,然后再尝试从nagios端连接。
您需要使用-a
将parameter passing给NRPE。
此外,使-c
命令调用$ARG1$
所以不必为每个不同的NRPE调用编写单独的命令对象。
例如:
define command { command_name check_nrpe_arg command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -a $ARG2$ }
和服务def:
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
调用不带任何参数,没有-a $ARG2$1
结束。 (这与Debian / Ubuntu软件包中的命令类似,除了相反的情况。)