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