Назад | Перейти на главную страницу

NRPE и Perl - НИЧЕГО не может включать или ломается

Я уже несколько недель ломаю голову над 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.