Инструкция как установить платформу 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> и 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:

Блюдо уже почти готово!!!
Заходим на сервере, где установлен 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}
Платформа установлена. Надеюсь, что облегчил кому-то задачу.