Установка 1С используя Ansible

19.09.19

База данных - Обновление 1С

HOWTO. Как быстро обновить платформу на серверах 1С, если у Вас их парк.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
: playbook.yml
.yml 4,11Kb
8
8 Скачать (1 SM) Купить за 1 850 руб.

Представьте, что у Вас 20 серверов 1С и пришло время обновления релиза платформы. Нужно на каждом сервере установить новую версию платформы, удалить старую, поднять службу агента сервера и т.д. Накапливается масса рутинных операций. Есть несколько вариантов решения. Пойдем от сложного к простому:

  1. Вручную 
  2. Полуавтоматический - подготовить скрипт установки и выполнить его на каждой машине
  3. Автоматический - воспользоваться системой удаленного управления конфигурациями, т.е. с одной машины дать всем серверам команду на выполнение скрипта установки  

В статье будет показано как использовать Ansible для подобного рода задач.

Ansible - система управления конфигурациями, написанная на Python, с использованием декларативного языка разметки для описания конфигураций. Используется для автоматизации настройки и развертывания программного обеспечения. Обычно используется для управления Linux-узлами, но Windows также поддерживается.

С помощью Ansible вы можете написать сценарий автоматизации любой сложности, от создания пользователя, до поднятия сложного окружения продуктивного сервера.

Пойдем по порядку:

В качестве управляющей ноды (где будет установлен Ansible) может выступать только машина с ОС Linux. Поддерживается большинство дистрибутивов. В качестве хостов (где будут выполняться сценарии) могут выступать как Linux, так и Windows машины.

В примере, на управляющей ноде установлена ОС CentOS 7

Установка Ansible:

sudo yum install ansible

Подготовка файла Inventory:

Файл Inventory содержит в себе список хостов, к которым Ansible может подключиться. По умолчанию это файл /etc/ansible/hosts. 
Файл имеет гибкую настройку, мы будем использовать следующую сигнатуру указания хостов.

[group_name]

server_ip

Добавим в него два сервера и объединим их в группу [appservers] 

[appservers]

192.168.0.15
192.168.0.16

Подготовка Windows хоста для работы с Ansible:

Если в случае с Linux хостами доступ к ним осуществляется по SSH и все работает “из коробки”, то для того чтобы Ansible мог управлять Windows хостами, нужно на них включить службу удаленного управления (WS-Management). 
В репозитории Ansible есть PowerShell скрипт который выполнит всю предварительную настройку Windows хоста:

https://github.com/ansible/ansible/blob/devel/examples/scripts/ConfigureRemotingForAnsible.ps1

Запускаем скрипт на Windows машине

powershell.exe -File ConfigureRemotingForAnsible.ps1

Более подробную информацию по настройке Windows хоста можно посмотреть тут:

https://docs.ansible.com/ansible/latest/user_guide/windows_setup.html

Настройка подключения Ansible к группам хостов:

После того как мы подготовили файл Inventory и настроили хост машины, нужно указать параметры подключения к этим машинам (под каким пользователем, через что подключаемся). Настройки подключения хранятся в каталоге /etc/ansible/group_vars
Для каждой группы создается одноименный файл, в котором указываются параметры подключения.

Создаем каталог:

mkdir /etc/ansible/group_vars

Создаем файл с именем нашей группы appservers:

vi /etc/ansible/group_vars/appservers

И вводим в него следующие параметры:

ansible_user: ansible
ansible_port: 5985
ansible_connection: winrm
ansible_winrm_transport: credssp
ansible_winrm_server_cert_validation: ignore

Теперь, ко всем хостам группы appservers, Ansible будет подключаться используя вышеуказанные параметры. Пароль от пользователя ansible мы также можем указать в файле appservers добавив строку:

ansible_password: p@ssw0rd

В целях безопасности мы этого не делаем и запрашивать пароль будем в момент запуска сценария, указав ключ --ask-pass

Проверка подключения Ansible к группе хостов:

