Предисловие
В своей первой публикации я рассказывал, как можно настроить мониторинг очередей почтовых серверов Communigate Pro (CGP) в Zabbix. Сегодня расскажу о своем небольшом опыте использования low-level discover (LLD) Zabbix для мониторинга количества пользователей в доменах. Сразу скажу, что практический смысл именно от мониторинга количества пользователей, на мой взгляд, небольшой. Сделано это было больше для собственной радости и возможности быстро ответить начальству на вопрос «а сколько у нас пользователей?» без необходимости пробегать по всем серверам.
Low-level discover
LLD обеспечивает возможность автоматически создавать элементы данных, триггеры и графики для различных параметров компьютера. Например, Zabbix умеет автоматически собирать данные о ваших файловой системе или сетевых интерфейсах и на основе этой информации строить элементы данных для мониторинга.
Для того, чтобы LLD был возможен, нам необходимо добавить в настройки агента Zabbix пользовательский параметр, запрос которого будет возвращать серверу мониторинга список JSON-объектов, каждый из которых в случае, например, сетевых интерфейсов соответствует одному интерфейсу.
Задача
Необходимо сделать возможным «мониторить» количество пользователей на всех доменах сервера CGP + общее количество пользователей на сервере.
Ход реализации этой задачи состоит из следующих шагов:
1. Скрипт для получения списка доменов CGP для LLD.
2. Скрипт для получения количества аккаунтов для домена.
3. Разместить эти скрипты на сервере.
4. Настроить Zabbix агент.
5. Создать шаблон в Zabbix для мониторинга количества аккаунтов.
6. Добавить этот шаблон на нужные узлы в Zabbix.
Важное замечание! Скрипты, которые используются в данном случае, требуют от пользователя, чье имя они используют в работе, наличие права доступа «Can Modify All Domains and Accounts Settings» (см. подробнее здесь). Это очень серьезные права, которые позволяют просто очистить домен от пользователей. Соответственно, все что вы делаете — вы делаете на свой страх и риск.
1. Скрипт для получения списка доменов CGP для LLD
Оба скрипта в своей работе используют перловую библиотеку CLI.pm, которая позволяет получить доступ к API Communigate Pro.
Для первого скрипта нам понадобится одна простая функция ListDomains, которая возвращает список доменов сервера.
Важной особенностью данного скрипта является необходимость возвращать ответ в JSON-формате. Я не захотел ставить отдельную JSON библиотеку для перла (JSON::DWIW, например), чтобы не плодить дополнительных зависимостей. Решил, что в данном случае средствами Perl вполне можно обойтись.
Основные возможности скрипта представлены в его хелпе:
discovery_cgp_domains [-h hostname] [-p port] -u username -w password
discovery_cgp_domains -h|--help
-h hostname - address of DNS name of the server (Default: localhost)
-p port - port for connection (Default: 106)
-u username - account on CGatePro with grant 'Can Modify All Domains and Accounts Settings'
-w password - user password
--help - print this help
--debug - show debug lines
Исходный код скрипта можно увидеть здесь.
Пример использования:
torwald@torwald-station:~/cgp_utility$ ./discovery_cgp_domains.pl -h cgp.server.org -u cgpmonitor -w password
{
"data":[
{"{#CGPDOMAIN}":"main.domain.org"},
{"{#CGPDOMAIN}":"support.domain.org"},
{"{#CGPDOMAIN}":"hosting.domain.org"}
]
}
Как мы видим, ответ содержит список объектов с одним атрибутом — "#CGPDOMAIN", каждый из которых представляет один домен на сервере. Название атрибута будет в дальнейшем использоваться при настройке LLD.
2. Скрипт для получения количества аккаунтов для домена.
Во второй скрипт добавляем еще одну функцию — ListAccounts(domain). Как понятно из названия, она возвращает список пользователей домена. Отдельной функции для получения количества пользователей в API CGP нет, поэтому я использую просто подсчет длины списка пользователей.
Кроме этого, скрипт умеет выполнять суммирование количества всех пользователей на сервере. Для этого его нужно вызвать с опцией -d TOTAL.
Все опции скрипта так же представлены в его хелпе:
count_cgp_account [-h hostname] [-p port] -u username -w password [-d domain]
count_cgp_account -h|--help
-h hostname - address of DNS name of the server (Default: localhost)
-p port - port for connection (Default: 106)
-u username - account on CGatePro with grant 'Can Modify All Domains and Accounts Settings'
-w password - user password
-d domain - domain name to count accounts; if you use -d TOTAL then you'll get number of all accounts on server
--help - print this help
--debug - show debug lines
Скрипт просто выводит количество пользователей на сервере. Пример работы:
# количество пользователей домена hosting.domain.org
torwald@torwald-station:~/cgp_utility$ ./count_cgp_account.pl -h cgp.server.org -u cgpmonitor -w password -d hosting.domain.org
6537
# общее число пользователей
torwald@torwald-station:~/cgp_utility$ ./count_cgp_account.pl -h cgp.server.org -u cgpmonitor -w password -d TOTAL
6559
# общее число пользователей - более простой вариант
torwald@torwald-station:~/cgp_utility$ ./count_cgp_account.pl -h cgp.server.org -u cgpmonitor -w password
6559
Исходный код лежит здесь же.
3. Размещаем скрипты на сервере
В данном случае все достаточно просто:
- Размещаем утилиту в /usr/local/bin (можно «отрезать» расширение) и даем права пользователю zabbix-агента (по умолчанию — zabbix) на запуск этой утилиты.
- Размещаем модуль CLI.pm там, где его будет «видно» интерпретатору Perl, запускаемому от имени zabbix. У меня это /usr/local/lib/perl5.
- В админском интерфейсе CGP cоздаем пользователя (например, cgpmon) с правами «Can Modify All Domains and Accounts Settings».
- Проверяем подключение из-под пользователя zabbix.
4. Настроить агент Zabbix
1. Добавляем в конфигурационный файл агента следующие настройки.
# /etc/zabbix_agentd.conf
# low-level discovery доменов Communigate
UserParameter=cgp.domains.discovery,/usr/local/bin/discovery_cgp_domains -u cgpmon -w password
# количество пользователей домена
UserParameter=cgp.domain.accounts.count[*],/usr/local/bin/check_cgp_queue -u cgpmon -w password -d $1
Подробнее про синтаксис работы с этим параметром и «звездочку», в частности, можно прочитать в документации.
Таким образом, теперь мы с помощью агента мониторинга можем получить список доменов и количество аккаунтов в этом домене.
2. Перезапускаем агента для того, чтобы новые настройки вступили в силу.
5. Настройка шаблона Zabbix
Для работы мониторинга аккаунтов я создал отдельный шаблон — Template Communigate Domains Info.
Группа элементов
Прежде всего следует в шаблоне создать Группу элементов данных. В моем случае это CGP.DomainsInfo. Это позволит все сгенерированные после LLD элементы данных собрать в одном месте.
Правило обнаружения
Открываем шаблон и переходим в Правила обнаружения, где создаем новое правило:
Обратите внимание на поле Макрос. В него мы пишем название атрибута "{#CGPDOMAIN}". Как мы помним, он содержится во всех объектах возвращаемых скриптом для получения списка доменов. И именно значение этого атрибута и будут использовать все наши прототипы (данных, триггеров и графиков). Часто выполнять LLD для серверов не стоит, достаточно одного раза в сутки. В моем случае, так их вообще можно было поставить на 1 раз в месяц.
Прототип элемента данных
После этих приготовлений переходим в Прототипы элементов данных и создаем новый прототип:
Здесь так же следует обратить внимание на использование строки "{#CGPDOMAIN}" в полях Имя и Ключ. При генерации новых элементов данных эта строка будет заменяться соответствующим именем домена. Так же следует не забыть указать созданную Группу элементов, иначе рискуем получить большой список «бездомных» элементов данных.
При желании можно прописать прототипы триггеров. Например, триггер создания и удаления аккаунтов.
Правило для общего количества пользователей
После создания всех прототипов в шаблон добавляем правило для мониторинга общего количества аккаунтов на сервере:
Шаблон для спешащих
Для спешащих готовый шаблон можно взять тут.
6. Добавляем узлы в шаблон
Здесь собственно ничего сложного или RTFM. После добавления ждем, когда отработает LLD, и получаем мониторинг числа пользователей.
Послесловие
Зачем этот мониторинг нужен, я, как уже говорил, не знаю. Пока что. Надеюсь, умные люди мне подскажут, что с этими данными можно делать.
Кроме того, такая реализация, в принципе не безопасна, т.к. мы должны хранить пароль к учетке Communigate с хорошими правами в конфиге. Но это в принципе можно обойти.
Так же почти ту же информацию, можно получить используя команды ОС.
Например, получить список доменов можно просто просканировав директорию Domains в директории Communigate'a.
А количество пользователей — рекурсивно подсчитать количество директорий вида username.macnt внутри домена.
Но в данном случае, я хотел показать, общий принцип того, как автоматически собирать какую-либо информацию с Communigate при помощи Zabbix. А как получить эти данные можно разными способами.
Автор: TorwaldSergesson