Установка платформы 1С на несколько терминальных серверов в AD

Установка платформы 1С на несколько терминальных серверов в AD

Всякий раз при обновлении платформы 1С перед IT-инженером встает одна и та же проблема - как же упростить это столь увлекательное по своей сути занятие, когда речь идет о большом количестве терминальных серверов. Как бы сделать так, чтобы нажал один раз волшебную кнопку Enter, и платформа 1С установлена была на всех указанных серверах сразу. В поисках этой волшебной кнопки Google навел на очень интересную статью на infostart - “Шоколадная” установка 1С

“Эврика!!!” - обрадовался я, но не тут то было.

Итак, обо всем по порядку.

Собственно, что такое chocolatey? Это менеджер пакетов для Windows(а-ля apt-get для Linux). В нем есть довольно много готовых пакетов в community репозитории. Но самый большой плюс - это возможность собирать свои пакеты, и размещать их в личном репозитории.

Первый шаг к заветному успеху - это установка chocolatey на все сервера, куда надо будет устанавливать платформу 1С. Чтобы установить на один сервер PowerShell:

 
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
							Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

Но поскольку устанавливать надо на несколько серверов, то скрипт уже будет немного иной:

 
Invoke-Command -ComputerName (Get-Content c:\Install\1CDistr\servers.txt) -ScriptBlock { [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
							Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))}

Здесь в файле scripts.txt забиты имена серверов построчно, на которые надо будет устанавливать платформу, безо всяких запятых, точек и прочего. Далее необходимо перезагрузить все сервера, на которые был установлен chocolatey:

 
Get-Content -Path c:\Install\1CDistr\servers.txt | Restart-Computer -Force

Следующим этапом необходимо развернуть web-сервер (я использовал IIS):

  • необходимо установить два обновления windows (и уже сейчас нам пригодится установленный chocolatey):

    a) choco install KB2919355 -y

    b) choco install KB2919442 -y

    c) перезагружаем сервер

  • теперь просто запустить след. скрипт PowerShell от имени администратора:

 
$siteName = 'ChocolateyServer'
								$appPoolName = 'ChocolateyServerAppPool'
								$sitePath = 'c:\tools\chocolatey.server'
								  
								function Add-Acl {
									[CmdletBinding()]
									Param (
										[string]$Path,
										[System.Security.AccessControl.FileSystemAccessRule]$AceObject
									)
									Write-Verbose "Retrieving existing ACL from $Path"
									$objACL = Get-ACL -Path $Path
									$objACL.AddAccessRule($AceObject)
									Write-Verbose "Setting ACL on $Path"
									Set-ACL -Path $Path -AclObject $objACL
								}
								  
								function New-AclObject {
									[CmdletBinding()]
									Param (
										[string]$SamAccountName,
										[System.Security.AccessControl.FileSystemRights]$Permission,
										[System.Security.AccessControl.AccessControlType]$AccessControl = 'Allow',
										[System.Security.AccessControl.InheritanceFlags]$Inheritance = 'None',
										[System.Security.AccessControl.PropagationFlags]$Propagation = 'None'
									)
								  
									New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule($SamAccountName, $Permission, $Inheritance, $Propagation, $AccessControl)
								}
								  
								if ($null -eq (Get-Command -Name 'choco.exe' -ErrorAction SilentlyContinue)) {
									Write-Warning "Chocolatey not installed. Cannot install standard packages."
									Exit 1
								}
								# Install Chocolatey.Server prereqs
								choco install IIS-WebServer --source windowsfeatures
								choco install IIS-ASPNET46 --source windowsfeatures
								  
								# Install Chocolatey.Server
								choco upgrade chocolatey.server -y
								  
								# Step by step instructions here https://docs.chocolatey.org/en-us/guides/organizations/set-up-chocolatey-server #setup-normally
								# Import the right modules
								Import-Module WebAdministration
								# Disable or remove the Default website
								Get-Website -Name 'Default Web Site' | Stop-Website
								Set-ItemProperty "IIS:\Sites\Default Web Site" serverAutoStart False    # disables website
								  
								# Set up an app pool for Chocolatey.Server. Ensure 32-bit is enabled and the managed runtime version is v4.0 (or some version of 4). Ensure it is "Integrated" and not "Classic".
								New-WebAppPool -Name $appPoolName -Force
								Set-ItemProperty IIS:\AppPools\$appPoolName enable32BitAppOnWin64 True       # Ensure 32-bit is enabled
								Set-ItemProperty IIS:\AppPools\$appPoolName managedRuntimeVersion v4.0       # managed runtime version is v4.0
								Set-ItemProperty IIS:\AppPools\$appPoolName managedPipelineMode Integrated   # Ensure it is "Integrated" and not "Classic"
								Restart-WebAppPool -Name $appPoolName   # likely not needed ... but just in case
								  
								# Set up an IIS website pointed to the install location and set it to use the app pool.
								New-Website -Name $siteName -ApplicationPool $appPoolName -PhysicalPath $sitePath
								  
								# Add permissions to c:\tools\chocolatey.server:
								'IIS_IUSRS', 'IUSR', "IIS APPPOOL\$appPoolName" | ForEach-Object {
									$obj = New-AclObject -SamAccountName $_ -Permission 'ReadAndExecute' -Inheritance 'ContainerInherit','ObjectInherit'
									Add-Acl -Path $sitePath -AceObject $obj
								}
								  
								# Add the permissions to the App_Data subfolder:
								$appdataPath = Join-Path -Path $sitePath -ChildPath 'App_Data'
								'IIS_IUSRS', "IIS APPPOOL\$appPoolName" | ForEach-Object {
									$obj = New-AclObject -SamAccountName $_ -Permission 'Modify' -Inheritance 'ContainerInherit', 'ObjectInherit'
									Add-Acl -Path $appdataPath -AceObject $obj
								}
  • Создаем виртуальный каталог choco. В нем создаем папку distr> и . Должно получиться вот так:

    image-1

    Версия платформы появится позже!!

Итак, с подготовительным этапом закончили. Переходим к основному этапу. Необходимо собрать пакет инсталляции 1С. Во-первых, необходимо архив с платформой, скачанной с сайта 1С, перепаковать в формате zip. Помещаем этот архив в виртуальный каталог distr/1c/8.3.18.1334

Теперь ключевой момент - создание пакета для установки 1С.

Создаем папку, в которой будем работать. У меня это C:\Install\1CDistr

Запускаем PowerShell от имени админа. Переходим в эту папку:

 
cd C:\Install\1CDistr

Выполняем команду:

 
choco new 1c

Тем самым мы создали шаблон пакета. Редактируем файл описания пакета 1c.nuspec:

 
<?xml version="1.0" encoding="utf-8"?>
							<package xmlns="http://schemas.microsoft.com/packaging/2015/06/nuspec.xsd">
							<metadata>
							<id></id>1c</id>
							<version>8.3.18.1334</version>
							<title>1c (Install)</title>
							<authors>Author</authors>
							<projectUrl>https://1c.ru</projectUrl>
							<iconUrl>http://1c.ru/static/images/logo.png</iconUrl>
							<tags>1c</tags>
							<summary></summary>
							<description>Установка платформы 1с через choco</description>
							</metadata>
							<files>
							<file src="tools\**" target="tools" />
							</files>
							</package>

Следующим этапом отредактируем файл chocolateyinstall.ps1 в папке tools:

 
$ErrorActionPreference = 'Stop'; # stop on all errors
							$toolsDir   = "$(Split-Path -parent $MyInvocation.MyCommand.Definition)"
							$url  = 'http://localhost/choco/distr/1c/' + $env:ChocolateyPackageVersion + '/setup.zip' # download url, HTTPS preferred
							 
							$packageZipArgs = @{
							  packageName   = $env:ChocolateyPackageName
							  unzipLocation = $toolsDir
							  #fileType      = 'MSI' #only one of these: exe, msi, msu
							  url           = $url
							  softwareName  = '1c*' #part or all of the Display Name as you see it in Programs and Features. It should be enough to be unique
							  checksum      = 'ADBE0E347ED18EBC30377D6D310EE238A398972E488ADD1A3EC20D07856ECE7B'
							  checksumType  = 'sha256' #default is md5, can also be sha1, sha256 or sha512
							  validExitCodes= @(0, 3010, 1641)
							}
							 
							$packageMSIArgs = @{
							  packageName   = $env:ChocolateyPackageName
							  fileType      = 'MSI' #only one of these: exe, msi, msu
							  softwareName  = '1c*' #part or all of the Display Name as you see it in Programs and Features. It should be enough to be unique
							 
							  # MSI
								file          = $toolsDir + '\1CEnterprise 8.msi'
								silentArgs    = "/qr DESIGNERALLCLIENTS=1 THICKCLIENT=1 THINCLIENTFILE=1 THINCLIENT=1 WEBSERVEREXT=0 SERVER=0 CONFREPOSSERVER=0 CONVERTER77=0 SERVERCLIENT=0 LANGUAGES=RU"
							  validExitCodes= @(0, 3010, 1641)
							}
							 
							  $path1cconf  = "C:\Program Files (x86)\1cv8\" + $env:ChocolateyPackageVersion + "\bin\conf\conf.cfg" 
							   
							  $cmd_break  = "/c" + "echo.>>" + """" + $path1cconf + """"
							  $cmd_unsafe  = "/c " + "echo DisableUnsafeActionProtection=.*>> " + """" +  $path1cconf + """"
							 
							Write-Output "Установка 1с"
							Install-ChocolateyZipPackage @packageZipArgs
							Install-ChocolateyInstallPackage @packageMSIArgs
							 
							Write-Output "Отключаем защиту от опасных действий"
							Start-ChocolateyProcessAsAdmin $cmd_break cmd 
							Start-ChocolateyProcessAsAdmin $cmd_unsafe cmd

Далее перехоим в папкку C:\Install\1CDistr\1C и создаем пакет установки:

 
cd .\C
							choco pack

И что мы видим? В папке C:\Install\1CDistr\1C появился файл 1c.8.3.18.1334.nupkg.

Он то нам и нужен. Его необходимо поместить в choclateyserver/packages:

image-2

Блюдо уже почти готово!!!

Заходим на сервере, где установлен chocolatey сервер, в браузер. Вводим в адресной строке localhost.

Читаем инструкцию!!

Осталось выполнить несколько команд:

Добавить пакет в локальный репозиторий

 
choco push C:\Install\1CDistr\1c.8.3.18.1334.nupkg --source="http://192.168.1.1/chocolatey" --api-key=3c7d9923-2021-42cl-g666-6d1b00e387957 --force

где 192.168.1.1 - ip адрес web-сервера с chocolatey, api-key - ключ API

Ура!!!

Ля-финаль.

Теперь необходимо добавить на сервера, на которые будем устанавливать платформу, локальный репозиторий chocolatey, и перезагрузить их:

 
Invoke-Command -ComputerName (Get-Content c:\Install\1CDistr\servers.txt) -ScriptBlock {choco source add -n=choco42clouds -s=http://192.168.1.1/chocolatey}
 
Get-Content -Path c:\Install\1CDistr\servers.txt | Restart-Computer -Force

Последняя команда - установка непосредственно платформы:

 
Invoke-Command -ComputerName (Get-Content c:\Install\1CDistr\servers.txt) -ScriptBlock {choco install 1c --version 8.3.18.1334 -y}

Платформа установлена. Надеюсь, что облегчил кому-то задачу.

Комментарии для сайта Cackle

Сервисы 1С для работы с маркетплейсами