Nagios는 NRPE를 통해 스크립트로부터 반환을 받습니다.

Nagios는 NRPE를 통해 스크립트로부터 반환을 받습니다.

나는 nagios3을 사용하고 있으며 nrpe_server에서 일부 정보를 수집하고 싶습니다.

다음 스크립트는 nrpe_server에 있습니다.

#!/bin/sh
#set -x
# script for checking disk usage on ZFS
# requires min zpool version 13 or zfs version 4
# example, it's posible to have zfs ver 1 on zpool ver 15 (script support this)
# http://www.googlux.com/nagios.plugin.zfs.usage.html
# ------------ Variables
PROGNAME=`/usr/bin/basename $0`

# ------ Nagios plugin return values
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4

# ------------ Subroutines

# Program usage
usage() {
echo " \
Usage
        ${PROGNAME} /zfs warn crit

Note:
1. ZFS filesystem must start with /
2. warn is warning free space in %
3. crit is critical free space in %
example: /tank 20 10
"
}

# End script with output, with performance data for NagiosGraph
endscript () {
        echo "${RESULT}"
        exit ${EXIT_STATUS}
}

# ------------ check if there are 3 arguments
if [ $# != 3 ]; then
        usage
        exit 3
fi

# --------- check if warning is bigger than critical size
if [ $3 -ge $2 ]; then
        echo "Warning[%] must be bigger than Critical[%]"
        exit 3
fi

# ----------- check if first argument is a filesystem
FS=`df -T $1 | tail -n 1`
if [ $? != 0 ]; then
        echo "The $1 is not valid filesystem"
        exit 3
fi

# ----------- check if filesystem is ZFS
# /var : zfs
# /export/atlant-dbbackup: zfs
# note - comment out: ZFS=`echo ${FS} | awk '{print $3}'`
ZFS=`echo ${FS} | awk '{print $2}'`

if [ "${ZFS}" != "zfs" ]; then
        echo "The $1 is not ZFS"
        exit 3
fi

# -------- get dataset of filesystem
DATASET=`df -h $1 | grep -v Filesystem | awk '{print $1}'`

# ----------- check if ZFS is min required version 4 or ZPOOL min required ver 13
ZFSVER=`zfs get -H version ${DATASET} | awk '{print $3}'`
if [ $? -ne 0 ]; then
        echo "The ZFS version can't be determined, it's probably less then 4"
        exit 3
fi
if [ ${ZFSVER} -lt 4 ]; then
        #echo "The $1 is indeed ZFS, but version ${ZFSVER} which is less than 4 and not supported by this script"
        #exit 3
        # ---------- check if ZPOOL is min required version 13, or higher
        ZPOOLVER=`zpool upgrade | head -1 | awk '{print $NF}' | awk -F. '{print $1}'`
        if [ ${ZPOOLVER} -lt 13 ]; then
                echo "The script can't support zpool ver ${ZPOOLVER} (<13) and ZFS ver ${ZFSVER} (<4)"
                exit 3
        fi
fi


# size in bytes
QUOTA=`zfs get -Hp quota ${DATASET} | awk '{print $3}'`
DIV=1024/1024
# --- check if there is quota at all
if [ ${QUOTA} -eq 0 ]; then
#        echo "There is no quota on zfs dataset ${DATASET}"
    QUOTA=`df $1 | tail -n 1 | awk '{print $4}'`
    DIV=1024
#        exit 3
fi

# --- check if zfs properties can be determined
# --- sometimes even zfs ver =4 this is not posible
for i in usedbydataset usedbychildren usedbysnapshots
do
        if [ "`zfs get -Hp ${i} ${DATASET} | awk '{print $3}'`" = "-" ]; then
                echo "Somehow zfs property ${i} cannot be determined"
                exit 3
        fi
done

# --- check if usedbydataset is not 0
# --- can happens with export/import zpools
if [ `zfs get -Hp usedbydataset ${DATASET} | awk '{print $3}'` -eq 0 ]; then
        echo "Somehow zfs property usedbydataset=0, probably zpool exported/imported and script can't support it"
        exit 3
fi

CHILDRENUSE=`zfs get -Hp usedbychildren ${DATASET} | awk '{print $3}'`
DATA=`zfs get -Hp usedbydataset ${DATASET} | awk '{print $3}'`
SNAPSHOT=`zfs get -Hp usedbysnapshots ${DATASET} | awk '{print $3}'`
#echo QUOTA=${QUOTA}
# size in Mbytes
QUOTA=`(echo "scale=2; ${QUOTA}/${DIV}" | bc -l)`
CHILDRENUSE=`(echo "scale=2; ${CHILDRENUSE}/1024/1024" | bc -l)`
DATA=`(echo "scale=2; ${DATA}/1024/1024" | bc -l)`
SNAPSHOT=`(echo "scale=2; ${SNAPSHOT}/1024/1024" | bc -l)`
#echo QUOTA=${QUOTA}
# real quota is actually quota-usedbychildren
QUOTA=`(echo "scale=2; ${QUOTA}-${CHILDRENUSE}" | bc -l)`

FREE=`(echo "${QUOTA}-${DATA}-${SNAPSHOT}" | bc -l)`

#echo "FREE=${QUOTA}-${DATA}-${SNAPSHOT}"

FREEPERC=`bc -l << E
scale=0
${FREE}*100/${QUOTA}
E`

WARNING=$2
CRITICAL=$3

if [ ${FREEPERC} -gt ${WARNING} ]
then
        RESULT="ZFS ver${ZFSVER} $1 OK Free space ${FREE}MB ${FREEPERC}% : ${QUOTA}, ${SNAPSHOT}, ${DATA}, ${FREE}"
        EXIT_STATUS=${STATE_OK}
elif [ ${FREEPERC} -le ${WARNING} ] && [ ${FREEPERC} -gt ${CRITICAL} ]
then
        RESULT="ZFS ver${ZFSVER} $1 WARNING Free space ${FREE}MB ${FREEPERC}% : ${QUOTA}, ${SNAPSHOT}, ${DATA}, ${FREE}"
        EXIT_STATUS=${STATE_WARNING}
else
        RESULT="ZFS ver${ZFSVER} $1 CRITICAL Free space ${FREE}MB ${FREEPERC}% : ${QUOTA}, ${SNAPSHOT}, ${DATA}, ${FREE}"
        EXIT_STATUS=${STATE_CRITICAL}
fi

# ------- provide output and nagios return value
endscript

nagios3에서 매개변수를 올바르게 수신합니다. 명령줄에서 nrpe_server에 대해 이 스크립트를 수동으로 실행하면 올바른 정보가 반환됩니다. 예를 들면 다음과 같습니다.

# /usr/lib/nagios/plugins/check_zfs_usage.sh /tank/share 20 10
ZFS ver5 /tank/share OK Free space 2175113.43MB 73% : 2954615.25, 1053.55, 778448.27, 2175113.43

그러나 nagios3가 동일한 매개변수를 사용하여 nrpe_server를 통해 원격으로 이 스크립트를 실행하면 잘못된 메시지가 표시됩니다.

ZFS ver /tank/share CRITICAL Free space MB % : , , ,

그렇다면 스크립트에 어떤 문제가 있으며 이를 수정하는 방법은 무엇입니까?

답변1

아마도 다음을 교체하는 것이 좋습니다.

# -------- get dataset of filesystem
DATASET=`df -h $1 | grep -v Filesystem | awk '{print $1}'`

다음과 같은 내용이 있습니다:

# -------- get dataset of filesystem
DATASET=`df -h $1 | awk '{print $1}' | tail -n 1`

일부 설치의 현지화 문제로 인해 일부 배포판에서는 "파일 시스템"과 같은 것을 현지화된 플러그인(예: "Dateisystem")으로 바꾸는 것이 좋은 생각이라고 생각합니다.

답변2

문제는 /dev/zfs에 대한 권한에 있습니다. 나는 이미 했어다음:

cat <<EOM>/etc/udev/rules.d/91-zfs-permissions.rules
#Use this to add a group and more permissive permissions for zfs
#so that you don't always need run it as root.  beware, users not root
#can do nearly EVERYTHING, including, but not limited to destroying
#volumes and deleting datasets.  they CANNOT mount datasets or create new
#volumes, export datasets via NFS, or other things that require root
#permissions outside of ZFS.
ACTION=="add", KERNEL=="zfs", MODE="0660", GROUP="zfs"
EOM

groupadd zfs
gpasswd -a nagios zfs

reboot

이제 모든 것이 잘 작동합니다.

관련 정보