Отслеживание версии разрабатываемого продукта на множестве серверов

Отслеживание версии разрабатываемого продукта на множестве серверов

Постановка задачи 

Неободимо оперативно отслеживать работоспособность и актуальную версию продуктов, автоматизирующих бизнес процессы фармацевтических предприятий.

Условия выполнения

  • Серверная платформа разрабатываемых продуктов - Windows Server
  • Контролируемые продукты - Cleverence, Pharm-X
  • Размещение серверов - DMZ зоны клиентов и облако Pharm-X

Инструменты

  • Kaseya VSA
  • Powershell
  • PHP

Реализация

Мониторинг работоспособности и версии Pharm-X

Платформа Pharm-X отвечает номером версии на сетевой запрос по TCP протоколу по url http://<server>:<port>/ver
Если платформа отвечает и выдает версию, то считаем, что система работает и номер версии в ответе сохраним в расширенное поле Kaseya VSA. Если система не отвечает, то в значение версии запишем слово "down" что будет интерпретировано DashBoard таким образом, чтобы первая линия поддержки получила первичную информацию о неработоспособности Pharm-X.

Последовательность отслеживания работоспособности и версии продукта

  1. На сервер выгрузим в технологический каталог скрипт PowerShell, который выполняет запросы номера версии на все установленные экземпляры Pharm-X
  2. Запускаем скрипт PowerShell на выполнение c передачей в качестве параметра списком портов, на которых отвечают экземпляры Pharm-X 
  3. Сохраняем возращаемую строку с версиями Pharm-X в специально созданные поля Kaseya VSA
  4. Обрабатываем результаты и выводим на DashBoard в удобном для понимания и быстрой реакции на события виде для первой линии поддержки

Скрипт PowerShell, выполняющий запрос к экземплярам Pharm-X

Текст программы на PowerShell:

# В переменную $divchar запишем символ, который будет использован в качестве разделителя в списке TCP портов
# на которых отвечает Pharm-X
$divchar = ","
# В переменную $scriptPath запросим текущее расположение скрипта
$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition
# Проверим количество передаваемых аргументов.
if($args.Count -gt 0)
{
# Если список портов был передан в качестве аргумента, то создадим массив строк с номерами портов,
# на которых отвечает Pharm-X
    $portArray = $args[0].Split($divchar)
}
else
{
# Если скрипту не были переданы аргументы, то по умолчанию примем, что на сервере один экземпляр Pharm-X,
# который отвечает на TCP порту по умолчанию
    $portArray[0] = "12345"
}

# Инициируем строку с возвращаемыми версиями Pharm-X
$PHXVersions = ""
# Для каждого элемента массива TCP портов на которых отвечает Pharm-X выполним опрос
foreach($port in $portArray)
{
# Создадим uri запроса и передадим его в переменную $uri
    $uri = "http://127.0.0.1:" + $port + "/ver"
# Проверим доступность информационной службы Pharm-X
    $connection = Test-NetConnection -ComputerName "localhost" -Port $port
    if ($connection.TcpTestSucceeded)
    {
# Если информационная служба Pharm-X доступна, то выполним запрос версии
        $WebResponseObj = Invoke-WebRequest -Uri $uri -UseBasicParsing -EA SilentlyContinue
# Сохраним версию в переменной $PHXVersion
        $PHXVersion = $WebResponseObj.Content
    }
    else
    {
# Если сервис не ответил, то в качестве версии запишем ключевое слово "down"
        $PHXVersion = "down"
    }
# Проверим - является ли сохраняемая версия первой в строке возврата
        if ($PHXVersions.Length -gt 1)
        {
# Если это не первая запись, то добавим результат через символ разделитель
            $PHXVersions = $PHXVersions + $divchar + $PHXVersion
} else { # Если результат первый, то добавим его без символа разделителя $PHXVersions = $PHXVersions + $PHXVersion } } # Возвратим результирующую строку в стандартный вывод $PHXVersions # Очистим файл с результатами от предыдущих значений Clear-Content "$scriptPath\results.txt" # Запишем в файл результатов значения версий add-content -path "$scriptPath\results.txt" -value $PHXVersions

Переменная для сохранения результата

Полученный результат необходимо сохранить. Для этого создадим переменную в разделе Audit > View Individual Data > Machine Summary
В этом разделе выбираем пункт New Custom Field

И создаем новую переменную. Дадим ей имя PHX-Ver (вресия Pharm-X). В этой переменной будем сохранять результат полученной версии.

Для того, чтобы хранить TCP порты на которых отвечает Pharm-X создадим переменную с именем PHX-Ports.

В переменную PHX-Ports внесем номера портов через запятую:

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

Процедура установки PowerShell скрипта и запуска на выполнение и сохранения результатов

 Создадим процедуру, которая будет выполнять следующие действия:
  • Проверять наличие скрипта, если его нет, то записывать из репозитария
  • Запускать скрипт и передавать ему список портов из переменной PHX-Ports
  • Получать результат работы программы и публиковать его в переменной PHX-Ver
Скрипт выглядит так:

Создаем расписание выполнения

Необходимо создать расписание по которому опрашиваем версию продукта. Для этого выбираем сервера на которых будем опрашивать версию и назначаем выполнение по расписанию:

Запускаться скрипт будет каждые 5 минут, окно выполнения (время начала на первой машине и окончания на последней из списка) зададим 1 минута. Мы не проггнозируем даты окончания мониторинга, поэтому не будем задавать его. Также нам не нужно накапливать данное задание на выполнение после включений, поэтому поставим  пометку, чтобы задание не запускалось на выключенной машине.
Задание на выполнение создано. Теперь распространим данное расписание на выполнение через политику на группу компьютеров клиентов, где расположен Pharm-X:


С этого момента на всех компьютерах с установленным Pharm-X будет запускаться скрипт, который определит версию установленной программы и публиковать эту версию в созданное поле агента:

Теперь данное поле доступно через REST API и на основе этого строим информационную панель для первой линии поддержки:

01.08.2020

Возврат к списку