Configure HAProxy Template on ZABBIX 4

ZABBIX 4 에 HAProxy 템플릿 설정

  • HAProxy 2.0 출시 후 변경 내용이 있어 일부 수정 사항이 추가되었습니다.

HAProxy 에 대한 내용은 HAProxy 설치 가이드 포스팅을 참고해 주시기 바랍니다. 이 가이드는 sergiotocalini (Sergio Tocalini Joerg) · GitHub 페이지에서 ZABBIX 용 HAProxy Template 인 habbixy 를 참고하여 작성되었으며 일부 수정 사항을 포함 합니다.

서버 설정

의존성 패키지 설치

[root@172-19-11-6 /]# yum install -y ksh

스크립트 디렉토리 생성

[root@172-19-11-6 /]# mkdir -p /etc/zabbix/bin/habbixy/var

map.index 파일 생성
: vi /etc/zabbix/bin/habbixy/map.index

# index:name:default
1:pxname:@
2:svname:@
3:qcur:0
4:qmax:0
5:scur:0
6:smax:0
7:slim:1
8:stot:@
9:bin:0
10:bout:0
11:dreq:0
12:dresp:0
13:ereq:0
14:econ:0
15:eresp:0
16:wretr:0
17:wredis:0
18:status:UNK
19:weight:0
20:act:0
21:bck:0
22:chkfail:0
23:chkdown:0
24:lastchg:0
25:downtime:0
26:qlimit:0
27:pid:@
28:iid:@
29:sid:@
30:throttle:0
31:lbtot:0
32:tracked:0
33:type:0
34:rate:0
35:rate_lim:@
36:rate_max:@
37:check_status:@
38:check_code:@
39:check_duration:0
40:hrsp_1xx:@
41:hrsp_2xx:@
42:hrsp_3xx:@
43:hrsp_4xx:@
44:hrsp_5xx:@
45:hrsp_other:@
46:hanafail:@
47:req_rate:0
48:req_rate_max:@
49:req_tot:0
50:cli_abrt:0
51:srv_abrt:0
52:comp_in:0
53:comp_out:0
54:comp_byp:0
55:comp_rsp:0
56:lastsess:0
57:last_chk:@
58:last_agt:@
59:qtime:0
60:ctime:0
61:rtime:0
62:ttime:0

스크립트 파일 생성
: vi /etc/zabbix/bin/habbixy/habbixy.sh

#!/usr/bin/env ksh
PATH=/usr/local/bin:${PATH}
IFS_DEFAULT=${IFS}

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

#################################################################################
#
#  Variable Definition
# ---------------------
#
APP_NAME=$(basename $0)
APP_DIR=$(dirname $0)
APP_VER="0.0.1"
APP_WEB="http://www.sergiotocalini.com.ar/"
APP_TIMESTAMP=`date '+%s'`
APP_MAP_INDEX=${APP_DIR}/map.index
HAPROXY_CONFIG="/etc/haproxy/haproxy.cfg"                # haproxy.cfg 경로
HAPROXY_SOCKET="/var/run/haproxy.sock"                   # haproxy.sock 경로 (haproxy.cfg에 명시)
HAPROXY_CACHE_DIR=${APP_DIR}/var
HAPROXY_CACHE_TTL=5                                      # IN MINUTES
#
#################################################################################

#################################################################################
#
#  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}
}

refresh_cache() {
    type=${1:-'stat'}
    file=${HAPROXY_CACHE_DIR}/${type}.cache
    if [[ $(( `stat -c '%Y' "${file}"`+60*${HAPROXY_CACHE_TTL} )) -le ${APP_TIMESTAMP} ]]; then
    echo "show ${type}" | sudo socat ${HAPROXY_SOCKET} stdio 2>/dev/null > ${file}
    fi
    echo "${file}"
    return 0
}

discovery() {
    svname=${1}
    if [[ ${svname} =~ (BACKEND|FRONTEND) ]]; then
    cache=$(refresh_cache 'stat')
 	for item in `cat ${cache} | awk -F"," '$2 ~ /^'${svname}'$/{print}' | cut -d, -f1 | uniq`; do
        echo ${item}
        done
    elif [[ ${svname} == "certs" ]]; then
    discovery_certs
    fi
}

ifArrayHas() {
    item=${1}
    shift
    array=( "${@}" )
    for i in ${!array[@]}; do
    [[ ${array[${i}]} == ${item} ]] && return 0
    done
    return 1
}

