СКАЧАТЬ # 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
Код: Выделить всё
#!/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}
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
Код: Выделить всё
#!/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
Код: Выделить всё
#!/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}
Код: Выделить всё
#!/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
Код: Выделить всё
#!/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}
Код: Выделить всё
#!/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
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
Группы элементов данных
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 файлы (внизу поста)
Мои Преобразования