在nrpe插件的.py脚本中传递参数

机器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软件包中的命令类似,除了相反的情况。)