私はここ数週間、NRPEとPerlに頭を悩ませてきました。
私は絶対的な第一原理から始めて、何もしないが常にOKを返すダミーのnagiosプラグインを作成することにしました。私はそれをcheck_true.plと呼び、リモートサーバーにインストールし、check_testとして提供するようにNRPEを構成しました。
スクリプト全体は次のとおりです。
#!/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にあり、リストされた@INCの/ usr/share/Perl5 IS!
Perlはどうしてそこにあるファイルを見つけられないのでしょうか?これは、ターミナルでユーザーnagiosとして実行すると問題なく機能します。それでは、Perlを台無しにするためにNRPEは環境に対して何をしているのでしょうか。
原因はSELinuxで、RHEL6ではNRPEプロセスが大幅に制約されています。デフォルトでは、strictやwarningsなどのコアPerlモジュールへのアクセスもブロックします。
NRPEだけでSELinuxをオフにするための優れたソリューションはまだ見つかりません。