Nagios

NRPE 和 Perl - 不能包含任何內容,否則會中斷

  • July 3, 2012

幾週以來,我一直在努力擺脫 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 模組,例如嚴格和警告。

我還沒有找到一個很好的解決方案來為 NRPE 關閉 SELinux。

引用自:https://serverfault.com/questions/402312