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

от автора

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

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

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

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


ссылка на оригинал статьи https://habr.com/ru/articles/799577/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *