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

This site uses Akismet to reduce spam. Learn how your comment data is processed.

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