Postfix queue monitoring
Материал из Ksimute
Коробанов Сергей
Октябрь 1, 2008
Задача:
Случилась несколько месяцев назад у нас проблема с почтовым сервером. Абоненты заразились очередным спам вирусом под M$.
И как результат - огромное кол-во писем в очереди. Доставка почты почти встала время доставки 3-4 часа.
почтовик связка postfix + amavisd + clamav + dovecot + postgresql.
Определил источники спама, зафаерволил, написал скрипт удаляющий спам сообщения. Но осадок остался.
День неработающей почтовой слубы это не шутка.
Надо сделать мониторинг кол-ва сообщений в очереди, чтобы вовремя принимать меры.
nagios внедрен много лет назад, он нам и поможет :).
Кол-во сообщений будем узнавать с помощью скрипта на bash, передавать используя snmp.
SNMP (Simple Network Management Protocol) - является протоколом прикладного уровня, предназначенным для облегчения обмена
информацией управления между сетевыми устройствами.
Пользуясь информацией SNMP (такой, как показатель числа пакетов в секунду и коэффициент сетевых ошибок),
сетевые администраторы могут более просто управлять производительностью сети и обнаруживать и решать сетевые проблемы.
Дальше читаем что такое snmp и как его использовать. Документации море.
Google и opennet поможет! (кто в первый раз слышит про SNMP - внедряйте сразу и MRTG или RRDtool - мощьные инструменты)
Создаем скрипт:
cat count.sh # #!/bin/bash POSTSP="/var/spool/postfix" find $POSTSP/active $POSTSP/incoming $POSTSP/deferred -type f | wc -l
В /etc/snmpd/snmpd.conf добавляем следующую строку:
exec postspool /POSTMON/count.sh
Стартуем snmpd, проверяем
snmpwalk -v 1 -c COMMUNITY localhost .1.3.6.1.4.1.2021 UCD-SNMP-MIB::extIndex.1 = INTEGER: 1 UCD-SNMP-MIB::extNames.1 = STRING: postspool UCD-SNMP-MIB::extCommand.1 = STRING: /POSTMON/count.sh UCD-SNMP-MIB::extResult.1 = INTEGER: 0 UCD-SNMP-MIB::extOutput.1 = STRING: 20 UCD-SNMP-MIB::extErrFix.1 = INTEGER: noError(0) UCD-SNMP-MIB::extErrFixCmd.1 = STRING:
Нас интересует:
UCD-SNMP-MIB::extOutput.1 = STRING: 20
Это и есть кол-во сообщений в очереди postfix
всего 20, т.к. сервер в данном случае тестовый.
snmpwalk -v 1 -c COMMUNITY localhost .1.3.6.1.4.1.2021.extTable.1.extOutput.1 UCD-SNMP-MIB::extOutput.1 = STRING: 20
Красота!
Конфигурируем nagios:
Сначала сделаем комманду проверки назовем ее check_mailq
checkcommands.cfg
define command{
command_name check_mailq
command_line $USER1$/check_snmp -H $HOSTADDRESS$ -C COMMUNITY
-o .1.3.6.1.4.1.2021.extTable.1.extOutput.1 -w 500 -c 1000
}
Warning при 500 сообщениях Critical при 1000
Создаем сервис:
services.cfg
#mailq
define service{
use servers-service ; Name of service template to use
hostgroup_name postq
service_description Mailq at postfix service
check_command check_mailq
}
Добавляем шаблон хоста и хост
hosts.cfg
Сначала шаблон (т.к. почтовиков у нас много шаблон нужен.
Если один почтовик параметры проверки можно прописать в описании хоста)
define host{
name postmailq
notifications_enabled 1 ; Host notifications are enabled
event_handler_enabled 1 ; Host event handler is enabled
flap_detection_enabled 1 ; Flap detection is enabled
process_perf_data 1 ; Process performance data
retain_status_information 1 ; Retain status information across program restarts
retain_nonstatus_information 1 ; Retain non-status information across program restarts
check_command check_mailq
max_check_attempts 1
notification_interval 0
notification_period 24x7
notification_options d,r
register 0
}
Описание хоста:
define host{
use postmailq ; Name of host template to use
host_name mail.postq
alias trancom.ru post service Postfix mailq monitoring
address 1.2.3.4
parents mail ; mail - родитель проверка доступности сервера ping (другой define)
contact_groups admin
}
Создаем группу хостов и добавляем в нее наш почтовик.
hostgroups.cfg
define hostgroup{
hostgroup_name postq
alias Postfix mail q
members mail.postq
}
Релоадим nagios и получаем мониторинг очереди с алармингом!
Спасибо Chumka с linux.org.ru, подсказал куда копать :)
Ато я уже собирался писать демона на perl Perl:Net:Server,
который при обращении на порт выдает кол-во сообщений в очереди.
и написать модуль к nagios, используя Perl:Net:telnet который коннектится к
почтовику, считывает кол-во писем в очереди и алармит.
Такое решение тоже имеет право на жизнь, но через snmp гораздо красивее, проще и безглючнее.