O culpado foi o SELinux, que no RHEL6 restringe muito o processo do NRPE. Por padrão, até bloqueia o acesso aos módulos principais do perl, como strict e warnings.
Ainda não encontrei uma boa solução para desativar o SELinux apenas por NRPE.
Eu tenho batido minha cabeça fora de NRPE e Perl por semanas agora.
Eu decidi começar pelos princípios absolutos, e criar um plugin nagios fictício que não faz nada, mas sempre retorna OK. Eu chamei de check_true.pl, instalei-o no servidor remoto e configurei o NRPE para servi-lo como check_test.
O script inteiro é apenas:
#!/usr/bin/perl
print "OK - this dummy test always returns OK\n";
exit 0;
Isso funciona sobre o NRPE sem problemas.
Com isso como ponto de partida, eu iria construir o roteiro que quero lentamente ver em que ponto ele se rompe. Eu não cheguei longe. A seguinte quebra sobre NRPE (mas funciona bem com localmente e por SSH):
#!/usr/bin/perl
use strict;
print "OK - this dummy test always returns OK\n";
exit 0;
Dá o erro temido: NRPE: não é possível ler a saída.
Eu não posso incluir QUALQUER COISA ou recebo este erro. Isso torna impossível fazer o que realmente preciso fazer!
Eu pensei que poderia ser um problema com o caminho de inclusão do perl, mas executar o seguinte sobre o NRPE mostra que não é (fornece caminho de inclusão idêntico ao executado no terminal):
#!/usr/bin/perl
print "OK - Perl include path: ".join(q{, }, @INC)."\n";
exit 0;
Alguém sabe por que o NRPE está se comportando tão mal com o Perl? Alguém pode recomendar uma correção? Ou até mesmo uma solução alternativa?
Atualização 1: O comando é definido no NRPE da seguinte forma:
command[check_test]=/usr/lib64/nagios/plugins/check_true.pl
Atualização 2: Eu fiz um pouco mais de depuração, e adicionando o wrapper abaixo em torno do script perl eu fui capaz de capturar STDERR.
#!/bin/sh
out='/usr/lib64/nagios/plugins/check_true.pl 2>&1'
echo $out
O resultado torna as coisas ainda mais confusas:
Can't locate strict.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/lib64/nagios/plugins/check_true.pl line 3. BEGIN failed--compilation aborted at /usr/lib64/nagios/plugins/check_true.pl line 3.
Uma pesquisa rápida mostra que strict.pm está localizado em /usr/share/perl5/strict.pm e / usr / share / perl5 IS no @INC listado!
Como o Perl não consegue encontrar um arquivo que está lá? Isso funciona perfeitamente quando executado como nagios do usuário em um terminal, então o que o NRPE está fazendo no ambiente para bagunçar o Perl?
O culpado foi o SELinux, que no RHEL6 restringe muito o processo do NRPE. Por padrão, até bloqueia o acesso aos módulos principais do perl, como strict e warnings.
Ainda não encontrei uma boa solução para desativar o SELinux apenas por NRPE.