NRPE 和 Perl - 不能包含任何东西,否则会损坏

Bar*_*t B 6 nagios perl nrpe

几个星期以来,我一直对 NRPE 和 Perl 不屑一顾。

我决定从绝对第一原则开始,创建一个虚拟的 nagios 插件,它什么都不做,但总是返回 OK。我将其命名为 check_true.pl,将其安装在远程服务器上并配置 NRPE 以将其用作 check_test。

整个脚本只是:

#!/usr/bin/perl

print "OK - this dummy test always returns OK\n";
exit 0;
Run Code Online (Sandbox Code Playgroud)

这适用于 NRPE,没有问题。

以此为起点,我将构建我想要慢慢查看它在什么时候中断的脚本。我根本没有走远。以下突破了 NRPE(但在本地和 SSH 上都可以正常工作):

#!/usr/bin/perl

use strict;

print "OK - this dummy test always returns OK\n";
exit 0;
Run Code Online (Sandbox Code Playgroud)

它给出了可怕的错误:NRPE:无法读取输出。

我不能包含任何东西,否则我会收到此错误。这使得我无法做我真正需要做的事情!

我认为这可能是 perl 包含路径的问题,但是在 NRPE 上运行以下内容表明它不是(提供与在终端上运行时相同的包含路径):

#!/usr/bin/perl

print "OK - Perl include path: ".join(q{, }, @INC)."\n";
exit 0;
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么 NRPE 在 Perl 上表现如此糟糕?任何人都可以推荐修复吗?或者甚至是一种解决方法?

更新 1:该命令在 NRPE 中定义如下:

command[check_test]=/usr/lib64/nagios/plugins/check_true.pl
Run Code Online (Sandbox Code Playgroud)

更新 2:我进行了更多调试,通过在 perl 脚本周围添加下面的包装器,我能够捕获 STDERR。

#!/bin/sh

out=`/usr/lib64/nagios/plugins/check_true.pl 2>&1`
echo $out
Run Code Online (Sandbox Code Playgroud)

结果让事情变得更加混乱:

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.
Run Code Online (Sandbox Code Playgroud)

快速搜索显示strict.pm 位于/usr/share/perl5/strict.pm,而/usr/share/perl5 位于列出的@INC!

Perl 怎么会找不到就在那里的文件呢?当在终端中作为用户 nagios 运行时,这可以完美地工作,那么 NRPE 对环境做了什么来弄乱 Perl?

Bar*_*t B 2

罪魁祸首是 SELinux,它在 RHEL6 上极大地限制了 NRPE 进程。默认情况下,它甚至阻止对核心 Perl 模块的访问,例如严格和警告。

我还没有找到一个很好的解决方案来关闭 NRPE 的 SELinux。