После настройки постфикса неожиданно понадобилось его мониторить. Глаза боятся — руки делают.
У нас есть 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
Цеплаяем шаблон заббикса к хосту и наблюдаем картинку:
Обновление от 04.05.2022
Внёс изменение в скрипт /etc/zabbix/zabbix_scripts/postfix_data.sh. Оказалось, что при большом количестве писем возможна ситуация, когда значения во временном файле /tmp/postfix_data.dat дублируются после перезагрузки сервера.
Сделал сортировку с удалением дублей. Также считываю только уникальное значение, чтобы уменьшить вероятность считывания неверных данных.