Автоматизация смены версии базы Cleverence на серверах
11.06.2020Постановка задачи
Выполнять перевод определенных серверов Cleverence на другой продуктНачальные условия
- Под управлением находится несколько серверов с установленным решением для автоматизации управления складом - Mobile Smarts (далее по тексту Cleverence)
- Количество серверов постоянно увеличивается
- Сервера Cleverence должны иметь группировку по типу установленного продукта
- Вновь вводимые сервера должны быть автоматически обновлены до определенной конфигурации в зависимости от группы компьютеров
- Версия и тип базы должны контролироваться автоматически
Инструменты для выполнения задачи
- Kaseya - Система удаленного управления ИТ инфраструктурой
- PowerShell - расширяемое средство автоматизации от Microsoft с открытым исходным кодом
Последовательность действий по переводу, описанная разработчиком Cleverence
Команда разработки Cleverence предложила выполнить задачу обновления базы по такому сценарию:- Остановить сервер Cleverence
- Взять полную базу нового продукта в качестве источника данных
- Сделать копию работающей базы данных
- Переписать файл описания базы AppDescription.xml из новой базы по пути C:\ProgramData\Cleverence\Базы Mobile SMARTS\[ Версия базы PharmX, Полный]\
- "Переписать файл конфигурации Cleverence.Warehouse.Environment.xml" по пути C:\ProgramData\Cleverence\Базы Mobile SMARTS\[ Версия базы PharmX, Полный]\Documents\
- Удалить старые файлы лицензий по пути C:\ProgramData\Cleverence\Базы Mobile SMARTS\[ Версия базы PharmX, Полный]\Licenses
- Удалить старые файлы лицензий по пути C:\ProgramData\Cleverence\Licenses
- Запустить сервер
- Проверить смену лицензии запустить менеджер лицензирования
- Проверить новое лицензирование на ТСД
Задача усложнялась тем, что на серверах установлено несколько баз данных и каждая в своем каталоге. Изменения необходимо внести в ту, которая отвечает на определенном порту TCP. Список портов занесен в дополнительные поля свойств объекта. Эти данные будем использовать для создания автоматизации обновления.
План выполнения
Автоматически выполнить данный план мы сможем для первых 8-ми пунктов. Последние 2 пункта будет выполнять человек по инструкции.Каждый из шагов может выполняться в своим инструментом, поэтому в пунктах добавлен инструмент, выполняющий действие.
- Останавливаем все приложения, которые могут работать с базой. (Kaseya)
- Останавливаем сервер Cldeverence, для этого остановим службу Mobilesmartsserver. (Kaseya)
- Переписываем архив с новой базой на сервер. (Kaseya)
- Распаковываем его. (Kaseya)
- Удаляем архив. (Kaseya)
- Переписываем скрипт PowerShell на сервер. (Kaseya)
- Передаем номер TCP порта Cleverence для идентификации базы, которую необходимо обновить. (Kaseya)
- Выполняем резервное копирование базы Cleverence. (Kaseya)
- Запускаем выполнение PowerShell. (Kaseya)
- Получаем номер порта, переданный скрипту через текстовый файл. (PowerShell)
- Находим базу, которая соответствует номеру порта. Для этого открываем конфигурации баз и в XML находим поле, соответствующее записи номера порта и сравниваем его с заданным. (PowerShell)
- Очищаем лицензии в найденной базе. (PowerShell)
- Переписываем конфигурационные файлы. (PowerShell)
- Восстанавливаем работу Cleverence. (Kaseya)
Результаты работы
Созданную процедуру Kaseya запускаем на серверах по мере готовности стороны к началу технологических работ. Среднее время выполнения 1-2 минуты. Результат выполнения отслеживается в окне управления процедурами агента Kaseya:Процедура Kaseya
Шаги, выполняемые в процедуре описаны в плане выполнения. Сама процедура выглядит так:Скрипт PowerShell
Скрипт выполняется в папке, где распакована новая версия и находится текстовый файл с номером порта.Текст скрипта
# Создадим переменную с путем к базам Cleverence
$clevPath = "C:\ProgramData\Cleverence\Базы Mobile SMARTS\"
# Создадим переменную с символом разделителем в списке портов
$divchar = ","
# Проверим существование каталога
if (Test-Path -Path $clevPath)
{
# Загрузим все доступные базы данных в виде списка каталогов
$cleverenceDBs = Get-ChildItem -Directory -Path $clevPath -Force
# Получим путь, где расположен скрипт
$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition
# Создадим переменную с путем к файлу со списком портов на которых работает CLeverence
$CleverencePortFilePath = "$scriptPath\port.txt"
# Проверим наличие файла со списком портов
if(Test-Path -Path $CleverencePortFilePath)
{
# Считаем строку с портами
$portsString = Get-Content $CleverencePortFilePath
# Разделим строку на массив со строками номеров портов
$portArray = $portsString.Split($divchar)
else
{
# Если файл со списком портов не найден, то назначим массив с одним элементом с портом по умолчанию
$portArray[0] = "9002"
}
foreach($cleverencePort in $portArray)
{
$currentDBport='port="' + $cleverencePort + '"'
$CleverenceDBVersion="Not found"
foreach ($cleverenceDB in $cleverenceDBs)
{
$fileServerConf = $clevPath + $cleverenceDB.Name + "\settings.xml"
if (Test-Path -PathType Leaf -Path $fileServerConf)
{
$fileServerConfContent= Get-Content($fileServerConf)
if($fileServerConfContent -match $currentDBport)
{
# Start changes
# Remove old licenses
Remove-item C:\ProgramData\Cleverence\Licenses\*.xml
$CleverenceDBPath = $clevPath + $cleverenceDB.Name
$DelLicenses = $CleverenceDBPath + "\Licenses\*.xml" Remove-item $DelLicenses
# Переписать файл описания базы
Copy-Item -Path "$scriptPath\PharmXDB\AppDescription.xml" -Destination "$CleverenceDBPath\AppDescription.xml"
Copy-Item -Path "$scriptPath\PharmXDB\WinClient\Documents\Cleverence.Warehouse.Environment.xml" -Destination "$CleverenceDBPath\Documents\Cleverence.Warehouse.Environment.xml"
Copy-Item -Path "$scriptPath\PharmXDB\WinClient\Documents\Cleverence.Warehouse.Environment.xml" -Destination "$CleverenceDBPath\WinClient\Documents\Cleverence.Warehouse.Environment.xml"
}
}
}
}
}