Перейти к основному содержанию

Мониторинг Postfix через Zabbix

Zabbix

После настройки постфикса неожиданно понадобилось его мониторить. Глаза боятся — руки делают.

У нас есть zabbix сервер версии 3.4.15 и недавно настроенный postfix на Ubuntu: Установка и настройка postfix на ubuntu.

Вот мой шаблон: Zabbix-шаблон для postfix.

Ставим софт на постфикс, нам понадобится logtail:

apt-get install logtail -y

Создаём файл /etc/zabbix/zabbix_scripts/postfix_data.sh:

#!/bin/bash

MAILLOG=/var/log/mail.log
PARTLOG=/tmp/postfix_data_partlog.log
OFFSETFILE=/tmp/postfix_data_offset.dat
DATAFILE=/tmp/postfix_data.dat
LOGTAIL=/usr/sbin/logtail

VALS=( 'bounced' 'deferred' 'sent' 'expired' 'reject' 'connect_from' 'connect_to' 'refused' 'queue' )

[ ! -e "${DATAFILE}" ] && touch "${DATAFILE}" && chown zabbix:zabbix "${DATAFILE}"
[ ! -e "${PARTLOG}" ] && touch "${PARTLOG}" && chown zabbix:zabbix "${PARTLOG}"

# если читаем данные
if [ -n "$1" ]; then
    key=$(echo ${VALS[@]} | grep -wo $1)
    if [ -n "${key}" ]; then
        value=$(cat "${DATAFILE}" | sort -u | grep -e "^${key};" | cut -d ";" -f2)
        echo "${value}"
    else
        exit 2
    fi

# если пишем данные
else
    "${LOGTAIL}" -f"${MAILLOG}" -o"${OFFSETFILE}" > ${PARTLOG}
    for i in "${VALS[@]}"; do
        case ${i} in
            "bounced")
            value=$(grep "status=bounced" ${PARTLOG} | wc -l)
            ;;
            "deferred")
            value=$(grep "status=deferred" ${PARTLOG} | wc -l)
            ;;
            "sent")
            value=$(grep "status=sent" ${PARTLOG} | wc -l)
            ;;
            "expired")
            value=$(grep "status=expired" ${PARTLOG} | wc -l)
            ;;
            "reject")
            value=$(grep "NOQUEUE: reject" ${PARTLOG} | wc -l)
            ;;
            "connect_from")
            value=$(grep ": connect from" ${PARTLOG} | wc -l)
            ;;
            "connect_to")
            value=$(grep ": connect to" ${PARTLOG} | wc -l)
            ;;
            "refused")
            value=$(grep "refused to talk to me:" ${PARTLOG} | wc -l)
            ;;
            "queue")
            value=$(mailq | grep -v "Mail queue is empty" | grep -c "^[A-F0-9]")
            ;;
        esac
        if grep -q ${i} ${DATAFILE}; then
            sed -i "s/^${i};.*$/${i};${value}/" "${DATAFILE}"
        else
            echo "${i};${value}" >> "${DATAFILE}"
            sort -u "${DATAFILE}" -o "${DATAFILE}"
        fi
    done
fi

Разрешаем выполнение:

chmod a+x postfix_data.sh

Добавляем данный скрипт в cron от рута: 

crontab -e
*/10 * * * * bash /etc/zabbix/zabbix_scripts/postfix_data.sh
service cron restart

Добавляем файл /etc/zabbix/zabbix_agent.d/userparameter_postfix.conf:

UserParameter=postfix[*],/etc/zabbix/zabbix_scripts/postfix_data.sh $1

Перезапускаем агента:

service zabbix-agent restart

Цеплаяем шаблон заббикса к хосту и наблюдаем картинку:

postfix

postfix

 

postfix

Обновление от 04.05.2022

Внёс изменение в скрипт /etc/zabbix/zabbix_scripts/postfix_data.sh. Оказалось, что при большом количестве писем возможна ситуация, когда значения во временном файле /tmp/postfix_data.dat дублируются после перезагрузки сервера.

Сделал сортировку с удалением дублей. Также считываю только уникальное значение, чтобы уменьшить вероятность считывания неверных данных.

Теги

 

Похожие материалы