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

在 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 的 /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_nrpefor 调用,它不接受任何参数,-a $ARG2$1末尾没有。(这与 Debian/Ubuntu 软件包中的命令的概念类似,只是反过来。)

相关内容