데비안 업그레이드 이후로 check_nrpe 명령은 nagios 서버에서 실행할 수 없습니다

데비안 업그레이드 이후로 check_nrpe 명령은 nagios 서버에서 실행할 수 없습니다

어제 내 서버를 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 확인 사용 가능한 공간은 805GB입니다. 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;25.000;30.000;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 액세스 읽기/쓰기 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/크기 206287/ < 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 수정 파일을 유지하기로 결정했습니다).

어디서 나오는지 아는 사람 있나요? 데비안 버전? 어쩌면 새로운 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

관련 정보