Я уже несколько недель ломаю голову над NRPE и Perl.
Я решил начать с абсолютных принципов и создать фиктивный плагин nagios, который ничего не делает, но всегда возвращает ОК. Я назвал его check_true.pl, установил на удаленном сервере и настроил NRPE, чтобы он работал как check_test.
Весь сценарий просто:
#!/usr/bin/perl
print "OK - this dummy test always returns OK\n";
exit 0;
Это работает через NRPE без проблем.
Взяв это за отправную точку, я собирался создать сценарий, который я хочу медленно, чтобы увидеть, в какой момент он сломается. Я не ушел далеко. Следующие перерывы в NRPE (но отлично работают как локально, так и по SSH):
#!/usr/bin/perl
use strict;
print "OK - this dummy test always returns OK\n";
exit 0;
Выдает ужасную ошибку: NRPE: Невозможно прочитать вывод.
Я не могу НИЧЕГО включить или получаю эту ошибку. Это делает невозможным то, что мне действительно нужно делать!
Я думал, что это может быть проблема с путем включения perl, но выполнение следующего по NRPE показывает, что это не так (дает тот же путь включения, что и при запуске на терминале):
#!/usr/bin/perl
print "OK - Perl include path: ".join(q{, }, @INC)."\n";
exit 0;
Кто-нибудь знает, почему NRPE так плохо себя ведет с Perl? Кто-нибудь может порекомендовать исправление? Или даже обходной путь?
Обновление 1: команда определена в NRPE следующим образом:
command[check_test]=/usr/lib64/nagios/plugins/check_true.pl
Обновление 2: я проделал еще немного отладки и, добавив обёртку вокруг perl-скрипта, я смог захватить STDERR.
#!/bin/sh
out=`/usr/lib64/nagios/plugins/check_true.pl 2>&1`
echo $out
Результат еще больше сбивает с толку:
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.
Быстрый поиск показывает, что strict.pm находится по адресу /usr/share/perl5/strict.pm, а / usr / share / perl5 находится в списке @INC!
Как Perl может не найти файл, который находится прямо здесь? Это работает безупречно при запуске от имени пользователя nagios в терминале, так что же NRPE делает со средой, чтобы испортить Perl?
Виновником был SELinux, который на RHEL6 сильно ограничивает процесс NRPE. По умолчанию он даже блокирует доступ к основным модулям Perl, таким как strict и warnings.
Я еще не нашел хорошего решения для отключения SELinux только для NRPE.