Как стать автором
Обновить

Терминальная ферма 1C на x2go

Уровень сложностиПростой
Время на прочтение7 мин
Количество просмотров5.4K

Итак, импортозамещение катится по стране неостановимым катком. Внесём свой посильный вклад.

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

Но, согласно веяниям времени, нам пришлось сделать терминальную ферму на ОС REDOS и x2go (из комплекта поставки ОС). В коде ниже нет ничего REDOS специфического (кроме dnf), рецепт подойдет для любого дистрибутива.

Сразу скажу, есть ограничения: можно использовать только один брокер, сессии раскидываются round-robin. Так же, вылезают некоторые баги, но техподдержка REDOS идёт на контакт и патчит их не покладая рук. Опытным путём было выяснено, что на Ubuntu x2go работает значительно более лучше, а на отечественном deb-like дистрибутиве, в данный момент, несколько хуже.

Итак, вы должны развернуть нужное количество виртуалок для фермы (брокер и потребное количество терминальных серверов) и настроить на них сеть. Виртуалки надо развёртывать с графическим рабочим столом. Дальнейшее конфигурирование делаем через ansible (это у нас так, вы можете и руками).

Дальнейшие действия выполняются с сервера ansible.

Правим файл /etc/ansible/hosts - добавляем блоки для наших виртуалок, например:

[br_servers] #имя группы для брокера, в имени не должно быть  тире "-" 
redos-ansb-b1 ansible_host=10.10.10.10

[br_servers:vars] #общие параметры для группы выше 
ansible_port=22 
ansible_user=admin #локальный админ на виртуальных машинах

[ts_servers] #имя группы для ts'ов, в имени не должно быть  тире "-" 
redos-ansb-t1 ansible_host=10.10.10.20
redos-ansb-t2 ansible_host=10.10.10.30

[ts_servers:vars] #общие параметры для группы выше 
ansible_port=22 
ansible_user=admin #локальный админ на виртуальных машинах 

Для каждой развернутой виртуалки делаем ssh-copy-id admin@<ip виртуалки>

Вот код плейбука /etc/ansible/deploy_x2go_BROKER.yml для брокера.

---
- name: deploy_x2go_BROKER
  hosts: br_servers
  become: yes
  become_method: sudo

  vars_prompt:
    - name: domain_admin_account
      prompt: "Имя аккаунта домена [account@example.org]"
      private: no

    - name: domain_admin_account_pass
      prompt: "Введите пароль"
      private: true
      unsafe: true

    - name: subnet_for_share
      prompt: "Подсеть где располагаются все TS сервера [10.10.10.0/24]"
      private: no

    - name: list_ts_server
      prompt: "Имена ts будущих серверов через запятую [ts01.example.org,ts02.example.org]"
      private: no

    - name: path_to_app
      prompt: "Путь до приложения [/opt/1cv8/x86_64/8.3.22.1851/1cv8c]"
      private: no

  vars:
     ad_domain: example.org
     cur_hostname: "{{ inventory_hostname }}"
     ad_user: "{{ domain_admin_account }}"
     ad_user_pswd: "{{ domain_admin_account_pass }}"
     ad_ou: OU=Computers,OU=Default
     dc: rootdc.example.org
     ip_broker: "{{ ansible_default_ipv4.address }}"

  roles:
    - {role: 'joinToDomain', tags: 'joinToDomain'}
    - {role: 'installx2goBroker', tags: 'installx2goBroker'}
    - {role: 'installx2go1Cbroker', tags: 'installx2go1Cbroker'}
    - {role: 'changex2goSessionProfiles', tags: 'changex2goSessionProfiles'}
cat /etc/ansible/roles/installx2goBroker/tasks/main.yml
  - name: Update system
    dnf:
      name: "*"
      state: latest

  - name: Install 'Printing Client'
    dnf: name="@Printing Client"

  - name: Install X2go Broker packages
    dnf:
      name:
        - x2gobroker
        - x2gobroker-common
        - x2gobroker-ssh
        - x2gobroker-daemon
        - x2gobroker-authservice

  - name: HOSTS - Add server
    ansible.builtin.lineinfile:
      path: /etc/hosts
      line: "{{ ip_broker }} x2goserver"
      backup: yes

  - name: Creating a key for connecting to ts servers
    command: x2gobroker-keygen

  - name: Install loadchecker
    dnf:
      name: x2gobroker-loadchecker

  - name: Start and Enable x2gobroker-authservice service
    ansible.builtin.service:
      name: x2gobroker-authservice
      state: started
      enabled: yes

  - name: Start and Enable x2gobroker-authservice service
    ansible.builtin.service:
      name: x2gobroker-daemon
      state: started
      enabled: yes

