Ansible роли для 1С

24.03.20

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

Готовые роли для развертывания 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 за шоколадную установку: //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

 

 

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

  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: //infostart.ru/public/1124819/

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

См. также

Путь самурая. Ставим локальный Сервер взаимодействия

Сервера Администрирование веб-серверов Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Подробная пошаговая инструкция (как делал я) установки Сервера взаимодействия версия 22.0.26 на Windows Server 2022. Установка собственного объектного хранилище с помощью системы MinIO (https://min.io/). Настройка Сервера взаимодействия для обмена файлами в сообщениях.

1 стартмани

07.04.2023    13393    VPanin56    42    

75

Публикатор 1С. Как публиковать базы с комфортом

Администрирование веб-серверов Платформа 1С v8.3 Бесплатно (free)

Сегодня я расскажу вам про публикатор 1С баз. Это приложение, которое позволит с комфортом и удобством управлять зоопарком ваших веб публикаций. Если у вас больше 5 публикаций, и вам надо с ними что-то делать с завидным постоянством. Если для того чтобы опубликовать тестовую базу, вам приходится идти в техподдержку Если вам просто надоело копаться в конфигах, раздумывая, а нигде ли вы не ошиблись в пробелах и запятых - то тогда вам будет интересна эта публикация.

20.03.2023    6950    79    Segate    5    

27

Midnight Commander, установленный с Entware, не выполняет команды и не запускает файлы

Администрирование веб-серверов Linux Бесплатно (free)

Столкнулся с проблемой, установил на роутер Midnigt Commander с репозитория Entware, при попытке выполнения команды программа пишет ошибку "The shell is already running a command". Данная публикация описывает способ решения этой проблемы.

20.03.2023    3514    Eugen-S    2    

3

Публикация 1С на Apache SSL в локальной среде разработки

Администрирование веб-серверов Платформа 1С v8.3 Бесплатно (free)

В статье описывается установка и настройка веб-сервера Apache для работы с 1С через https.

09.02.2023    5656    lone_mayson    4    

42

Контейнер Docker для размещения публикации базы 1С на разных платформах

Администрирование веб-серверов Платформа 1С v8.3 1С:ERP Управление предприятием 2 Россия Бесплатно (free)

Появилась необходимость развернуть на одном хосте две публикации базы, но не на одной платформе, а на разных. Тут я расскажу, как это сделать для версии 8.3.22.1704.

02.02.2023    3577    Sney_Kice    1    

22

Быстрое конфигурирование серверов с Ansible

Администрирование веб-серверов Сервера Бесплатно (free)

Всю рутину по обновлению платформы, настройке веб-серверов и серверов хранилищ на всем парке серверов компании можно автоматизировать с помощью удобочитаемых YAML-скриптов Ansible. О том, как написать сценарии такой автоматизации, чтобы запускать их параллельно для группы серверов, на митапе «Инструменты автоматизации рутины в 1С-разработке» рассказал ведущий разработчик компании ПИК Digital Павел Комаров.

26.01.2023    5264    lopatrik    4    

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