27

Создание Low-Level Discovery в Zabbix с использованием PowerShell.

Иногда нужно настроить мониторинг каких-либо объектов на серверах, которые могут изменятся, например IIS сайты\пулы, размеры файлов, размеры кластерных дисков, базы данных и прочее. Для получения самих значений можно использовать встроннее метрики, например Performance Monitor в Windows Server, либо же скрипты\запросы, которые их получают.

Трудности доставляют сами изменяющиеся объекты, которые могут добавлятся\убираться, и каждый раз ручками конфигурировать итемы на хостах как-то не хочется. Вот тут нам поможет Low-level discovery (LLD).


К примеру у вас есть сервер, на котором крутятся сайты, которые ваши разработчки с некой переодичностью добавляют\удаляют. Задача мониторить количество коннекций к сайту, количество get/head/post запросов, статус апликейшн пулов (запущен или нет).


Поскольку я Виндовый админ, то будем использовать PowerShell, но по такому же принципу можно написать на любом языке.


И так для создания нового LLD нужен скрипт,а даже 2, которые будет получать список сайтов и список пулов, конвертировать его в JSON формат и предоставлять Заббиксу.


Выглядит готовый JSON так:

{

"data":[

{ "{#SITE}" : "site1" },

{ "{#SITE}" : "site2" },

{ "{#SITE}" : "site3" }

]

}


А потом уже заббикс для каждого из объектов будет получать данные параметров, для сайтов используя запоросы в Performance Monitor, для пулов - скрипт.


Получать список объектов можно любым скриптом, главное что бы заббикс агент его смог запустить.


И так создаём фаил с названием get-sites.ps1

Получаем список сайтов на сервере:

Import-Module WebAdministration

$sites = Get-ChildItem -Path IIS:\Sites -Name


Если вы тестите то для вывода результата введите $sites

Теперь весь список нужно представить в JSON формате, особенностью является то что в конце последнего значения объекта, не должна стоять запятая.

По этому вводим переменную $idx по которой мы будем проверять последний это объект или нет.

$idx = 1


Далее делаем шапку JSON:

write-host "{"

write-host " `"data`":[`n"


Далее будем каждый объект полученный ранее проверят последний он или нет.

Сверку будем проводить путем увеличения переменной $idx на 1, после создания каждого JSON объекта.

Если нет, то создаём JSON объект с запятой, если да, то создаём без запятой.

foreach ($currentsite in $sites) #каждый сайт из списка будет получать переменную $currentsite

