Мониторинг баз Exchange. Zabbix+PowerShell
Задача мониторинга состояния баз Exchange оказалась не такой уж простой. Из коробки Zabbix мониторить базы не может, придется его этому научить.
Получить статус баз мы можем всего одной командой PowerShell:
Get-MailboxDatabaseCopyStatus -Identity *
Эту команду можно выполнить на любом из серверов Exchange и она вернет подробный статус всех баз. Тут нас интересует примонтирована ли база, величина очереди и состояние индекса базы.
Теперь нужно сделать так, чтобы Zabbix уведомил нас если с какой-то из баз что-то не так.
- Создадим пользовательский ключ данных в Zabbix агенте на Exchange сервере. Просто дописываем в конфиг строку:
UserParameter=DB_status,PowerShell.exe -nologo "C:\scripts\DB_status_tst.ps1"
Теперь при запросе Заббиксом ключа данных DB_status будет выполняться скрипт который лежит в папке «C:\scripts\» и имеет имя «DB_status_tst.ps1».
2. Скрипт в свою очередь должен отдать нас статус баз. Чтобы не усложнять скрипт я решил что в случае когда все хорошо скрипт будет отдавать нам «ОК», если с какой-то базой что-то не так, то скрипт будет отдавать в чем проблема и с какой базой. Например если у базы DB1 длинная очередь — скрипт отдаст нам «queue DB1». А теперь сам скрипт:
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010 #Подключаем модуль $dbs = Get-MailboxDatabaseCopyStatus -Identity * #Получаем статус баз $nok = $NULL foreach ($db in $dbs) #Перебираем базы { $status = $db.status $name = $db.DatabaseName $queue = $db.CopyQueueLength $index = $db.ContentIndexState if ($status -ne "Healthy" -and $status -ne "Mounted") #Если статус базы не Healthy и не Mounted { $nok += "not ok "+ $name + "; " } if ($queue -gt 100) #Если длинна очереди больше 100 { $nok += "queue "+ $name + "; " } if ($index -ne "Healthy") #Если индекс не исправен { $nok += "index "+ $name + "; " } } #Возвращаем результат if ($nok -ne $NULL) { Write-Host $nok } else { Write-Host "OK" }
3. Создаем элемент данных в Zabbix
4.Создаем триггер
Обращаем внимание на поле Description. В случае срабатывания триггера в описании будет то, что отдал наш скрипт. Т.е. имя проблемной базы.
Спасибо за статью!
команда пошика
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010
будет выполнена каждый раз от имени System и каждый раз эта штука будет подгружаться, что занимает порядка 40с (дело не сервере, это такая оснастка). максимальное время которое ждет zabbix от скрипта 30с (больше можно выставить только пересобрав zabbix и агент и сервер из исходников).
Так что в текущем виде это всё не пригодно.
Нужно, по идее, брать вывод Write-Host и запуливать в .txt и вот оттуда уже читать другим скриптом. (минус данного подхода в том, что переменная DB_status будет всегда заполнена данными из предыдущей проверки и отставание от реальности будет порядка минуты.).
Точно помню что скрипт в этом виде успешно работал пару недель точно. Потом был переписан по другой схеме, как раз с использованием внешнего файла. Но подробностей уже не помню за давностью времени.