discovery_certs() {
    while read line; do
    IFS=" " params=( ${line} )
    IFS=${IFS_DEFAULT}
    for idx in ${!params[@]}; do
        if [[ ${params[${idx}]} == 'crt' ]]; then
        if ! ifArrayHas "${params[$((${idx}+1))]}" "${crt[@]}"; then
            if [[ -f "${params[$((${idx}+1))]}" ]]; then
            crt[${#crt[@]}]="${params[$((${idx}+1))]}"
            fi
        fi
        elif [[ ${params[${idx}]} == 'crt-list' ]]; then
        if ! ifArrayHas "${params[$((${idx}+1))]}" "${crt_list[@]}"; then
            if [[ -f "${params[$((${idx}+1))]}" ]]; then
            crt_list[${#crt_list[@]}]="${params[$((${idx}+1))]}"
            fi
        fi
        fi
    done
    done < <(grep -E "(^|\s)bind($|\s)" ${HAPROXY_CONFIG} | grep -E " (crt|crt-list) " | awk '{$1=$1};1')
    for idx in ${!crt_list[@]}; do
    while read cert; do
        if ! ifArrayHas "${cert}" "${crt[@]}"; then
        if [[ -f "${cert}" ]]; then
            crt[${#crt[@]}]="${cert}"
        fi
        fi
    done < <(cat ${crt_list[${idx}]})
    done
    printf '%s\n' ${crt[@]}
}

get_cert() {
    file="${1}"
    attr="${2}"

    [ -f ${file} ] || return 1
    
    if [[ ${attr} == 'expires' ]]; then
    after=`sudo openssl x509 -noout -in ${file} -enddate 2>/dev/null|cut -d'=' -f2`
    res=$((($(date -d "${after}" +'%s') - $(date +'%s'))/86400))
    fi
    echo "${res:-0}"
    return 0    
}

get_cert_text() {
    crt_file="${1}"

    [[ -f ${crt_file} ]] || return 1
    
    openssl x509 -noout -in ${crt_file} -text
    return 0
}

get_stat() {
    pxname=${1}
    svname=${2}
    stats=${3}

    cache=$(refresh_cache 'stat')
    
    _STAT=`grep :${stats}: ${APP_MAP_INDEX}`
    _INDEX=${_STAT%%:*}
    _DEFAULT=${_STAT##*:}

    _res="`grep \"${pxname},${svname}\" \"${cache}\" 2>/dev/null`"
    
    _res="$(echo $_res | cut -d, -f ${_INDEX})"
    if [ -z "${_res}" ] && [[ "${_DEFAULT}" != "@" ]]; then
    echo "${_DEFAULT}"
    else
    echo "${_res}"
    fi
}

get_info() {
    attr=${1}

    cache=$(refresh_cache 'info')
    
    _res="`grep -E \"^${attr}:\" \"${cache}\" 2>/dev/null | cut -d: -f 2`"
    echo "${_res:-0}"
}
#
#################################################################################

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

if [[ ${JSON} -eq 1 ]]; then
    rval=$(discovery ${ARGS[*]})
    echo '{'
    echo '   "data":['
    count=1
    while read line; do
        IFS="|" values=(${line})
        output='{ '
        for val_index in ${!values[*]}; do
            output+='"'{#${JSON_ATTR[${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
    if [[ ${SECTION} == 'stat' ]]; then
    rval=$( get_stat ${ARGS[*]} )
    rcode="${?}"
    elif [[ ${SECTION} == 'info' ]]; then
    rval=$( get_info ${ARGS[*]} )
    rcode="${?}"
    elif [[ ${SECTION} == 'certs' ]]; then
    rval=$( get_cert ${ARGS[*]} )
    fi
    echo ${rval:-0}
fi
exit ${rcode}

추가사항 : haproxy 2.0 이상 버전에서 디스커버리 데이타가 중복이라 나오면서 오류가 발생하면 67번 라인을 아래와 같이 수정해 주시기 바랍니다.

echo "@1 show ${type}" | sudo socat ${HAPROXY_SOCKET} stdio 2>/dev/null > ${file}

UserParameter 파일추가
: vi /etc/zabbix/zabbix_agentd.conf.d/haproxy.conf

UserParameter=habbixy[*],/etc/zabbix/scripts/agentd/habbixy/habbixy.sh -s "$1" -a p="$2" -a p="$3" -a p="$4" -a p="$5"
UserParameter=habbixy.discovery[*],/etc/zabbix/scripts/agentd/habbixy/habbixy.sh -a p="$1" -j "$2" -a p="$3"
UserParameter=habbixy.version,/etc/zabbix/scripts/agentd/habbixy/habbixy.sh -v short

자빅스 재시작

[root@172-19-11-6 /]# systemctl restart zabbix_agentd

ZABBIX Frontend 설정

템플릿 파일 임포트
Habbixy Template URL

zabbix-nginx-template1

host에 template 적용

HAProxy Template Import

적용 후 그래프 확인 (디스커버리 시간문제로 오래 기다리셔야 합니다.)

HAProxy Template Graph

You may also like...

Subscribe
Notify of
guest

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x