我已经把NRPE和Perl的头撞了好几个星期了。
我决定从绝对的第一原则开始,创build一个虚拟的nagios插件,它什么都不做,但总是返回OK。 我把它叫做check_true.pl,把它安装在远程服务器上,configurationNRPE作为check_test。
整个剧本只是:
#!/usr/bin/perl print "OK - this dummy test always returns OK\n"; exit 0;
这对NRPE没有问题。
以此为出发点,我要慢慢build立我想要的脚本,看看它在什么地方断了。 我没有得到很远。 以下突破NRPE(但在本地和通过SSH正常工作):
#!/usr/bin/perl use strict; print "OK - this dummy test always returns OK\n"; exit 0;
它给出了可怕的错误:NRPE:无法读取输出。
我不能包括任何或我得到这个错误。 这使得我无法做我真正需要做的!
我认为这可能是一个与perl包含path的问题,但通过NRPE运行以下显示它不是(当在terminal上运行时提供相同的包含path):
#!/usr/bin/perl print "OK - Perl include path: ".join(q{, }, @INC)."\n"; exit 0;
有谁知道为什么NRPE与Perlperformance得如此糟糕? 任何人都可以推荐解决? 甚至是一个解决方法?
更新1:该命令在NRPE中定义如下:
command[check_test]=/usr/lib64/nagios/plugins/check_true.pl
更新2:我已经做了一些更多的debugging,并且通过在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.
快速search显示strict.pm位于/usr/share/perl5/strict.pm中,/ usr / share / perl5 IS位于列出的@INC!
Perl如何无法find正确的文件? 当在terminal中作为用户nagios运行时,这是完美的工作,那么NRPE在环境中干什么就搞砸了Perl?
罪魁祸首是在RHEL6上严格限制NRPE过程的SELinux。 默认情况下,它甚至可以阻止访问核心perl模块,比如strict和warnings。
我还没有find一个很好的解决办法来closuresSELinux只是NRPE。