Для проверки подключения будем использовать модуль win_ping. Все модули которые могут выполнятся на Windows хостах начинаются с префикса win_. Подробное описание всех модулей можно найти в официальном сайте. 

Выполняем команду

ansible appservers -m win_ping

В случае успешного подключения получим сообщение

192.168.0.15 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Плэйбуки (сценарии) Ansible

Playbook (файл сценариев) — это файл, в котором описываются действия, которые нужно выполнить на какой-то группе хостов. Сценарии описываются в формате YAML

Плэйбук представляет собой набор задач (tasks). Каждая задача выполняется определенным модулем.

В плэйбуке по установке сервера 1С использованы следующие модули:

  • win_service - модуль для работы со службами
  • set_fact - модуль для работы с переменными
  • win_package - модуль установки/удаления пакетов Windows

Отдельно стоит отметить шифрование паролей в плэйбуке. Для этого используется ansible-vault (зашифрованное хранилище)

Чтобы поместить пароль в хранилище воспользуемся следующей командой:

echo -n "p@ssw0rd" | ansible-vault encrypt_string

Ansible потребует установить пароль для vault. Важно его запомнить, т.к. при утере восстановить исходный пароль будет уже невозможно. 

В результате выполнения команды получим пароль в зашифрованном виде:

!vault | $ANSIBLE_VAULT;1.1;AES256 64396632346366373434356466396230364121656130363134316537306339643265656637366565 
3763393238623632663732623034313738386561356232320a333766336638646137316463363031 
66666435333939663832353937623638643764336662343834663338623666653965366233343536 
3232633839646337300a333935333663613864306230343538653837353936373564623636366664 
3537

Теперь вместо пароля мы можем указывать данную строку.

Пример плэйбука по установке платформы:

 
---
# Playbook для обновления релиза платформы на серверах приложений

- name: Install 1C Enterprise Application Server
  hosts: appservers
  
  # Переменные доступные плэйбуку
  vars:
    v8version: 8.3.15.1565
    server_agent_srv_name: '1C:Enterprise 8.3 Server Agent'
    server_agent_params: '-srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo" -debug'
    ras_srv_name: '1C:Remote Administation Service (RAS)'
    platform_distr_path: \\1C\Платформа\8_3_15_1565\setup.exe
    bin_path: C:\Program Files\1cv8\{{ v8version }}\bin
    srv_1c_pwd: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          64396632346366373434356466396230364121656130363134316537306339643265656637366565
          3763393238623632663732623034313738386561356232320a333766336638646137316463363031
          66666435333939663832353937623638643764336662343834663338623666653965366233343536
          3232633839646337300a333935333663613864306230343538653837353936373564623636366664
          3537
  tasks:
    - name: Test connection
      win_ping:

    # Проверка наличия службы сервера 1С
    - name: Check if a server agent service is installed
      win_service:
        name: '{{ server_agent_srv_name }}'
      register: server_agent_srv_info

    # Проверка наличия службы удаленного администрирования RAS
    - name: Check if a RAS service is installed
      win_service:
        name: '{{ ras_srv_name }}'
      register: ras_srv_info

    # Остановка службы сервера 1С
    - name: Stop server agent service
      win_service:
        name: '{{ server_agent_srv_name }}'
        state: stopped
      when: server_agent_srv_info.exists

    # Остановка службы службы удаленного администрирования RAS
    - name: Stop RAS service
      win_service:
        name: '{{ ras_srv_name }}'
        state: stopped
      when: ras_srv_info.exists

    # Удаление службы сервера 1С
    - name: Remove server agent service
      win_service:
        name: '{{ server_agent_srv_name }}'
        state: absent
      when: server_agent_srv_info.exists

    # Сохранение параметров службы сервера 1С (?<=ragent.exe\s).*(?=")
    - name: Save server agent params
      set_fact:
        server_agent_params: "{{ server_agent_srv_info.path | regex_search('(?<=ragent.exe\\s).*(?=\")') }}"
      when: server_agent_srv_info.exists

    # Удаление службы удаленного администрирования RAS
    - name: Remove RAS service
      win_service:
        name: '{{ ras_srv_name }}'
        state: absent
      when: ras_srv_info.exists

    # Удаление платформы
    - name: Uninstall 1C Enterpise 8.3
      win_package:
        product_id: '{24877BC3-0D30-4F0E-A840-EDB9DBB30D47}' # HKLM:Software\Microsoft\Windows\CurrentVersion\Uninstall
        state: absent

    # Установка сервера 1С
    - name: Install 1C Enterprise Application Server
      win_package:
        path: '{{ platform_distr_path }}'
        product_id: '{24877BC3-0D30-4F0E-A840-EDB9DBB30D47}'
        arguments: 'DESIGNERALLCLIENTS=1 THINCLIENTFILE=0 THINCLIENT=1 WEBSERVEREXT=1 SERVER=1 CONFREPOSSERVER=0 CONVERTER77=0 SERVERCLIENT=1 LANGUAGES=RU'

    # Создание службы агента сервера 1С
    - name: Create a new server agent service
      win_service:
        name: '{{ server_agent_srv_name }}'
        path: '{{ bin_path }}\ragent.exe {{ server_agent_params }}'
        start_mode: auto
        username: srv_1c
        password: '{{ srv_1c_pwd }}'

    # Создание службы удаленного администрирования RAS
    - name: Create a new RAS service
      win_service:
        name: '{{ ras_srv_name }}'
        path: '{{ bin_path }}\ras.exe cluster --service --port=1545 localhost:1540'
        start_mode: auto

