引数としてパスを受け取り、以下をチェックするNagiosチェックスクリプトを作成しました。
- パスがマウントされている場合
- パス内のファイルをタッチしてアクセスできる場合。
- マウントポイントディレクトリが空の場合
[root@hadoop-nn1 mass1]# su - nagios
[nagios@hadoop-nn1 ~]$ /usr/lib64/nagios/plugins/check_nfsmount.sh /mass2/hpfiles/
Warning: /mass2/hpfiles/ is mounted but directory is empty!
[nagios@hadoop-nn1 ~]$ /usr/lib64/nagios/plugins/check_nfsmount.sh /mass1/hpfiles/
Warning: /mass1/hpfiles/ is MOUNTED properly but not writeable for user nagios
[nagios@hadoop-nn1 ~]$ /usr/lib64/nagios/plugins/check_nfsmount.sh /mass1/hp_offline/
Ok: /mass1/hp_offline/ is MOUNTED properly and writeable for user nagios
[nagios@hadoop-nn1 ~]$
/etc/nagios/nrpe.cfg
のコマンドは次のようになります。
command[check_nfsmounts]=/usr/lib64/nagios/plugins/check_nfsmounts.sh $ARG1$
ご覧のとおり、Nagiosユーザーを使用して監視対象マシンからコマンドを実行すると、期待どおりの結果が得られますが、Nagiosサーバーからnrpe
を使用してコマンドを実行すると、「NRPE:入力を読み取れません」と返されます。 。
私が試した他のもの:
- スクリプト自体にパスを指定して、引数をNRPEに渡す必要がないようにしますが、同じ結果が得られます。
nrpe.cfg
内にパスを提供します。これも、引数の受け渡しを回避するためですが、役に立ちません。
nrpe.cfg
を編集してデバッグを有効にし、tail -f /var/log/messages |grep nrpe
を実行してNagiosサーバーからリモートコマンドを送信しているときに、ログに次の2行が表示されます。
Dec 15 04:09:44 hadoop-nn1 nrpe[9354]: Error: Request contained illegal metachars!
Dec 15 04:09:44 hadoop-nn1 nrpe[9354]: Client request was invalid, bailing out...
しかし、私はそれらがどの違法な文字であったかを知る方法がありません...
Do n't_blame_nrpeは1に設定されています。スクリプトは次のようになります。
#!/bin/bash
# This script checks if the provided mount point is mounted and writeable.
# Script by Itai Ganot
if [ -z "$1" ]; then
echo "Usage: $(basename $0) PATH_TO_CHECK"
echo "Available PATH's: /mass1/hp_offline -- /mass1/hpfiles -- /mass2/hpfiles"
exit 3
fi
DF="/bin/df -t nfs"
GREP="/bin/grep -q"
AWK="/bin/awk"
TOUCH="/bin/touch"
LS="/bin/ls"
WC="/usr/bin/wc"
TESTFILE="test.dat"
USER=$(whoami)
NFS_MOUNT="$1"
$DF | $GREP "$NFS_MOUNT" | $AWK '{print $5}'
if [ $? = 0 ]; then
MOUNTED="yes"
else
MOUNTED="no"
fi
if [[ "$MOUNTED" = "yes" ]] && [[ $($LS -A "$NFS_MOUNT" | "$WC" -l) -gt "1" ]]; then
"$TOUCH" "$NFS_MOUNT""$TESTFILE" 2>/dev/null
if [ $? = 0 ]; then
TOUCHED="yes"
else
TOUCHED="no"
fi
Elif [[ "$MOUNTED" = "yes" ]] && [[ $($LS -A "$NFS_MOUNT" | "$WC" -l) -eq "0" ]]; then
TXT="$NFS_MOUNT is mounted but directory is empty!"
RETVAL="1"
STATUS="Warning"
Elif [ "$MOUNTED" = "no" ]; then
TXT="$NFS_MOUNT not MOUNTED"
RETVAL="2"
STATUS="Critical"
fi
if [[ "$TOUCHED" = "yes" ]]; then
TXT="$NFS_MOUNT is MOUNTED properly and writeable for user $USER"
RETVAL="0"
STATUS="Ok"
Elif [[ "$TOUCHED" = "no" ]] || [[ "$MOUNTED" = "no" ]]; then
TXT="$NFS_MOUNT is MOUNTED properly but not writeable for user $USER"
RETVAL="1"
STATUS="Warning"
fi
echo "$STATUS: $TXT"
exit $RETVAL
「NRPE:入力を読み取れません」というエラーの理由は何でしょうか。
編集#1:
[root@mon1 ~]# /usr/lib64/nagios/plugins/check_nrpe -H 10.39.21.211 -c check_nfsmounts -a /mass1/hp_offline
NRPE: Unable to read output
[root@mon1 ~]# /usr/lib64/nagios/plugins/check_nrpe -H 10.39.21.211 -c check_nfsmounts -a '/mass1/hp_offline'
NRPE: Unable to read output
[root@mon1 ~]# /usr/lib64/nagios/plugins/check_nrpe -H 10.39.21.211 -c check_nfsmounts /mass1/hp_offline
NRPE: Unable to read output
[root@mon1 ~]#
編集#2:SSLはNagiosサーバーとすべてのクライアントの両方で無効になっています...
[root@mon1 ~]# /usr/lib64/nagios/plugins/check_nrpe -H 10.39.21.211 -n -c check_nfsmounts '/mass1/hp_offline'
CHECK_NRPE: Error receiving data from daemon.
[root@mon1 ~]# /usr/lib64/nagios/plugins/check_nrpe -H 10.39.21.211 -n -c check_nfsmounts -a '/mass1/hp_offline'
CHECK_NRPE: Error receiving data from daemon.
前もって感謝します
Nrpeで実行しているコマンドは/usr/lib64/nagios/plugins/check_nfsmounts.sh
ですが、コマンドラインからテストしているのは/usr/lib64/nagios/plugins/check_nfsmount.sh
。この不一致が問題の原因であることを確認しました。汗を流さないでください。これは私たちの誰にでも起こる可能性があります。 2番目の目は、これらの非常に迷惑な小さなグレムリンを捕まえるのに常に役立ちます!