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 гораздо красивее, проще и безглючнее.