{

if ($idx -lt $sites.count) #сравниваем $idx с количеством сайтов. -lt - меньше чем. Если получаем True то создаём строчку с запятой, если нет то двигаемся дальше.

{

$line= "{ `"{#SITE}`" : `"" + $currentsite + "`" }," # создание строчки с запятой

write-host $line

}

elseif ($idx -ge $site.count) # здесь опять сравниваем $idx с количеством с сайтов. -ge - больше или равно чем. Если True то создаём строчку без запятой

{

$line= "{ `"{#SITE}`" : `"" + $currentsite + "`" }" #строчка без запятой

write-host $line

}

$idx++; #В конце каждого прохода увеличиваем $idx на 1.

}

Ну и закрываем JSON.

write-host

write-host " ]"

write-host "}"


Логика проста: Получаем список сайтов, например 3 сайта. Значит нужно 3 прохода для создания 3 строчек для JSON.

Первый проход первый сайт. $idx=1. 1<3? Да. Создаём с запятой. Увеличиваем $idx на 1.

Второй проход второй сайт. $idx=2 . 2<3? Да. Создаём с запятой. Увеличиваем $idx на 1.

Третий проход третий сайт. $idx=3. 3<3? Нет. Идем дальше. 3>=3? Да. Создаём без запятой.


Таким же образом создаём скрипт get-apppool.ps1 для получения списка пулов:

Import-Module WebAdministration

$apppool = Get-ChildItem -Path IIS:\Apppools -Name

$idx = 1

write-host "{"

write-host " `"data`":[`n"

foreach ($currentapppool in $apppool)

{

if ($idx -lt $apppool.count)

{

$line= "{ `"{#APPPOOL}`" : `"" + $currentapppool + "`" },"

write-host $line

}

elseif ($idx -ge $apppool.count)

{

$line= "{ `"{#APPPOOL}`" : `"" + $currentapppool + "`" }"

write-host $line

}

$idx++;

}

write-host

write-host " ]"

write-host "}"


Далее оба скрипта кладем на сервер, например туда где стоит заббикс агент и в конфиг агента добавляем 2 юзер параметра:

UserParameter=apppool.discovery,powershell -NoProfile -ExecutionPolicy Bypass -File "C:\Program Files\Zabbix_agent\scripts\get-apppool.ps1"

UserParameter=site.discovery,powershell -NoProfile -ExecutionPolicy Bypass -File "C:\Program Files\Zabbix_agent\scripts\get_sites.ps1"


(Если честно, то не помню, нужно ли включать ActiveChecks и EnableRemoteCommands в конфиге. У меня везде включено.)


apppool.discovery и site.discovery - будут использиваться как ключи при создании LLD для запуска соответсвующих скриптов.


Далее в Заббиксе нашего сервера создаём новый дискавери:

Name: IIS Site #Название дискавери

Type: Zabbix agent #то чем будем делать дискавери

Key: site.discovery #ключ для вызова скрипта с получем списка сайтов. Мы его указали в UserParameter в конфиге агента на сервере

Host interface: айпишка и порт агент на сервере

Update interval (in sec): 3600 #как часто будем вызывать скрипт и получать список сайтов

Keep lost resources period (in days):3 #через сколько удалять сайтов, которых больше нет.


В фильтрах можно указать какие сайты исключить из списка.

Label Macro {#SITE} Regular expression @IIS

Сам список IIS создаётся в Administration > general > Regular Expresssions.

Например можно исключить Default Web Site для этого создаём список IIS и добавляем Expression type: Result is False; Expression: Default Web Site


Далее создаём прототипы айтемов в дискавери. Они практически ничем не будут отличаться от создания обычных айтемов. Только для объявления сайта используем {#SITE}


Например количество коннекций к IIS сайту. Данные получаем с Performance monitor:

Name: {#SITE}: Current connections

Type: Zabbix agent

Key: perf_counter[\Web Service({#SITE})\Current Connections]

Type of information: Numeric (unsigned)


Прежде чем создавать дискавеи для пулов, нужно создать скрипт, который будет получать статус пула.


Создаём PowerShell скрипт get-apppoolstate.ps1

param ([string] $name = 0)

Import-Module WebAdministration

$apppoolState = Get-WebAppPoolState -name "$name"

Write-Output ($apppoolState.value)


Сохраняем и кладем к агенту, туда куда и прошлые скрипты. Добавляем UserParameter в конфиг:


UserParameter=apppool.state[*],powershell -NoProfile -ExecutionPolicy Bypass -File "C:\Program Files\Zabbix_agent\scripts\get_apppoolstate.ps1" "$1"


apppool.state - ключ для вызова скрипта.

[*] - параметр который мы будем передавать вместе с ключем, в нашем случае имя пула

$1 означает что мы будем передавать имя пула в скрипт, внутри скрипта имя пула пойдет в параметр $name


Теперь создаём дискавери для мониторинга апликейшн пулов создаём новый дискавери.

Name: IIS AppPool

Type: Zabbix agent

Key: apppool.discovery

Остальное как для сайта.


Создаём прототип айтема:

Name:IIS AppPool {#APPPOOL} state

Type:Zabbix agent

Key:apppool.state[{#APPPOOL}]

Type of information: Text


Ну и все, дальше можно настроить триггеры для обоих дискавери.

Например что пул не запущен:

Name: IIS AppPool {#APPPOOL} is down

Severity: Disaster

Expression: {MyWebServer:apppool.state[{#APPPOOL}].str(Stopped)}<>0

Лига Сисадминов

2.2K постов18.8K подписчика

Правила сообщества

Мы здесь рады любым постам связанным с рабочими буднями специалистов нашей сферы деятельности.