HV KVM

Kernel-based Virtual Machine KVM — программное решение, обеспечивающее виртуализацию
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 804
Стаж: 5 лет 1 месяц
Откуда: Вологодская область
Поблагодарили: 33 раза
Контактная информация:

HV KVM

Сообщение Артём Мамзиков »

Шаблон HV KVM

СКАЧАТЬ
virbix-HV KVM.zip
virbix-HV KVM.zip
(24.05 КБ) 6 скачиваний
# virbix
Мониторинг Zabbix KVM

# Зависимости
## Пакеты
* ksh
* xmllint

### Debian/Ubuntu
#~ sudo apt install ksh xmllint
#~

### Red Hat
#~ sudo yum install ksh
#~

# Развернуть
Имя пользователя и пароль могут быть пустыми, если у Дженкинса включена опция только для чтения.
Переменные по умолчанию:
ИМЯ|ЗНАЧЕНИЕ
----|-----
LIBVIRT_URI|qemu:///system
**Примечание: эти переменные должны быть сохранены в конфигурационном файле (verbix.conf) в том же каталоге, что и скрипт.*

## Zabbix
#~ git clone https://github.com/sergiotocalini/virbix.git
#~ sudo ./virbix/deploy_zabbix.sh "<LIBVIRT_URI>"
#~ sudo systemctl restart zabbix-agent
* Примечание: установка должна быть выполнена на хосте агента zabbix, и вы должны импортировать шаблон в zabbix web. Каталог установки по умолчанию - /etc/zabbix/scripts/agentd/virbix*

Скрипт deploy_zabbix.sh

Код: Выделить всё

#!/usr/bin/env ksh
SOURCE_DIR=$(dirname $0)
ZABBIX_DIR=/etc/zabbix

