几个星期以来,我一直对 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?
罪魁祸首是 SELinux,它在 RHEL6 上极大地限制了 NRPE 进程。默认情况下,它甚至阻止对核心 Perl 模块的访问,例如严格和警告。
我还没有找到一个很好的解决方案来关闭 NRPE 的 SELinux。
归档时间: |
|
查看次数: |
1541 次 |
最近记录: |