cat /etc/ansible/roles/installx2go1Cbroker/tasks/main.yml
  - name: Install 'NFS'
    dnf:
      name:
        - nfs-utils
        - nfs4-acl-tools

  - name: Create folder for share
    ansible.builtin.file:
      path: /usr/share/1C/config
      state: directory

  - name: EXPORTS - Add share to system
    ansible.builtin.lineinfile:
      path: /etc/exports
      line: "/usr/share/1C/config/ {{ subnet_for_share }}(ro,insecure,nohide,all_squash,anonuid=1000,anongid=1000,no_subtree_check)"
      backup: yes

  - name: Copy file ibases.v8i in share folder
    copy:
      src: "{{ role_path }}/files/ibases.v8i"
      dest: /usr/share/1C/config/ibases.v8i

  - name: Copy file 1cestart.cfg in share folder
    copy:
      src: "{{ role_path }}/files/1cestart.cfg"
      dest: /usr/share/1C/config/1cestart.cfg

  - name: Exportfs
    command: exportfs -ra

  - name: Start and Enable nfs-service
    ansible.builtin.service:
      name: nfs-server.service
      state: started
      enabled: yes

cat /etc/ansible/roles/changex2goSessionProfiles/tasks/main.yml
  - name:  Backup file 'x2gobroker-sessionprofiles.conf'
    command: cp /etc/x2go/broker/x2gobroker-sessionprofiles.conf /etc/x2go/broker/x2gobroker-sessionprofiles.bak.{{ lookup('pipe', 'date +%Y%m%d-%H%M') }}

  - name: Remove old file 'x2gobroker-sessionprofiles.conf'
    command: rm /etc/x2go/broker/x2gobroker-sessionprofiles.conf

  - name: Create new file 'x2gobroker-sessionprofiles.conf'
    file:
      path: "/etc/x2go/broker/x2gobroker-sessionprofiles.conf"
      state: touch

  - name: Insert APP block in 'x2gobroker-sessionprofiles.conf'
    ansible.builtin.blockinfile:
      path: /etc/x2go/broker/x2gobroker-sessionprofiles.conf
      block: |
        [x2goserver-1C]
        name=1C
        host={{ list_ts_server }}
        command={{ path_to_app }}
        usebrokerpass=true
        broker-session-autologin=true
        broker-authorized-keys=/var/lib/x2gobroker/.ssh/authorized_keys

Проигрываем плейбук:

ansible-playbook /etc/ansible/deploy_x2go_BROKER.yml --ask-become-pass

Отвечаем на вопросы. Далее идет установка и настройка всего что нужно для работы брокера. В процессе виртуалка будет перезагружена.

Перед настройкой терминальных серверов необходимо убедиться, что по пути "/etc/ansible/roles/installx2go1Cts/files/" лежит нужный дистрибутив 1С, с расширением ".run". В этом примере(и скрипте) используется "setup-thin-8.3.22.1851-x86_64.run"

Вот код плейбука /etc/ansible/deploy_x2go_TS.yml для терминального сервера.

---
- name: deploy_x2go_TS
  #hosts: '{{ GROUPHOSTS }}'
  hosts: ts_servers
  become: yes
  become_method: sudo

  vars_prompt:
    - name: domain_admin_account
      prompt: "Имя аккаунта домена [account@example.com]"
      private: no

    - name: domain_admin_account_pass
      prompt: "Введите пароль"
      private: true
      unsafe: true

    - name: ip_broker
      prompt: "IP broker"
      private: no

    - name: app_distrib_name
      prompt: "Имя дистрибутива для установки ПО [setup-thin-8.3.22.1851-x86_64.run]"
      private: no

  vars:
     ad_domain: example.com
     cur_hostname: "{{ inventory_hostname }}"
     ad_user: "{{ domain_admin_account }}"
     ad_user_pswd: "{{ domain_admin_account_pass }}"
     ad_ou: OU=Computers,OU=Default
     dc: rootdc.example.com

  roles:
    - {role: 'joinToDomain', tags: 'joinToDomain'}
    - {role: 'installx2goTS', tags: 'installx2goTS'}
    - {role: 'installx2go1Cts' , tags: 'installx2go1Cts'}
cat /etc/ansible/roles/installx2goTS/tasks/main.yml
  - name: Update system
    dnf:
      name: "*"
      state: latest

  - name: Install 'Printing Client'
    dnf: name="@Printing Client"

  - name: Install X2go Server packages
    dnf:
      name:
        - x2gobroker
        - x2goserver
        - x2goserver-printing
        - cups-x2go
        - x2goserver-xsession

  - name: HOSTS - Add broker server
    ansible.builtin.lineinfile:
      path: /etc/hosts
      line: "{{ ip_broker }} x2goserver"
      backup: yes

  - name: Start and Enable x2gocleansessions service
    ansible.builtin.service:
      name: x2gocleansessions
      state: started
      enabled: yes

  - name: Install 'x2gobroker-agent'
    dnf:
      name: x2gobroker-agent

  - name: Create folder for certs
    ansible.builtin.file:
      path: /var/lib/x2gobroker/
      state: directory

  - name: Create pubkeyauthorizer
    command: "x2gobroker-pubkeyauthorizer --broker-url http://{{ ip_broker }}:8080/pubkeys/"

cat /etc/ansible/roles/installx2go1Cts/tasks/main.yml
  - name: Copy distrib 1C
    copy:
      src: "{{ role_path }}/files/setup-thin-8.3.22.1851-x86_64.run"
      dest: /tmp/setup-thin-8.3.22.1851-x86_64.run
      mode: 777

  - name: Install 1C
    command: "/tmp/setup-thin-8.3.22.1851-x86_64.run --mode unattended"

  - name: Remove distrib 1C
    ansible.builtin.file:
      path: /tmp/setup-thin-8.3.22.1851-x86_64.run
      state: absent

  - name: Install 'nfs-utils'
    dnf: name=nfs-utils

  - name: FSTAB - Add broker server
    ansible.builtin.lineinfile:
      path: /etc/fstab
      line: "{{ ip_broker }}:/usr/share/1C/config/    /mnt/1C/config/              nfs     defaults,auto   0       0"
      backup: yes

  - name: Create folder for mount  share
    ansible.builtin.file:
      path: /mnt/1C/config/
      state: directory
      mode: '777'

  - name: Mount an NFS share
    command: "mount -t nfs {{ ip_broker }}:/usr/share/1C/config/ /mnt/1C/config/"

  - name: Create folder into SKEL
    ansible.builtin.file:
      path: /etc/skel/.1C/1cestart
      state: directory

  - name: Create limlink
    command: "ln -s /mnt/1C/config/1cestart.cfg /etc/skel/.1C/1cestart/1cestart.cfg"

Запускаем скрипт и вводим нужную информацию:

ansible-playbook /etc/ansible/deploy_x2go_TS.yml --ask-become-pass

Для работы на ферме x2go необходим клиент (x2goClient) на машине пользователей. Для этого необходимо создать политику "(U) Deploy x2goClient and lnk", в которой:

  • копируется сам клиент на машину в профиль пользователя "%userprofile%\AppData\Local\x2goclient"

  • копируется нужный ярлык на рабочий стол пользователя %DesktopDir%\x2goClient.lnk

В ярлыке прописывается ключ --broker-url, который указывает на брокер фермы где указывается нужно приложение (например, --broker-url=http://broker-01.example.com:8080/plain/).

При наличии в сети нескольких ферм, необходимо создать отдельный ярлык в папке политики, с указанием соответствующего брокера, запись в GPP (User Configuration –> Preferences -> Windows Settings -> Files) и сделать "нацеливание" на AD группу, которая относится к новой ферме.

Статья является плодом коллективного труда моих сотрудников, произведённого под моим чутким руководством. В очередной раз говорю спасибо моим бравым парням, они молодцы!

Ну и для повышения градуса дискуссии, ссылка на мой ТГ-канал!

Теги:
Хабы:
Всего голосов 5: ↑5 и ↓0+5
Комментарии28

Публикации

Работа

DevOps инженер
28 вакансий
Аналитик 1С
3 вакансии
Программист 1С
43 вакансии
Консультант 1С
69 вакансий

Ближайшие события