昨日、私のサーバーをDebian 9からDebian 10にアップグレードしました。サーバーはnagiosによって監視されます。アップグレード後にステータスが不明であることを通知しました。
「ボリュームグループ array03-0 が無効であるか、 '-v Volumegroup' として指定されていません。 false
このサービスはVG baie03-0の使用法であり、そのコマンドはcheck_nrpe!check_vgs_array03-0です。このサービスの目的は、アレイのストレージがほぼいっぱいになったときに警告を生成することです。
check_nrpe コマンドは標準です。
# 'check_NRPE' command definition
define command{
command_name check_nrpe
command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
}
私が正確に覚えているなら、これは監視対象サーバーの/etc/nagios/nrpe.cfgにcheck_vgs_array03-0コマンドがあることを意味します。見てみましょう。それは次のとおりです。
コマンド [check_vgs_array03-0]=/usr/lib/nagios/plugins/check_vg_size -w 20 -c 10 -v array03-0
管理対象サーバーにこのコマンドを入力すると、エラーはなく動作します。
VG array03-0 確認 使用可能なスペースは 805 GB です。 array03-0=805GB;20;10;0;19155
たとえば、存在しないボリュームグループ名を入力すると、エラーメッセージが表示されます。
check_vg_sizeプラグインスクリプトは次のとおりです。
#!/bin/bash
#check_vg_size
#set -x
# Plugin for Nagios
# Written by M. Koettenstorfer ([email protected])
# Some additions by J. Schoepfer ([email protected])
# Major changes into functions and input/output values J. Veverka ([email protected])
# Last Modified: 2012-11-06
#
# Description:
#
# This plugin will check howmany space in volume groups is free
# Nagios return codes
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4
SERVICEOUTPUT=""
SERVICEPERFDATA=""
PROGNAME=$(basename $0)
vgs_bin=`/usr/bin/whereis -b -B /sbin /bin /usr/bin /usr/sbin -f vgs | awk '{ print $2 }'`
_vgs="$vgs_bin --units=g"
bc_bin=`/usr/bin/whereis -b -B /sbin /bin /usr/bin /usr/sbin -f bc | awk '{ print $2 }'`
exitstatus=$STATE_OK #default
declare -a volumeGroups;
novg=0; #number of volume groups
allVG=false; #Will we use all volume groups we can find on system?
inPercent=false; #Use percentage for comparison?
unitsGB="GB"
unitsPercent="%"
units=$unitsGB
########################################################################
### DEFINE FUNCTIONS
########################################################################
print_usage() {
echo "Usage: $PROGNAME -w <min size warning level in gb> -c <min size critical level in gb> -v <volumegroupname> [-a] [-p]"
echo "If '-a' and '-v' are specified: all volumegroups defined by -v will be ommited and the remaining groups which are found on system are checked"
echo "If '-p' is specified: the warning and critical levels are represented as the percent space left on device"
echo ""
}
print_help() {
print_usage
echo ""
echo "This plugin will check how much space is free in volume groups"
echo "usage: "
exit $STATE_UNKNOWN
}
checkArgValidity () {
# Check arguments for validity
if [[ -z $critlevel || -z $warnlevel ]] # Did we get warn and crit values?
then
echo "You must specify a warning and critical level"
print_usage
exitstatus=$STATE_UNKNOWN
exit $exitstatus
elif [ $warnlevel -le $critlevel ] # Do the warn/crit values make sense?
then
if [ $inPercent != 'true' ]
then
echo "CRITICAL value of $critlevel GB is less than WARNING level of $warnlevel GB"
print_usage
exitstatus=$STATE_UNKNOWN
exit $exitstatus
else
echo "CRITICAL value of $critlevel % is higher than WARNING level of $warnlevel %"
print_usage
exitstatus=$STATE_UNKNOWN
exit $exitstatus
fi
fi
}
#Does volume group actually exist?
volumeGroupExists () {
local volGroup="$@"
VGValid=$($_vgs 2>/dev/null | grep "$volGroup" | wc -l )
if [[ -z "$volGroup" || $VGValid = 0 ]]
then
echo "Volumegroup $volGroup wasn't valid or wasn't specified"
echo "with \"-v Volumegroup\", bye."
echo false
return 1
else
#The volume group exists
echo true
return 0
fi
}
getNumberOfVGOnSystem () {
local novg=$($_vgs 2>/dev/null | wc -l)
let novg--
echo $novg
}
getAllVGOnSystem () {
novg=$(getNumberOfVGOnSystem)
local found=false;
for (( i=0; i < novg; i++)); do
volumeGroups[$i]=$($_vgs | tail -n $(($i+1)) | head -n 1 | awk '{print $1}')
found=true;
done
if ( ! $found ); then
echo "$found"
echo "No Volumegroup wasn't valid or wasn't found"
exit $STATE_UNKNOWN
fi
}
getColumnNoByName () {
columnName=$1
result=$($_vgs 2>/dev/null | head -n1 | awk -v name=$columnName '
BEGIN{}
{ for(i=1;i<=NF;i++){
if ($i ~ name)
{print i } }
}')
echo $result
}
convertToPercent () {
#$1 = xx%
#$2 = 100%
# Make values numbers only
local input="$(echo $1 | sed 's/g//i')"
local max="$(echo $2 | sed 's/g//i')"
local onePercent='';
local freePercent='';
if [ -x "$bc_bin" ] ; then
onePercent=$( echo "scale=2; $max / 100" | bc );
freePercent=$( echo "$input / $onePercent" | bc );
else
freePercent=$(perl -e "print int((($max-$input)*100/$max))")
fi
echo $freePercent;
return 0;
}
getSizesOfVolume () {
volumeName="$1";
#Check the actual sizes
cnFree=`getColumnNoByName "VFree"`;
cnSize=`getColumnNoByName "VSize"`;
freespace=`$_vgs $volumeName 2>/dev/null | awk -v n=$cnFree '/[0-9]/{print $n}' | sed -e 's/[\.,\,].*//'`;
fullspace=`$_vgs $volumeName 2>/dev/null | awk -v n=$cnSize '/[0-9]/{print $n}' | sed -e 's/[\.,\,].*//'`;
if ( $inPercent ); then
#Convert to Percents
freespace="$(convertToPercent $freespace $fullspace)"
fi
}
setExitStatus () {
local status=$1
local volGroup="$2"
local formerStatus=$exitstatus
if [ $status -gt $formerStatus ]
then
formerStatus=$status
fi
if [ $status = $STATE_UNKNOWN ] ; then
SERVICEOUTPUT="${volGroup}"
exitstatus=$STATE_UNKNOWN
return
fi
if [ "$freespace" -le "$critlevel" ]
then
SERVICEOUTPUT=$SERVICEOUTPUT" VG $volGroup CRITICAL Available space is $freespace $units;"
exitstatus=$STATE_CRITICAL
elif [ "$freespace" -le "$warnlevel" ]
then
SERVICEOUTPUT=$SERVICEOUTPUT"VG $volGroup WARNING Available space is $freespace $units;"
exitstatus=$STATE_WARNING
else
SERVICEOUTPUT=$SERVICEOUTPUT"VG $volGroup OK Available space is $freespace $units;"
exitstatus=$STATE_OK
fi
SERVICEPERFDATA="$SERVICEPERFDATA $volGroup=$freespace$units;$warnlevel;$critlevel"
if [ $inPercent != 'true' ] ; then
SERVICEPERFDATA="${SERVICEPERFDATA};0;$fullspace"
fi
if [ $formerStatus -gt $exitstatus ]
then
exitstatus=$formerStatus
fi
}
checkVolumeGroups () {
checkArgValidity
for (( i=0; i < novg; i++ )); do
local status="$STATE_OK"
local currentVG="${volumeGroups[$i]}"
local groupExists="$(volumeGroupExists "$currentVG" )"
if [ "$groupExists" = 'true' ]; then
getSizesOfVolume "$currentVG"
status=$STATE_OK
else
status=$STATE_UNKNOWN
setExitStatus $status "${groupExists}"
break
fi
setExitStatus $status "$currentVG"
done
}
########################################################################
### RUN PROGRAM
########################################################################
########################################################################
#Read input values
while getopts ":w:c:v:h:ap" opt ;do
case $opt in
h)
print_help;
exit $exitstatus;
;;
w)
warnlevel=$OPTARG;
;;
c)
critlevel=$OPTARG;
;;
v)
if ( ! $allVG ); then
volumeGroups[$novg]=$OPTARG;
let novg++;
fi
;;
a)
allVG=true;
getAllVGOnSystem;
;;
p)
inPercent=true;
units=$unitsPercent
;;
\?)
echo "Invalid option: -$OPTARG" >&2
;;
esac
done
checkVolumeGroups
echo $SERVICEOUTPUT"|"$SERVICEPERFDATA
exit $exitstatus
check_nrpeコマンドに別の引数(別のスクリプト)を使用しましたが、うまくいきます。
たとえば、
root@nagiosserver:/usr/local/nagios# /usr/local/nagios/libexec/check_nrpe -H srv-supervised04 -c check_load OK - 負荷平均: 3.79, 2.99, 1.83|load1=3.790;0.0.0;ロード 5=2.990;20.000;25.000;0;ロッド 15=1.830;15.000;20.000;0;
VG array03-0が存在します:
root@srv-supervised04:/usr/lib/nagios/plugins# vgdisplay --- ボリュームグループ --- VG 名 array03-0 システム ID 形式
lvm2 メタデータ領域 1 メタデータ シリアル番号 34 VG アクセス読み取り/書き込みサイズ変更最大LV 0現在のLV 5公開LV 4最大PV
0現在のPV 1実際のPV 1 VGサイズ
<18,71TiB PEサイズ4,00MiB合計PE
4903887割り当てられたPE /サイズ4697600 / <17,92TiB無料PE /サイズ206 / < 805,81 GiB VG UUID
OgzAMF-DGbW-3t3L-Wk7k-gY1g-s6fH-zYECad
だから。 VGが存在します。 check_vg_size プラグインはローカルで使用すると動作し、check_nrpe コマンドは他のプラグインで使用すると nagios サーバーで動作しますが、check_vg_size は nagios サーバーでは動作しません。エラーメッセージは、明らかにarray03-0が存在しないことです。すべてのファイルで何も変更されませんでした。 Debianアップデートは9から10に提供されました(インストール中にnrpe.cfg修正ファイルを保持することにしました)。
どこから出てくるのか知っている人はいますか? Debian バージョン?たぶん新しいbashバージョンですか? nagiosサーバー(まだDebian 9)と管理されているサーバー(Debian 10)は互換性がありませんか?
答え1
修正しました。
これは権限の問題です。プラグインでnagiosユーザーにsudo権限を付与する必要があります。
nagios ALL=(root) NOPASSWD: /usr/lib/nagios/plugins/check_vg_size
その後、修正
/etc/nrpe.cfg
コマンドが始まる前にsudoを追加する
command[check_vgs_array03-0]= sudo /usr/lib/nagios/plugins/check_vg_size -w 20 -c 10 -v array03-0