Как быстро обновить много серверов 1С

от автора

В основном проблема обновления платформы 1С стоит для клиентской части. Клиентских компьютеров может быть десятки и сотни, в то время как серверов на порядки меньше. У нас проблема обновления клиентских машин не стоит, клиенты запускаются на VDI, а там обновление сводится к установке на одной виртуальной машине и ее клонировании.

После победы над клиентами хочется разобраться с серверной частью. В интернете есть достаточное количество статей на тему, как обновить платформу 1С на клиентских машинах.

С серверной частью все ПОЧТИ тоже самое. Вот про это ПОЧТИ и хочу рассказать.

У нас для серверов 1С используется Windows, поэтому все, что написано далее относится только к установке 1С на Windows.

Обновление серверной части, состоит из нескольких действий:

  • Установка платформы 1С на сервере

  • Регистрация компонентов, таких как COM и консоль администрирования

  • Обновление пути к компоненте wsisapi.dll в конфигурационных файлах веб-сервера, в нашем случае IIS.

Отдельный вопрос — выбор среды для запуска языка и среды запуска скриптов. Нам хотелось как можно меньше использовать чего-то нового, поэтому выбор пал на то, что уже есть везде —  PowerShell. У нас есть своя система для учета серверов и какие сервисы на них должны быть запущены. Из нее создаются индивидуальные скрипты для каждого сервера, которые запускаются из единого места.

$session = New-PSSession -ComputerName [Сервер]; Invoke-Command  -Session $session -ScriptBlock {[Скрипт]} ; Remove-PSSession $session

Побеждаем установку сервера

Суть всей установки сводится к запуску 1CEnterprise 8 (x86-64).msi с параметрами, которые есть в документации:

  • DESIGNERALLCLIENTS — все виды клиентов

  • THICKCLIENT – толстый клиент (в том числе позволяет запускать конфигуратор)

  • THINCLIENT – тонкий клиент для клиент-серверного варианта работы.

  • THINCLIENTFILE – тонкий клиент с возможностью работы с файловыми информационными базами

  • SERVER – серверная часть 1С

  • WEBSERVEREXT – компоненты расширения для веб-сервера

  • CONFREPOSSERVER – сервер хранилища конфигураций

  • SERVERCLIENT – компоненты для администрирования кластера серверов

  • CONVERTER77 – конвертер информационных баз из версии 1С:Предприятия 7.7

  • LANGUAGES – список языков интерфейса для установки через запятую

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

msiexec /i “C:\LastVersion\1CEnterprise 8 (x86-64).msi”    /qn  TRANSFORMS=adminstallrestart.mst;1049.mst DESIGNERALLCLIENTS=1  THICKCLIENT=0 THINCLIENTFILE=0 THINCLIENT=0 WEBSERVEREXT=1 SERVER=1 CONFREPOSSERVER=0 CONVERTER77=0 SERVERCLIENT=1 LANGUAGES=RU  

И вот здесь начинаются проблемы. При установке серверной части происходит регистрация сервиса и его запуск. При этом, такие параметры запуска, как каталог файлов сервера, пользователь под которым будет работать служба сервера указать невозможно. Это приводит к тому, что настроенные в реестре параметры запуска службы сервера будут перезаписаны на значения по умолчанию. Мы попробовали два подхода к устранению этой неприятности:

Подход 1: Не будем регистрировать и запускать сервис

Попробуем отключить регистрацию и запуск сервиса. Регистрацию и запуск сделаем отдельными скриптами. Стандартных параметров запуска недостаточно. Давайте поменяем саму программу установки. Качаем Windows SDK и устанавливаем Orca. Открываем нашего пациента 1CEnterprise 8 (x86-64).msi и, посмотрев на таблицу InstallExecuteSequence, видим, что многие действия, в том числе и запуск сервиса, зависят от параметра INSTALLSRVRASSRVC. Скорее всего его установка в «0» и поможет нам отказаться от регистрации и запуска сервиса. Поиском ищем, где же он устанавливается. Установка значения нашлась в таблице CustomAction в действии customSetSrvrAsService. Меняем Target на 0 и сохраняем наш файл трансформации DoNotRegister.mst.

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

msiexec /i "C:\LastVersion\1CEnterprise 8 (x86-64).msi" /qr  TRANSFORMS=adminstallrelogon.mst;1049.mst;DoNotRegister.mst DESIGNERALLCLIENTS=1  THICKCLIENT=0 THINCLIENTFILE=0 THINCLIENT=0 WEBSERVEREXT=1 SERVER=1 CONFREPOSSERVER=0 CONVERTER77=0 SERVERCLIENT=1 LANGUAGES=RU

Далее необходимо только сменить путь к агенту сервера (C:\Program Files\1cv8\8.3.xx.xxxx\bin\ragent.exe) в реестре.

Подход 2: Пусть все будет стерто, настроим заново

Второй рассмотренный путь — пусть реестр будет перезаписан — отдельными скриптами настроим его заново. Мы в результате выбрали этот путь, так как хотели и новую установку на новый сервер тоже делать скриптами. Все наши настройки при установке сносятся, но мы их восстанавливаем.

$1cversion   = "[ВерсияПлатформы]" $PathToBin   = 'C:\Program Files\1cv8\'+$1cversion+'\Bin' $port        = 1540 $regport     = 1541 $range       = "1560:1591" $HomeCat     = "[ПутьКsrvinfo]" $PathToBin   = "$PathToBin\ragent.exe" $SrvcName    = "1C:Enterprise 8.3 Server Agent (x86-64)" $ImagePath   = "`"$PathToBin`" -srvc -agent -regport $regport -port $port -range $range -debug -d `"$HomeCat`"" $Desctiption = "Агент сервера 1С:Предприятия 8.3"  $username    = "[Пользователь]" $password    = "[Пароль]"  $secureStringPwd = $password | ConvertTo-SecureString -AsPlainText -Force  $creds = New-Object System.Management.Automation.PSCredential -ArgumentList $username, $secureStringPwd          $allServices1C = Get-WmiObject win32_service | ?{$_.Name -like '*'} |Select Name, DisplayName, State, PathName | Where-Object { $_.PathName  -Like "*ragent.exe*" };     $m = $allServices1C | measure     $m.Count     if ($m.Count -gt 0) {            $allServices1C | % {                 $services1C      = $_;                 $serviceExecPath = $services1C.PathName;                 $serviceName     = $services1C.name;                 $serviceExecPathRagent = $services1C.PathName.split('"')[1];                 $platformVersion = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($serviceExecPathRagent).FileVersion                 $NewPath = $services1C.PathName -replace $platformVersion,$1cversion                 Write-Host "Найдена уже установленная служба агента 1с $serviceName"                 try                          {                             if ($services1C.State -eq "Running"){Write-host "Останавливаем сервис $serviceName"; Stop-Service -Name $serviceName -Force}                             Write-host "Меняем path службы на $NewPath"                             Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Services\$serviceName" -Name ImagePath -Value "$NewPath"                              Write-Host "Запускаем сервис $serviceName "                              Start-Service -Name $serviceName                               sleep(10)                              if ($services1C.State -eq "Running") { Write-host "Сервис запущен успешно"; write-host "ErrCode 0"}                              else { Write-Host "Сервис $serviceName не запустился!" ;Write-Host "ErrCode 1"}                                                  }catch                          {                             Write-Host "Ошибка при изменении службы $serviceName" -ForegroundColor Red                             Write-Host "Подробно:" -ForegroundColor Red                             Write-Host $Error[0] -ForegroundColor Red                             Write-Host "ErrCode 1"                         } }     }     else {       Write-Host "Устанавливаем службу 1С $SrvcName"      try{         New-Service -Name $SrvcName -BinaryPathName $ImagePath -Description $Desctiption -DisplayName $Desctiption -StartupType Automatic -Credential $creds          Start-Service -Name $serviceName;         Write-Host "Сервис $SrvcName зарегистрирован и запущен!" -ForegroundColor Green         Write-Host "ErrCode 0"       } catch {      Write-Host "Ошибка при регистрации компоненты!" -ForegroundColor Red         Write-Host "Подробно:" -ForegroundColor Red         Write-Host $Error[0] -ForegroundColor Red         Write-Host "ErrCode 1" -ForegroundColor Red     }          } 

Регистрация COM и консоли администрирования

Это самые простые действия. Для регистрации COM Запускаем
regsvr32 /n /i:user «C:\Program Files\1cv8\8.3.xx.xxxx\bin\comcntr.dll» на PowerShell наш скрипт выглядит так:

$allServices1C = Get-WmiObject win32_service | ?{$_.Name -like '*'} |     Select Name, DisplayName, State, PathName |      Where-Object { $_.PathName  -Like "*ragent.exe*" };  $allServices1C | % {          $services1C = $_;     $serviceExecPath = $services1C.PathName;     $serviceExecPathRagent = $services1C.PathName.split('"')[1];      $serviceDirectory = [System.IO.Path]::GetDirectoryName($serviceExecPathRagent);     $comcntrPath        = "$serviceDirectory\comcntr.dll";     $regCommand       = "regsvr32.exe /s ""$comcntrPath""";     $platformVersion  = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($serviceExecPathRagent).FileVersion      Write-Host "Начало регистрации COM-компоненты 1С:Предприятия";     Write-Host "Версия платформы: $platformVersion";     Write-Host "Путь к DLL: ""$comcntrPath""";     Write-Host "Команда регистрации компоненты: ""$regCommand""";      try     {         cmd /c "$regCommand"         Write-Host "Регистрация компоненты успешно выполнена!" -ForegroundColor Green         Write-Host "ErrCode 0"     } catch     {         Write-Host "Ошибка при регистрации компоненты!" -ForegroundColor Red         Write-Host "Подробно:" -ForegroundColor Red         Write-Host "ErrCode 1" -ForegroundColor Red     } } 

Для регистрации консоли
regsvr32 /n /i:user «C:\Program Files\1cv8\8.3.xx.xxxx\bin\radmin.dll» на PowerShell наш скрипт выглядит так:

$allServices1C = Get-WmiObject win32_service | ?{$_.Name -like '*'} |     Select Name, DisplayName, State, PathName |      Where-Object { $_.PathName  -Like "*ragent.exe*" };  $allServices1C | % {          $services1C = $_;     $serviceExecPath = $services1C.PathName;     $serviceExecPathRagent = $services1C.PathName.split('"')[1];      $serviceDirectory = [System.IO.Path]::GetDirectoryName($serviceExecPathRagent);     $radminPath      = "$serviceDirectory\radmin.dll";     $regCommand       = "regsvr32.exe /s ""$radminPath""";     $platformVersion  = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($serviceExecPathRagent).FileVersion      Write-Host "Начало регистрации COM-компоненты 1С:Предприятия";     Write-Host "Версия платформы: $platformVersion";     Write-Host "Путь к DLL: ""$radminPath""";     Write-Host "Команда регистрации компоненты: ""$regCommand""";      try     {         cmd /c "$regCommand"         Write-Host "Регистрация компоненты успешно выполнена!" -ForegroundColor Green         Write-Host "ErrCode 0"     } catch     {         Write-Host "Ошибка при регистрации компоненты!" -ForegroundColor Red         Write-Host "Подробно:" -ForegroundColor Red         Write-Host "ErrCode 1" -ForegroundColor Red     } } 

Обновление пути к компоненте wsisapi.dll

 Данное действие тоже достаточно простое, настройка веб публикации 1С систем сводится созданию в IIS приложения состоящего default.vrd и конфигурированием Handler mappings. С последним возникают тонкости. Настройки могут быть заданы как на уровне приложения, так и на уровне сайта или сервера в целом. Мы пошли по наиболее простому пути. В последних версиях платформы 1С утилита публикации (создания приложений) создает конфигурацию на уровне приложения. Так как публикации рождаются и изменяются регулярно в процессе развития систем, то чтобы не наступить на грабли, что в разных местах у нас разные настройки, решили остановиться на одном варианте. Конфигурационный файл web.config должен быть у каждого приложения. Мы проверили все наши публикации и там, где отсутствовал конфигурационный файл, создали его. Теперь в каждой директории приложения имелся файл web.config и задача свелась к замене версии платформы в строке:

scriptProcessor="C:\Program Files\1cv8\8.3.xx.xxxx\bin\wsisapi.dll" Что мы делаем скриптом: $result = Get-ChildItem -Path "[АдресПапкиСПубликациями]" -Recurse -ErrorAction SilentlyContinue -Include "web.config" $1cUpdateV = "[ВерсияПлатформы]" foreach($f in $result) {     $fullname = $f.fullname     $Text = Get-Content $f.FullName -raw      $pattern = "(?:C:\\Program Files\\1cv8\\)(?<version>\d+\.\d+\.\d+\.\d+)(?:\\bin\\wsisapi\.dll)"     $te = $Text -match $pattern      if ($Matches.Count -ne 0) {          $1cVersionold = $Matches["version"]        if ($1cVersionold -ne $Version1c) {         $replaceText = $Text -replace "$1cVersionold","$1cUpdateV"         Set-Content -Path $fullname -Value $replaceText            Write-Host "файл $fullname изменен версия платформы старая $1cVersionold новая $1cUpdateV"        } else { Write-Host "файл $fullname не изменен. Версии совпадают"}                }  } Write-Host "ErrCode 0" 

Надеюсь, этот материал оказался полезным для вас. А как вы решаете проблему обновления нескольких серверов 1С? Делитесь вашими know-how в комментариях.


ссылка на оригинал статьи https://habr.com/ru/articles/583678/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *