Механизм ролей в Ansilbe позволяет разбить сложный сценарий на отдельные части - роли. Обычно роль определяет некоторую функциональность, например: сервер 1С: Предприятия или SQL сервер. А в сценариях уже указывается, что данный хост будет выполнять роль сервера 1С или SQL сервера, либо все вместе. Удобство переиспользования сценариев заметно возрастает.
Каждая роль имеет свое имя, например onec-server. Файлы, связанные с ролью onec-server, хранятся в каталоге roles/onec-server.
Структура каталога роли:
-
roles/onec-server/tasks/main.yml - задачи;
-
roles/onec-server/files/ - файлы, выгружаемые на хосты;
-
roles/onec-server/templates - файлы шаблонов Jinja2;
-
roles/onec-server/handlers/main.yml - обработчики, вызываемые из задач;
-
roles/onec-server/vars/main.yml - переменные, которые нельзя переопределять;
-
roles/onec-server/defaults/main.yml - переменные, которые могут переопределяться;
-
roles/onec-server/meta/main.yml - информация о зависимостях данной роли;
На данный момент подготовлены две роли для 1С:
-
onec-server - роль выполнит установку сервера 1С, поднимет службы агента и RAS и, при необходимости, перенесет на хост файл nethasp.ini.
-
onec-webserver - роль установит компоненты расширения для веб-сервера и, при необходимости, обновит версию платформы для существующих публикаций.
ВАЖНО: Установка платформы осуществляется через пакетный менеджер chocolatey модулем win_chocolatey, поэтому дополнительно на хост будет установлен chocolatey через зависимую роль deekayen.chocolatey.
Отдельное спасибо @Scorpion4eg за шоколадную установку: //infostart.ru/public/854486/. Посмотреть, как создавать собственные пакеты и свой репозиторий в chocolatey, можно в нем.
Выложу свой вариант файла установки пакета 1c.
chocolateyinstall.ps1
$ErrorActionPreference = 'Stop';
$toolsDir = "$(Split-Path -parent $MyInvocation.MyCommand.Definition)"
$url = 'http://chocos.mydomain.ru/choco/files/1c/' + $env:ChocolateyPackageVersion + '/setup_x86.rar'
$url64 = 'http://chocos.mydomain.ru/choco/files/1c/' + $env:ChocolateyPackageVersion + '/setup_x86_64.rar'
$fileLocation = Join-Path $toolsDir '1CEnterprise 8.msi'
$fileLocation64 = Join-Path $toolsDir '1CEnterprise 8 (x86-64).msi'
if (Get-ProcessorBits 64) {
$forceX86 = $env:chocolateyForceX86
if ($forceX86 -eq 'true') {
Write-Debug "User specified '-x86' so forcing 32-bit"
} else {
$fileLocation = $fileLocation64
}
}
$pp = Get-PackageParameters
$packageZipArgs = @{
packageName = $env:ChocolateyPackageName
unzipLocation = $toolsDir
url = $url
url64bit = $url64
softwareName = '1c*'
checksum = 'C491AD414C22292FB088E9682E76BCE8FB2AF1564516E5C562DBF6623E696DEB'
checksumType = 'sha256'
checksum64 = 'F93903C6A0369CC762F0D710959B7C4B9BB7DC04F0FDD2E54DE614FA54FEF871'
checksumType64= 'sha256'
validExitCodes= @(0, 3010, 1641)
}
if (!$pp.DESIGNERALLCLIENTS) { $pp.DESIGNERALLCLIENTS = "1" }
if (!$pp.THICKCLIENT) { $pp.THICKCLIENT = "1" }
if (!$pp.THINCLIENTFILE) { $pp.THINCLIENTFILE = "1" }
if (!$pp.THINCLIENT) { $pp.THINCLIENT = "1" }
if (!$pp.WEBSERVEREXT) { $pp.WEBSERVEREXT = "0" }
if (!$pp.SERVER) { $pp.SERVER = "0" }
if (!$pp.CONFREPOSSERVER) { $pp.CONFREPOSSERVER = "0" }
if (!$pp.CONVERTER77) { $pp.CONVERTER77 = "0" }
if (!$pp.SERVERCLIENT) { $pp.SERVERCLIENT = "0" }
if (!$pp.LANGUAGES) { $pp.LANGUAGES = "RU" }
$packageMSIArgs = @{
packageName = $env:ChocolateyPackageName
fileType = 'MSI'
softwareName = '1c*'
file = $fileLocation
silentArgs = "/qr DESIGNERALLCLIENTS=$($pp['DESIGNERALLCLIENTS']) THICKCLIENT=$($pp['THICKCLIENT'])" +
" THINCLIENTFILE=$($pp['THINCLIENTFILE']) THINCLIENT=$($pp['THINCLIENT'])" +
" WEBSERVEREXT=$($pp['WEBSERVEREXT']) SERVER=$($pp['SERVER'])" +
" CONFREPOSSERVER=$($pp['CONFREPOSSERVER']) CONVERTER77=$($pp['CONVERTER77']) SERVERCLIENT=$($pp['SERVERCLIENT']) LANGUAGES=$($pp['LANGUAGES'])"
validExitCodes= @(0, 3010, 1641)
}
Write-Output "Скачиваю и распаковываю архив с платформой"
Install-ChocolateyZipPackage @packageZipArgs
Write-Output "Устанавливаю платформу версии $env:ChocolateyPackageVersion"
Write-Output $packageMSIArgs.silentArgs
Install-ChocolateyInstallPackage @packageMSIArgs
И так... Для каждой роли создан сценарий:
- onec-server.yml для сервера 1C
--- - name: deploy onec server hosts: test vars_files: - secrets.yml pre_tasks: - name: create ansible temp directory win_file: path: "{{ ansible_win_temp_dir }}" state: directory ignore_errors: true roles: - role: onec-server v8version: "8.3.16.1148"
- onec-webserver.yml для веб сервера
--- - name: deploy onec webserver components hosts: test vars_files: - secrets.yml roles: - role: onec-webserver v8version: "8.3.16.1148" onec_architecture: "x86" update_web_config: true prev_v8version: "8.3.15.1656"
Вспомогательные файлы:
group_vars/all
В файле all хранятся переменные, которые будут доступны всем сценариям и ролям, независимо на какой группе хостов выполняется сценарий. При необходимости можно создать в каталоге group_vars файл с именем группы и уточнить значение переменной.
ansible_win_temp_dir: 'C:\temp\ansible' #Каталог временных файлов
secrets.yml
В файле secrets.yml указываются все пароли и явки, которые будут подключены к сценарию как переменные, поэтому он добавлен в .gitignore. За шаблон следует брать файл secrets.yml.example. Для более тщательной защиты ключей и паролей в Ansible есть механизм Vaults.
---
onec_server_srv_usr: onec-srv-user # Пользователь под которым будет работать служба сервера 1С
onec_server_srv_pwd: e79c9761d0bdaa223@93769e309 # Пароль пользователя
nh_server_addr: # Адреса аппаратных ключей, которые будут перенесены в nethasp.ini
- "NH_SERVER_ADDR = 1ckey01"
- "NH_SERVER_ADDR = 1ckey02"
- "NH_SERVER_ADDR = 1ckey03"
Переменные файла подключаются к задаче в секции
vars_files:
- secrets.yml
Роль onec-server
/defaults/main.yml - переопределяемые переменные
---
conf_path: "C:\\Program Files\\1cv8\\conf" # Путь к каталогу conf
bin_path: "C:\\Program Files\\1cv8\\{{ v8version }}\\bin" #Путь к каталогу bin
onec_server_find_services: yes # Включение задач по поиску и удаления служб сервера 1С и RAS
copy_nethasp_ini: yes # Копировать nethasp.ini из шаблонов
onec_server_install_params: "/SERVER=1 /SERVERCLIENT=1" # Параметры установки платформы
onec_server_srv_name: "1C:Enterprise 8.3 Server Agent" # Имя службы сервера 1С
onec_server_ragent_path: "{{ bin_path }}\\ragent.exe" # Путь к агенту сервера 1С
onec_server_srv_params: '-srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo" -debug' # Параметры агента сервера 1С
ras_path: "{{ bin_path }}\\ras.exe" # Путь к RAS
ras_srv_name: '1C:Remote Administation Service (RAS)' # Имя службы RAS
ras_srv_params: cluster --service --port=1545 localhost:1540 # Параметры службы RAS
В файле приводятся значения по умолчанию, их можно изменять и устанавливать из основного сценария
/meta/main.yml - зависимости
dependencies:
- { role: deekayen.chocolatey}
Роль onec-server зависит от роли deekayen.chocolatey. Она будет установлена вначале.
/tasks/mail.yml - задачи
Перечень:
-
Если установлен параметр onec_server_find_services, то выполняется поиск и удаление существующих служб 1С и RAS.
-
В chocolatey добавляется внешний репозиторий с пакетами платформы.
-
Через chocolatey выполняется установка платформы версии v8version, с параметрами onec_server_install_params.
-
Создается служба сервера 1С (если выполнялось удаление служб, то новая создается с параметрами удаленной службы).
-
Создается служба RAS.
-
Регистрируется консоль администрирования.
-
Если установлен параметр copy_nethasp_ini, то выполняется его копирование из папки templates.
---
- include: find-services.yml # Включение задач по поиску и удалению существующих служб
when: onec_server_find_services is defined and onec_server_find_services
- name: add new chocolatey internal source # Добавление внешнего репозитория пакетов с платформой
win_chocolatey_source:
name: choco.mydomain.ru
state: present
source: http://chocos.mydomain.ru/chocolatey
- name: install onec server {{ v8version }} x64 # Установка платформы
win_chocolatey:
name: 1c
version: '{{ v8version }}'
params: '{{ onec_server_install_params}}'
force: yes
allow_multiple: yes
register: onec_server_install_result
- debug:
var: onec_server_install_result
- name: create onec server service # Создание службы сервера 1С
win_service:
name: '{{ onec_server_srv_name }}'
path: '{{ onec_server_ragent_path }} {{ onec_server_srv_params }}'
start_mode: auto
username: '{{ onec_server_srv_usr }}'
password: '{{ onec_server_srv_pwd }}'
state: started
- name: create RAS service # Создание службы RAS
win_service:
name: '{{ ras_srv_name }}'
path: '{{ ras_path }} {{ ras_srv_params }}'
start_mode: auto
state: started
- name: register server MSC # Регистрация консоли администрирования
win_shell: "Invoke-Item \"{{ bin_path }}\\RegMSC.cmd\""
- name: copy nethasp.ini # Копирование файла nethasp.ini
win_template:
src: nethasp.ini.j2
dest: "{{ conf_path }}\\nethasp.ini"
when: copy_nethasp_ini is defined and copy_nethasp_ini
/tasks/find-services.yml - задачи удаления служб 1С и RAS
---
- name: copy onec srv info script # Копируем скрипт поиска службы сервера 1С на хост
win_copy:
src: "scripts/get-onec-server-service-info.ps1"
dest: "{{ ansible_win_temp_dir }}\\get-onec-server-service-info.ps1"
- name: retrieving onec server service info # Получаем информацию о службе сервера 1С
win_shell: "{{ ansible_win_temp_dir }}\\get-onec-server-service-info.ps1"
register: onec_server_service_info
- debug: var=onec_server_service_info.stdout_lines
- set_fact: # Сохраняем информацию о службе для дальнейшего использования при удалении и установке
onec_server_srv_name: '{{ onec_server_service_info.stdout_lines[0] }}'
onec_server_srv_params: '{{ onec_server_service_info.stdout_lines[1] }}'
onec_server_srv_exists: true
when: onec_server_service_info.stdout_lines | length > 1
- debug:
msg:
- "onec_server_srv_name : {{ onec_server_srv_name }}"
- "onec_server_srv_params : {{ onec_server_srv_params }}"
- name: remove onec server service # Удаляем службу сервера 1С
win_service:
name: '{{ onec_server_srv_name }}'
state: absent
when: onec_server_srv_exists is defined and onec_server_srv_exists
- name: check if a RAS service is installed # Получаем информацию о службе RAS
win_service:
name: '{{ ras_srv_name }}'
register: ras_srv_info
- name: remove RAS service # Удаляем службу RAS
win_service:
name: '{{ ras_srv_name }}'
state: absent
when: ras_srv_info.exists
/templates/nethasp.ini.j2 - шаблон Jinja2
Файл шаблона nethasp.ini, который будет скопирован на хост. В секцию nh_server_addr будут перенесены указанные в secrets.yml HASP ключи.
[NH_COMMON]
NH_IPX = Disabled
NH_NETBIOS = Disabled
NH_TCPIP = Enabled
NH_SESSION = 10
[NH_IPX]
[NH_NETBIOS]
[NH_TCPIP]
NH_USE_BROADCAST = Disabled
{% for item in nh_server_addr %}
{{ item }}
{% endfor %}
Роль onec-webserver
Так же, как и в onec-server, установка платформы выполняется через chocolatey, только с другими параметрами:
onec_install_params: "/WEBSERVEREXT=1"
Отличительной фичей является параметр update_web_config. Установив его, во всех веб публикациях в файле web.config будет заменена версия платформы с prev_v8version на v8version.
Ссылка на репозиторий: https://github.com/komarovps/ansible-onec-windows
Как поднять Ansible: //infostart.ru/public/1124819/