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

e4ce96cb49b0063eeb6e6eb90ef866e6.png

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

Для доступа пользователей к решениям на базе платформы 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@

Вот код плейбука /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 группу, которая относится к новой ферме.

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

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

© Habrahabr.ru