web-dev-qa-db-ja.com

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
}
_

/etc/nrpe.dのマシンBのcommands.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
user3331457

デフォルトでは、nrpeは引数を許可しません。 nrpe構成でdont_blame_nrpe=1を設定することにより、これをバイパスできます。また、nrpeは--enable-command-argsで構築する必要があります。ただし、次の点に注意してください。

*** ENABLING THIS OPTION IS A SECURITY RISK! ***

そうは言っても、クライアント側でnrpeコマンドへの引数をハードコーディングする必要があります。

また、シェルスクリプトからpythonインタプリタに引数を渡す必要があります。"$@"を追加すると、次のトリックが実行されます。

#!/bin/sh
/usr/bin/Sudo /usr/lib64/nagios/plugins/check_test.py "$@"
exit $?

また、pythonスクリプトのsys.argvはリストであるため、代わりにsys.argv[1]と記述する必要があります。

Nagios側から接続する前に、まずスクリプトをローカルでテストすることをお勧めします。

2
Joe

引数をNRPEに渡すには、-aを使用する必要があります。

また、-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を付けずに、個別の-a $ARG2$1を作成します。 (これは、Debian/Ubuntuパッケージのコマンドと同様の概念ですが、その逆です。)

0
Keith