LIBVIRT_URI=${1:-qemu:///system}

mkdir -p ${ZABBIX_DIR}/scripts/agentd/virbix
cp -r ${SOURCE_DIR}/virbix/scripts ${ZABBIX_DIR}/scripts/agentd/virbix/
cp ${SOURCE_DIR}/virbix/virbix.conf.example ${ZABBIX_DIR}/scripts/agentd/virbix/virbix.conf
cp ${SOURCE_DIR}/virbix/virbix.sh ${ZABBIX_DIR}/scripts/agentd/virbix/
cp ${SOURCE_DIR}/virbix/zabbix_agentd.conf ${ZABBIX_DIR}/zabbix_agentd.d/virbix.conf
sed -i "s|LIBVIRT_DEFAULT_URI=.*|LIBVIRT_DEFAULT_URI=\"${LIBVIRT_URI}\"|g" ${ZABBIX_DIR}/scripts/agentd/virbix/virbix.conf
Скрипт virbix.sh

Код: Выделить всё

#!/usr/bin/env ksh
rcode=0
PATH=/usr/local/bin:${PATH}

#################################################################################

#################################################################################
#
#  Variable Definition
# ---------------------
#
APP_NAME=$(basename $0)
APP_DIR=$(dirname $0)
APP_VER="0.0.1"
APP_WEB="http://www.sergiotocalini.com.ar/"
#
#################################################################################

#################################################################################
#
#  Load Environment
# ------------------
#
[[ -f ${APP_DIR}/${APP_NAME%.*}.conf ]] && . ${APP_DIR}/${APP_NAME%.*}.conf

#
#################################################################################

#################################################################################
#
#  Function Definition
# ---------------------
#
usage() {
    echo "Usage: ${APP_NAME%.*} [Options]"
    echo ""
    echo "Options:"
    echo "  -a            Query arguments."
    echo "  -h            Displays this help message."
    echo "  -j            Jsonify output."
    echo "  -s ARG(str)   Section (default=stat)."
    echo "  -v            Show the script version."
    echo ""
    echo "Please send any bug reports to sergiotocalini@gmail.com"
    exit 1
}

version() {
    echo "${APP_NAME%.*} ${APP_VER}"
    exit 1
}

#check_params() {
#    [[ -d ${HAPROXY_CACHE_DIR} ]] || mkdir -p ${HAPROXY_CACHE_DIR}
#}

#
#################################################################################

#################################################################################
while getopts "s::a:s:uphvj:" OPTION; do
    case ${OPTION} in
	h)
	    usage
	    ;;
	s)
	    SCRIPT="${APP_DIR}/scripts/${OPTARG}"
	    ;;
        j)
            JSON=1
            IFS=":" JSON_ATTR=(${OPTARG//p=})
            ;;
	a)
	    ARGS[${#ARGS[*]}]=${OPTARG//p=}
	    ;;
	v)
	    version
	    ;;
         \?)
            exit 1
            ;;
    esac
done

if [[ -f "${SCRIPT%.sh}.sh" ]]; then
    rval=`${SCRIPT%.sh}.sh ${ARGS[@]} 2>/dev/null`
    rcode="${?}"
    if [[ ${JSON} -eq 1 ]]; then
       echo '{'
       echo '   "data":['
       count=1
       while read line; do
          IFS="|" values=(${line})
          output='{ '
          for val_index in ${!values[*]}; do
             output+='"'{#${JSON_ATTR[${val_index}]:-${val_index}}}'":"'${values[${val_index}]}'"'
             if (( ${val_index}+1 < ${#values[*]} )); then
                output="${output}, "
             fi
          done 
          output+=' }'
          if (( ${count} < `echo ${rval}|wc -l` )); then
             output="${output},"
          fi
          echo "      ${output}"
          let "count=count+1"
       done <<< ${rval}
       echo '   ]'
       echo '}'
    else
	echo ${rval:-0}
    fi
else
    echo "ZBX_NOTSUPPORTED"
    rcode="1"
fi

exit ${rcode}
Пример virbix.conf
LIBVIRT_DEFAULT_URI=qemu:///system

Скрипт domain_check.sh

Код: Выделить всё

#!/usr/bin/env ksh

VIRSH="sudo `which virsh`"
UUID="${1}"
ATTR="${2}"

if [[ ${ATTR} == 'state' ]]; then
   ${VIRSH} domstate ${UUID}|sed '/^\s*$/d'
fi
Скрипт domain_list.sh

Код: Выделить всё

#!/usr/bin/env ksh

VIRSH="sudo `which virsh`"
for vm in `${VIRSH} list --all --uuid`; do
    output=""
    ${VIRSH} dominfo ${vm} | while read line; do
       key=`echo ${line}|awk -F: '{print $1}'|awk '{$1=$1};1'`
       val=`echo ${line}|awk -F: '{print $2}'|awk '{$1=$1};1'`
       if [[ ${key} =~ ^(Id|Name|UUID|OS Type|State)$ ]]; then
          output+="`echo ${line}|awk -F: '{print $2}'|awk '{$1=$1};1'`|"
       fi
    done
    echo ${output}|sed 's/.$//'
done
Скрипт net_check.sh

Код: Выделить всё

#!/usr/bin/env ksh

APP_DIR=$(dirname $0)
VIRSH="sudo `which virsh`"
UUID="${1}"
ATTR="${2}"
TIMESTAMP=`date '+%s'`
CACHE_DIR="${APP_DIR}/${CACHE_DIR:-./var/cache}/net"
CACHE_FILE=${CACHE_DIR}/${UUID}.xml
CACHE_TTL=5

refresh_cache() {
    [ -d ${CACHE_DIR} ] || mkdir -p ${CACHE_DIR}
    if [[ -f ${CACHE_FILE} ]]; then
	if [[ $(( `stat -c '%Y' "${CACHE_FILE}"`+60*${CACHE_TTL} )) -le ${TIMESTAMP} ]]; then
	    ${VIRSH} net-dumpxml ${UUID} > ${CACHE_FILE}
	fi
    else
	${VIRSH} net-dumpxml ${UUID} > ${CACHE_FILE}
    fi
}

if [[ ${ATTR} == 'bridge_name' ]]; then
    refresh_cache
    rval=`xmllint --xpath "string(//network/bridge/@name)" ${CACHE_FILE}`
elif [[ ${ATTR} == 'mac_addr' ]]; then
    refresh_cache
    rval=`xmllint --xpath "string(//network/mac/@address)" ${CACHE_FILE}`
elif [[ ${ATTR} == 'active' ]]; then
    rval="`${VIRSH} net-info ${UUID}|grep '^Active:'|awk -F: '{print $2}'|awk '{$1=$1};1'`"
fi

echo ${rval:-0}
Скрипт net_list.sh

Код: Выделить всё

#!/usr/bin/env ksh

VIRSH="sudo `which virsh`"
for net in `${VIRSH} net-list --all --uuid`; do
    output=""
    ${VIRSH} net-info ${net} | while read line; do
       key=`echo ${line}|awk -F: '{print $1}'|awk '{$1=$1};1'`
       val=`echo ${line}|awk -F: '{print $2}'|awk '{$1=$1};1'`
       if [[ ${key} =~ ^(Id|Name|UUID|Active|Bridge)$ ]]; then
          output+="`echo ${line}|awk -F: '{print $2}'|awk '{$1=$1};1'`|"
       fi
    done
    echo ${output}|sed 's/.$//'
done
Скрипт pool_check.sh

Код: Выделить всё

#!/usr/bin/env ksh

APP_DIR=$(dirname $0)
VIRSH="sudo `which virsh`"
UUID="${1}"
ATTR="${2}"
TIMESTAMP=`date '+%s'`
CACHE_DIR="${APP_DIR}/${CACHE_DIR:-./var/cache}/pools"
CACHE_FILE=${CACHE_DIR}/${UUID}.xml
CACHE_TTL=5

refresh_cache() {
    [ -d ${CACHE_DIR} ] || mkdir -p ${CACHE_DIR}
    if [[ -f ${CACHE_FILE} ]]; then
	if [[ $(( `stat -c '%Y' "${CACHE_FILE}"`+60*${CACHE_TTL} )) -le ${TIMESTAMP} ]]; then
	    ${VIRSH} pool-dumpxml ${UUID} > ${CACHE_FILE}
	fi
    else
	${VIRSH} pool-dumpxml ${UUID} > ${CACHE_FILE}
    fi
}

if [[ ${ATTR} == 'size_used' ]]; then
    refresh_cache
    rval=`xmllint --xpath "string(//pool/allocation)" ${CACHE_FILE}`
elif [[ ${ATTR} == 'size_free' ]]; then
    refresh_cache
    rval=`xmllint --xpath "string(//pool/available)" ${CACHE_FILE}`
elif [[ ${ATTR} == 'state' ]]; then
    rval="`${VIRSH} pool-info ${UUID}|grep '^State:'|awk -F: '{print $2}'|awk '{$1=$1};1'`"
fi

echo ${rval:-0}
Скрипт pool_list.sh

Код: Выделить всё

#!/usr/bin/env ksh

VIRSH="sudo `which virsh`"
for vm in `${VIRSH} pool-list --all | egrep -v "(^-.*|^ Name.*|^$)" | awk '{print $1}'`; do
    output=""
    ${VIRSH} pool-info ${vm} | while read line; do
       key=`echo ${line}|awk -F: '{print $1}'|awk '{$1=$1};1'`
       val=`echo ${line}|awk -F: '{print $2}'|awk '{$1=$1};1'`
       if [[ ${key} =~ ^(Id|Name|UUID|State)$ ]]; then
          output+="`echo ${line}|awk -F: '{print $2}'|awk '{$1=$1};1'`|"
       fi
    done
    echo ${output}|sed 's/.$//'
done
Прописать в zabbix_agentd.conf
UserParameter=virbix[*],/etc/zabbix/scripts/agentd/virbix/virbix.sh -s $1 -a p=$2 -a p=$3 -a p=$4 -a p=$5
UserParameter=virbix.discovery[*],/etc/zabbix/scripts/agentd/virbix/virbix.sh -s $1 -j p=$2 -a p=$3
UserParameter=virbix.version,/etc/zabbix/scripts/agentd/virbix/virbix.sh -v short
Шаблон HV KVM
Шаблон HV KVM
Группы элементов данных
KVM

Правила обнаружения
Шаблон HV KVM-Прототипы
Шаблон HV KVM-Прототипы
[KVM] Обнаружение: Домена Прототипы элементов данных 1 Прототипы триггеров 1 Прототипы графиков Прототипы узлов сети virbix.discovery[domain_list, DOMID:DOMNAME:DOMUUID:DOMTYPE:DOMSTATE] 60 Zabbix агент Активировано

Прототипы элементов данных
[KVM] Домен {#DOMNAME}: состояние virbix[domain_check, {#DOMUUID}, state] 10m 30d Zabbix агент KVM Да

Прототипы триггеров
Средняя KVM: Домен {#DOMNAME} изменил состояние {Template HV KVM:virbix[domain_check, {#DOMUUID}, state].change()}=1 Да


[KVM] Обнаружение: Сети Прототипы элементов данных 1 Прототипы триггеров Прототипы графиков Прототипы узлов сети virbix.discovery[net_list, NETNAME:NETUUID:NETACTIVE:NETBRIDGE] 60 Zabbix агент Активировано

Прототипы элементов данных
[KVM] Сеть {#NETNAME}: Активна virbix[net_check, {#NETUUID}, active] 5m 7d Zabbix агент KVM Да


[KVM] Обнаружение: Пула Прототипы элементов данных 3 Прототипы триггеров 1 Прототипы графиков 1 Прототипы узлов сети virbix.discovery[pool_list, POOLNAME:POOLUUID:POOLSTATE] 60 Zabbix агент Активировано

Прототипы элементов данных
[KVM] Пул {#POOLNAME}: Свободное пространство virbix[pool_check, {#POOLUUID}, size_free] 1h 7d 90d Zabbix агент KVM Да

[KVM] Пул {#POOLNAME}: Используемое пространство virbix[pool_check, {#POOLUUID}, size_used] 1h 7d 90d Zabbix агент KVM Да

[KVM] Пул {#POOLNAME}: Состояние virbix[pool_check, {#POOLUUID}, state] 10m 7d Zabbix агент KVM Да


Прототипы триггеров
Средняя KVM: Пул {#POOLNAME} изменил состояние {Template HV KVM:virbix[pool_check, {#POOLUUID}, state].change()}=1 Да

Прототипы графиков
[KVM] Пул {#POOLNAME}: Использование пространства 900 200 Стэкируемый


Мои mib файлы (внизу поста)
Мои Преобразования
количество слов: 1137

Вернуться в «KVM - Виртуальная машина»