Терминальная ферма 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@
Вот код плейбука /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 группу, которая относится к новой ферме.
Статья является плодом коллективного труда моих сотрудников, произведённого под моим чутким руководством. В очередной раз говорю спасибо моим бравым парням, они молодцы!
Ну и для повышения градуса дискуссии, ссылка на мой ТГ-канал!