几个星期以来,我一直在努力摆脱 NRPE 和 Perl。
我决定从绝对第一原则开始,创建一个虚拟的 nagios 插件,它什么都不做,但总是返回 OK。我将其命名为 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)的访问。
我还没有找到一个很好的解决方案来为 NRPE 关闭 SELinux。