Запуск плэйбука:

ansible-playbook playbook.yml --ask-vault-pass --ask-pass

Ключ --ask-vault-pass потребует ввода пароля от зашифрованного хранилища

Ключ --ask-pass потребует ввода пароля от учетной записи под которой ansible подключается к хост машине (в нашем случае это УЗ ansible)

Лог выполнения:

 
PLAY [Install 1C Enterprise Application Server] ***************************************************************************************************************************************************

TASK [Gathering Facts] ****************************************************************************************************************************************************************************
ok: [192.168.0.15]

TASK [Test connection] ****************************************************************************************************************************************************************************
ok: [192.168.0.15]

TASK [Check if a server agent service is installed] ***********************************************************************************************************************************************
ok: [192.168.0.15]

TASK [Check if a RAS service is installed] ********************************************************************************************************************************************************
ok: [192.168.0.15]

TASK [Stop server agent service] ******************************************************************************************************************************************************************
ok: [192.168.0.15]

TASK [Stop RAS service] ***************************************************************************************************************************************************************************
ok: [192.168.0.15]

TASK [Remove server agent service] ****************************************************************************************************************************************************************
changed: [192.168.0.15]

TASK [Remove RAS service] *************************************************************************************************************************************************************************
changed: [192.168.0.15]

TASK [Uninstall 1C Enterpise 8.3] *****************************************************************************************************************************************************************
changed: [192.168.0.15]

TASK [Install 1C Enterprise Application Server] ***************************************************************************************************************************************************
changed: [192.168.0.15]

TASK [Create a new server agent service] **********************************************************************************************************************************************************
changed: [192.168.0.15]

TASK [Create a new RAS service] *******************************************************************************************************************************************************************
changed: [192.168.0.15]

PLAY RECAP ****************************************************************************************************************************************************************************************
192.168.0.15            : ok=13   changed=6    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

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

Полезные ссылки:

Официальная документация Ansible: https://docs.ansible.com/

Репозиторий Ansible: https://github.com/ansible/ansible

Ansible установка

См. также

Зарплата Регламентированный учет и отчетность Кадровый учет Обновление 1С Бухгалтер Платформа 1С v8.3 Сложные периодические расчеты 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Зарплата и Управление Персоналом 2.5 Бухгалтерский учет Налоговый учет Управленческий учет Акцизы ЕНВД ЕСН Земельный налог ИП, ПБОЮЛ, КФХ Налог на имущество Налог на прибыль НДС НДФЛ ФОМС, ЕФС Транспортный налог УСН ПСН (патентная система налогообложения) Платные (руб)

Обновления для конфигураций: КА 1.1; ЗУП 2.5; БУХ 2.0; КА 1.1 Комплексная автоматизация торговли алкогольной продукцией; КА 1.1 Комплексный учет сельскохозяйственного предприятия

27900 руб.

01.04.2020    145980    645    358    

235

Обновление 1С Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Абонемент ($m)

Те кто объединял конфигурации находящиеся на поддержке, обновлял подсистемы БСП прекрасно помнят упражнение «10000 тысяч кликов мышкой» или, непонятное словесное заклинание, после которого конфигурация снимается с поддержки целиком.

1 стартмани

26.09.2024    380    1    milkers    2    

7

Обновление 1С Пользователь Платформа 1С v8.3 1С:Управление торговлей 11 Россия Бесплатно (free)

Вышел новый релиз для УТ11 5.19.63. На копии базы было выполнено обновление и вылезли проблемы с номенклатурой, подлежащей маркировке. В публикации описаны проблемы, обнаруженные в копии базы конкретной организации.

24.09.2024    532    gull22    1    

8

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

Как исправить медленное сравнение конфигурации с файлом cf, сохраненным из хранилища.

17.09.2024    3982    vatkir    14    

9

Обновление 1С Пользователь Платформа 1С v8.3 1С:Управление торговлей 11 Абонемент ($m)

Упрощенное обновление конфигураций 1С (предпочтительно самописных) с помощью батника и Яндекс Диска (по публичной ссылке)

1 стартмани

22.08.2024    453    0    user1694357    0    

3

Обновление 1С Системный администратор Россия Абонемент ($m)

На ИТС есть статья, в которой поверхностно описан процесс автоматического обновления тонких клиентов. В качестве примера, что логично, представлены методы конфигурации 1С. Но, в отличие от того же управления списками баз, для обновления не требуется хранить информацию, потому я решил переписать код на php, чтобы можно было отвязаться от 1С. Не работает для файловых баз, подключенных как File="ПутьКПапкеБазы"; (а жаль), для опубликованных файловых - работает.

1 стартмани

20.08.2024    507    MikeSh    10    

1

Обновление 1С Программист Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бухгалтерский учет Бесплатно (free)

В случае, когда при обновлении конфигурации счет разделяется на несколько субсчетов, может возникать ошибка в видах субконто. Предлагается алгоритм, как это исправить.

05.08.2024    646    NikiforovVA    0    

1

Обновление 1С Программист Платформа 1С v8.3 Платформа 1C v8.2 Конфигурации 1cv8 Бесплатно (free)

По нашему опыту, есть 2 ситуации, когда хочется отдать обновление нетиповой 1С кому-то другому. А) Если конфигурация и её доработки отлично знакомы, но не хочется заниматься рутиной. Б) Когда обновление длительно откладывалось, накопился «снежный ком» изменений, а команда, которая их делала, давно и неоднократно менялась.

26.06.2024    1140    1c-izh    4    

5
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Glebis 13 20.09.19 09:21 Сейчас в теме
Пойдем от сложного к простому:
...
4. Политикой домена с запуском cmd скрипта с 2мя строками msiexec удаления - установки платформы + ещё 2 строки для удаления - установки RAS.
Fox-trot; Deytory; +2 Ответить
3. Fox-trot 163 20.09.19 13:53 Сейчас в теме
(1) а ежели нет домена.... читаем статью?
4. Glebis 13 20.09.19 14:56 Сейчас в теме
(3) Если нет общего домена или домены не в лесе - то это, скорее всего, разные (независимые) организации. Будь я сотрудником безопасности этих организаций, у меня возникли бы вопросы. Например, о безопасности "поднятия хоста" удаленного управления на продакш сервере 1С, куда может в любой момент прилететь по ssh команда с правами администратора.
По мне так намного "секьюрней" выполнять из планировщика заданий или автозагрузки системы ps1 файл в облаке (под локальным админом) который бы устанавливал msi файл из того же облака.
7. sorb 21.09.19 19:30 Сейчас в теме
(4) если нет общего домена, то это, скорее всего магазины). На самом деле без vpn доступ по ssh (с каким-нибудь fail2ban) как раз мировая норма, в отличие от того же проброса 3389 наружу. Автор - молодчага, хотя бы просто потому, что бикоз хи кэн)
9. blackhole321 1313 21.09.19 21:49 Сейчас в теме
(7)
без vpn доступ по ssh (с каким-нибудь fail2ban) как раз мировая норма

А не проще родными средствами (PowerShell)?
10. sorb 22.09.19 07:05 Сейчас в теме
(9) ssh - транспортный протокол, pwsh - язык и среда исполнения, как одно заменяет другое? Если Вы имели в виду использование транспорта winrm или ipc$ через тот же psexec, то тут, конечно, вопрос личных предпочтений, кому как удобней)
11. blackhole321 1313 22.09.19 07:38 Сейчас в теме
(10)Ну не придирайтесь :). Вы ведь поняли, что речь идет о средствах управления, а не о транспортном протоколе. Playbook из статьи как раз использует WinRM, а PowerShell может быть настроен через ssh так, что вопрос был в том, что не проще ли использовать штатное средство удаленного администрирования (PowerShell), которое уже входит в состав системы и настраивается несколькими строками (Enable-PSRemoting ... или GPO etc.)?
Ну и собственно:
$session = New-PSSession -ComputerName "МойКомпьютер"
Invoke-Command -Session $session -ScriptBlock МойКусокКода
Или интерактивно:
Enter-PSSession $session
Ну и далее руками.
Просто Вы написали, что круто, потому, что хи кен, а я спросил what is this for? :)
12. newgluk 89 22.09.19 11:15 Сейчас в теме
(9) не проще, если у вас часть серверов на Win, часть на Linux. Playbooks удобны тем, что весь зоопарк управляется единообразно.
14. blackhole321 1313 22.09.19 11:24 Сейчас в теме
(12)Согласен. Примерно это и хотел услышать. И наверное все определяется соотношением Windows и Linux серверов/рабочих станций. Полагаю, что если у вас 10500 серверов Windows и 20 Linux имеет смысл установить PowerShell на эти 20 серверов. Соответственно если 100500 серверов/рабочих станций Linux и 20 Windows, предлагаемая схема вполне рабочая.
15. newgluk 89 22.09.19 11:31 Сейчас в теме
(14)Ансибл сейчас на хайпе, у него куча готовых ролей, разного рода инструменты типа Ansible Tower и AWX. То есть, теоретически это удобнее чем самому писать скрипты на PS
16. blackhole321 1313 22.09.19 11:58 Сейчас в теме
(15)Я так понимаю, ключевое слово - на хайпе :) На мой взгляд, несколько странно платить деньги за операционную систему и не пользоваться предоставляемыми инструментами и возможностями, за которые вы заплатили.
Ansible Tower - по моему совершенно не бесплатен, тогда уж надо сравнивать с System Center.

То есть, теоретически это удобнее чем самому писать скрипты на PS

