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 за шоколадную установку: //v8book.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: //v8book.ru/public/1124819/

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

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

См. также

Мониторинг факта выполнения обмена с помощью сервиса healthchecks.io

Интеграция Системное администрирование v8 1cv8.cf Россия Бесплатно (free)

В статье опишу вариант простого мониторинга обработчиков, запускаемых по расписанию.

30.06.2020    521    0    malikov_pro    2    

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

Linux v8 Бесплатно (free)

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

17.02.2020    7388    0    infosoft-v    40    

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

Администрирование данных 1С Linux v8 Бесплатно (free)

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

24.05.2015    18232    0    spezc    44    

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

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

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

20.09.2014    143307    0    spezc    70