Ansible роли для 1С

Публикация № 1214863

Администрирование - Системное администрирование

Ansible Установка1С

Готовые роли для развертывания 1С через Ansible.

Механизм ролей в 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С:

 

  1. onec-server - роль выполнит установку сервера 1С, поднимет службы агента и RAS и, при необходимости, перенесет на хост файл nethasp.ini. 

  2. onec-webserver - роль установит компоненты расширения для веб-сервера и, при необходимости, обновит версию платформы для существующих публикаций.

 

ВАЖНО: Установка платформы осуществляется через пакетный менеджер chocolatey модулем win_chocolatey, поэтому дополнительно на хост будет установлен chocolatey через зависимую роль deekayen.chocolatey.

Отдельное спасибо @Scorpion4eg за шоколадную установку: //extforms.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

 

 

И так... Для каждой роли создан сценарий:

  1. 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"
  2. 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 - задачи

Перечень:

  1. Если установлен параметр onec_server_find_services, то выполняется поиск и удаление существующих служб 1С и RAS.

  2. В chocolatey добавляется внешний репозиторий с пакетами платформы.

  3. Через chocolatey выполняется установка платформы версии v8version, с параметрами onec_server_install_params.

  4. Создается служба сервера 1С (если выполнялось удаление служб, то новая создается с параметрами удаленной службы).

  5. Создается служба RAS.

  6. Регистрируется консоль администрирования.

  7. Если установлен параметр 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: //extforms.ru/public/1124819/

Специальные предложения

Оставьте свое сообщение

См. также

Рабочее место программиста на Linux. Серия лабораторных работ. Работа 1

Статья Системный администратор Нет файла v8 Linux Бесплатно (free) Linux

В этой лабораторной работе мы сконфигурируем рабочее место программиста на платформе 1С:Предприятие 8. Воспользуемся подсистемой WSL и установим Linux в ОС Windows. Сервер 1С:Предприятие и сервер базы данных установим в Linux. Остальные компоненты установим в Windows.

17.02.2020    5150    infosoft-v    40       

Программы для исполнения 54-ФЗ Промо

С 01.02.2017 контрольно-кассовая техника должна отправлять электронные версии чеков оператору фискальных данных - правила установлены в 54-ФЗ ст.2 п.2. Инфостарт предлагает подборку программ, связанных с применением 54-ФЗ, ККТ и электронных чеков.

Собственный виртуальный сервер для 1С на Linux Ubuntu

Статья Системный администратор Программист Нет файла v8 Linux Бесплатно (free) Администрирование данных 1С Linux

Статья для тех, кто хочет научиться разворачивать 1С на linux, и для тех, кто хочет получить недорогой виртуальный сервер для собственных нужд.

24.05.2015    17254    spezc    44       

Публикация базы 1С на веб-сервере Apache на сервере Linux

Статья Системный администратор Программист Нет файла v8 1cv8.cf Linux Бесплатно (free) Администрирование данных 1С WEB Apache Linux

В отличие от других подобных публикаций здесь будет описано как опубликовать базу (располагающуюся на сервере windows) на веб-сервере apache (расположенном на соседнем сервере под linux).

20.09.2014    136891    spezc    64