Ну вот теоретически :), а практически - возникли ошибки при выполнении playbook, не стартовала служба или что-то еще, что Вы будете делать? Полагаю, что что-то типа $session = New-PSSession и.т.п. :)
17. newgluk 89 22.09.19 12:11 Сейчас в теме
(16)да, все так, для каждого кейса свой инструмент. если плейбук кривой, то да, цепляемся по ssh, стартуем службу руками, материмся, переписываем плейбук... Никакой магии. Но в целом, многие сейчас пропагандируют IAC, декларативное описание инфрастурктруры и все такое. А инструменты типа Ansible хорошо в эту идеологию укладываются.
18. blackhole321 1313 22.09.19 12:53 Сейчас в теме
(17)IAC можно реализовать как в декларативном так и в процедурном стиле, тут наверное вопрос вкуса. Если хочется декларативного подхода, можно использовать DSC, который является штатной фичей ОС Windows и под капотом которого как и в случае с Ansible - все те же процедуры. Тут наверное стоит учесть размер инфрастуктуры. Если она небольшая - то это как из пушки по воробьям.
sorb; newgluk; +2 Ответить
19. newgluk 89 22.09.19 13:02 Сейчас в теме
(18)если вы говорите про то, что нечего тащить инструментарий Linux на Win, если есть стабильные нативные решения, то я не спорю. Плясать потом с виртуалками или с Windows Subsystem Linux - то еще удовольствие. Другое дело, если у вас скажем 50 серверов на Linux и парочка на Win, и те скоро мигрируют...
20. blackhole321 1313 22.09.19 14:58 Сейчас в теме
(19)Полностью с Вами согласен.
2. yaguarrr 72 20.09.19 13:50 Сейчас в теме
Запамятовал уже как, но раньше делали, что все клиенты стартутют из одной папки
5. blackhole321 1313 21.09.19 08:49 Сейчас в теме
Как откатить изменения, если что-то пошло не так?
8. lopatrik 107 21.09.19 20:47 Сейчас в теме
(5) Отката нет, но можно описать сценарий по условию, на случай, если что-то пошло не так. Например, если служба не запустилась.
Либо какие-то "бекапы" делать перед выполнением и возвращаться к ним опять же отдельными тасками.
6. sorb 21.09.19 19:23 Сейчас в теме
Очень, очень классно, спасибо!
Для полного счастья не хватает описания автоматизации подготовки узлов к работе, например с помощью psexec
13. newgluk 89 22.09.19 11:21 Сейчас в теме
автору - вы не пробовали ssh пару ключей (закрытый/открытый) для аутентификацци с Linux на Win? Хранить пароль в текстовике некошерно, а вводит вручную - лень :)
21. lopatrik 107 23.09.19 11:27 Сейчас в теме
(13) Изначально так и хотел сделать, но при работе через WinRM использование ssh ключей не поддерживается.
В версии 2.8 добавили экспериментальный функционал по этому поводу. Как попробую, обязательно поделюсь опытом.
22. pumbaE 24.09.19 12:32 Сейчас в теме
такой режим подойтет только если уже вручную устанвливали сервер 1с и установленные компоненты уже сохранились в C:\ProgramData\1C\1CEStart\1CEStart.cfg

при этом каждый раз надо искать product_id
- name: put file msi info on remote
  tags: onec
  win_copy:
    src: files/getmsifile.ps1
    dest: C:\1c\install\getmsifileinfo.ps1

- name: get msi product id 
  win_shell: C:\1c\install\getmsifileinfo.ps1 -Path "C:\1c\install\{{onec_version}}\1CEnterprise 8.msi" -Property ProductCode
  register: productcode

- name: unistall 1C {{ onec_version }}
  tags: onec
  win_package:
    path: C:\1c\install\{{onec_version}}\1CEnterprise 8.msi
    product_id: "{{ productcode.stdout_lines[0] }}"
    state: absent
  when: onec_reinstall

- name: install 1C {{ onec_version }}
  tags: onec
  win_package:
    path: C:\1c\install\{{onec_version}}\1CEnterprise 8.msi
    state: present
    product_id: "{{ productcode.stdout_lines[0] }}"
    arguments: /L*V "C:\1c\install\{{onec_version}}install.log"
  when: not onec_install.stat.exists or onec_reinstall

Показать


https://gist.github.com/pumbaEO/8667e0ed68574b1ab0c27d8060e89c97#file-getmsifile-ps1
lopatrik; +1 Ответить
23. blackhole321 1313 03.10.19 20:01 Сейчас в теме
(22)

...
src: files/getmsifile.ps1
dest: C:\1c\install\getmsifileinfo.ps1

- name: get msi product id
win_shell: C:\1c\install\getmsifileinfo.ps1
...


Вот и возникает вопрос, а нужен ли здесь Ansible?
Оставьте свое сообщение