我已经研究 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 混乱呢?
答案1
罪魁祸首是 SELinux,它在 RHEL6 上极大地限制了 NRPE 进程。默认情况下,它甚至阻止对核心 perl 模块(如 strict 和 warnings)的访问。
我还没有找到一个很好的解决方案来关闭 NRPE 的 SELinux。