понедельник, 22 июля 2019 г.

zabbix и powershell. Проверка данных из файла

Дано:
Есть проприетарный софт Trassir (сервер видеонаблюдения) в котором лицензирование настроено через файл license.txt, находящийся в папке с программой.
Сервер видеонаблюдения windows server - trsprm
Сервер zabbix - zabbix 4.0

Задача:
Необходимо настроить оповещение о заканчивающейся лицензии в zabbix мониторинге


Решение:
Для решения поставленной задачи воспользуемся powershell. Разделим задачу на подпункты

1) Написать скрипт который будет отсчитывать дни от нынешней даты до истечения лицении в отдельный файл
2) Научить zabbix agent передавать данные в мониторинг эту информацию
3) Настроить тригер zabbix на срабатывание, если лицензии осталось меньше чем на 2 дня.





1) Скрипт напишем на powershell, я не знаток его, потому он достаточно грубый и без явного рефакторинга, возможно для конкретно вашей ситуации, кое что нужно будет изменить.

В двух словах что делает скрипт:
 читает файл Trassir 3 License.txt записывает дату истечения лицензии в временный файл, отнимает от нынешней даты, дату указанную в временном файле

#подсчет времени до истечения лицензии из файла Trassir 3 License.txt. Без рефакторинга.

#lic - путь до файла лицензии
$lic = "C:\DSSL\Trassir-4.0-service\Trassir 3 License.txt"
#пути до временных файлов. Их можно не создавать.
$path = "C:\DSSL\Trassir-4.0-service\tmp.txt"
$end = "C:\DSSL\Trassir-4.0-service\end.txt"

#Проверяем есть ли временные файлы, если нет - создаем.
If(!(test-path $path))
{
New-Item -ItemType file -Force -Path $path
}
If(!(test-path $end))
{
New-Item -ItemType file -Force -Path $end
}

#очищаем от старых данных
clear-content $path
clear-content $end

#читаем 7 строку файла лицензии и записываем в переменную $Expires 
$Expires = (Get-Content $lic )[6]

#если строка не пустая, записываем дату
if ($Expires)
{
#убираем лишнее значение [Expires:] из переменной
$Expires = $Expires  -split "[Expires:]"
$Expires = $Expires.Trim()

#записываем дату истечения лицензии в tmp.txt
Add-Content -Value "$Expires" -Path $path

#Записываем нынешнюю дату в переменную в нужном формате
$Date = Get-Date -Format d

#удаляем лишние пробелы в файле
$Expires = $Expires -replace '\s',''

#Преобразовываем значения в DateTime
$Expires = (Get-Content $path)

#Высчитываем сколько осталось дней до истечения
$ts = New-TimeSpan -Start $Date -End $Expires
$ts.Days # Check results
#Удаляем время из даты $ts
$ts = $ts  -split "[.00:00:00]"
$ts = $ts.Trim()
Add-Content -Value "$ts" -Path $end
}
#если строка пустая, пишем, что лицензия бессрочная
else
{
$Expires = "unlimited license"
Add-Content -Value "$Expires" -Path $end
Get-Content $end
}

Exit

Сохраняем этот файл по пути C:\DSSL\Trassir-4.0-service\lic.ps1 на сервере trsprm

Запускаем его и убеждаемся, что в папке C:\DSSL\Trassir-4.0-service\ создалось два файла
 tmp.txt - записанная дата окончания лицензии
 end.txt - кол-во дней оставшихся до окончания лицензии


2) Идем в zabbix agent C:\Program Files\Zabbix Agent на сервере trsprm и создаем там файл lic.bat:

 @echo off
for /f "usebackq tokens=*" %%a in ("C:\DSSL\Trassir-4.0-service\end.txt") do (echo %%~a)
cmd
Тут мы просим скрипт прочитать содержимое файла end.txt, в котором указано оставшееся кол-во дней.

Открываем конфиг zabbix агента C:\Program Files\Zabbix Agent\zabbix_agentd.conf
и в самом низу дописываем:

UserParameter=lic, "C:\Program Files\Zabbix Agent\lic.bat"
При попытке выполнить скрипт из консоли, должно возвращаться значение записанное в файле end.txt


Т.е., у нас есть скрипт lic.ps1, который считает и записывает оставшиеся дни до окончания лицензии и есть скрипт lic.bat, который выполняется заббикс агентом и передает полученный параметр на сервер

3) Настраиваем заббикс-сервер

Идем в админку, Настройка - Узлы сети. Выбираем на сервере trsprm - Элементы данных - Создать


Главное указать Ключ, такой же как мы записали в zabbix_agentd.conf (UserParameter=lic)

По такому же принципу создаём тригер:


В выражении прописываем: {Trassir-server:lic.last()}=2 
Вместо Trassir-server укажите название вашего сервера заведенного в zabbix. В моем случае это ссылка на элемент данных нескольких серверов.

Комментариев нет:

Отправить комментарий