Passando argumento em um script .py para o plugin nrpe

1

Máquina A = mestre nagios, Máquina B = máquina de borda.

No host.cfg da máquina A eu tenho:

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
}

No commands.cfg do Machine B em /etc/nrpe.d eu tenho:

command[check_tok]=/usr/lib64/nagios/plugins/check_test.sh

Na máquina's / usr / lib64 / nagios / plugins, eu tenho check_test.py e check_test.sh.

check.test.sh é semelhante ao seguinte:

#!/bin/sh
/usr/bin/sudo /usr/lib64/nagios/plugins/check_test.py
exit $?

e check_test.py se parecem com o seguinte:

#!/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)

No B /etc/sudoers.d/nrpe da máquina nrpe ALL = (ALL) NOPASSWD: /usr/lib64/nagios/plugins/check_test.py

Como você pode ver, o argumento que estou colando para check_test.py é '123' e deve resultar em um sys.exit (0). no entanto, no meu nagios mon dizia "NRPE: não é possível ler a saída"

    
por user3331457 21.12.2015 / 21:50

2 respostas

2

Por padrão, o nrpe não permite argumentos. Você pode ignorar isso configurando dont_blame_nrpe=1 na configuração nrpe. Também o seu nrpe deve ser construído com --enable-command-args . No entanto, observe que:

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

Dito isto, você realmente deve codificar seus argumentos para o comando nrpe no lado do cliente.

Além disso, você deve passar argumentos do seu script de shell para o interpretador python. Adicionar "$@" deve fazer o truque:

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

E sys.argv no seu script python é uma lista, então você deve escrever sys.argv[1] .

Eu sugiro que você primeiro teste seus scripts localmente antes de tentar se conectar do lado nagios.

    
por 22.12.2015 / 08:00
0

Você precisa usar -a para passar args para NRPE.

Além disso, faça a chamada do comando -c $ARG1$ para que você não precise escrever um objeto de comando separado para cada chamada NRPE diferente.

Por exemplo:

define command {
    command_name    check_nrpe_arg
    command_line    $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$ -a $ARG2$
}

e o serviço def:

define service {
    use bg-service
    hostgroup_name  test_oob1
    service_description Recall12
    check_command   check_nrpe_arg!check_tok!123
    servicegroups   nrpe
}

Você também precisa do comando no lado do daemon NRPE para fazer algo com o argumento (não é só magicamente entender):

command[check_tok]=/usr/lib64/nagios/plugins/check_test.sh $ARG1$

Você teria então um check_nrpe separado para chamadas que não recebem argumentos, sem o -a $ARG2$1 no final. (Este é um conceito similar aos comandos nos pacotes Debian / Ubuntu, exceto o contrário.)

    
por 22.12.2015 / 18:28