Отказоустойчивая установка Termidesk
Отказоустойчивая установка Termidesk
Основные принципы отказоустойчивой установки
В Termidesk предусмотрена отказоустойчивая установка для сохранения работоспособности при возникновении нештатных ситуаций.
Описание применимо к ферме Termidesk.
Перечень условий для отказоустойчивой установки:
- брокер сообщений RabbitMQ устанавливается на одном узле с СУБД (в общем случае этот компонент может устанавливаться на отдельный узел, но в рамках настоящей процедуры данный вариант не рассматривается);
Если будет использоваться внешняя СУБД, нужно установить RabbitMQ на один из узлов c компонентами Termidesk или на отдельный узел.
- на всех узлах настроены статические IP-адреса;
- на всех узлах настроена синхронизация времени от единого источника.
Упрощенная схема отказоустойчивой установки представлена на рисунке.
Перечень обозначенных компонентов приведен в таблице.
Все примеры IP-адресов и FQDN должны быть заменены на актуальные, соответствующие схеме адресации, принятой в инфраструктуре организации. Следует учесть, что в примерах конфигурационных файлов и запросах также используются IP-адреса и FQDN из таблицы, в рабочей конфигурации их следует изменить на актуальные.
Обозначение на схеме | Установленные на узел компоненты | FQDN узла | IP-адрес |
---|---|---|---|
Сервер Termidesk 1 | Основной узел (master). Установлен с компонентами:
| disp1.termidesk.local | 192.0.2.2 192.0.2.1 (виртуальный IP-адрес) |
Сервер Termidesk 2 | Резервный узел (slave). Установлен с компонентами:
| disp2.termidesk.local | 192.0.2.3 192.0.2.1 (виртуальный IP-адрес) |
СУБД PostgreSQL | Установлены СУБД PostgreSQL и RabbitMQ (обе службы на одном узле) | db.termidesk.local | 192.0.2.4 |
К виртуальному IP-адресу подключается программный клиент. Этот IP-адрес назначается в настройках VRRP и одинаков для обоих узлов Termidesk.
Отказоустойчивая установка проводится в следующей последовательности:
1) на один узел устанавливаются СУБД и RabbitMQ. При установке следует учесть, что в БД должны отсутствовать записи (необходимо использовать чистую БД);
2) устанавливается основной узел Termidesk с компонентом «Универсальный диспетчер». При установке необходимо выбрать роль «Портал универсальный». Роль активируется при одновременном выборе ролей «Портал администратора» и «Портал пользователя» в диалоговом окне псевдографического интерфейса инсталлятора. На этот же узел устанавливается «Шлюз» из пакета termidesk-gateway
;
3) с основного узла Termidesk на резервные копируется каталог /etc/opt/termidesk-vdi
вместе с его содержимым;
4) устанавливаются резервные узлы Termidesk;
5) проверяется работоспособность узлов Termidesk;
6) выполняется настройка узлов в режиме высокой доступности.
Установка и настройка СУБД PostgreSQL
Процесс установки СУБД PostgreSQL и брокера сообщений RabbitMQ не отличается от процесса, описанного в разделе Подготовка среды функционирования.
Для завершения настройки RabbitMQ нужно:
- отредактировать файл
rabbitmq-env.conf
,
# Defaults to rabbit. This can be useful if you want to run more than one node # per machine - RABBITMQ_NODENAME should be unique per erlang-node-and-machine # combination. See the clustering on a single machine guide for details: # http://www.rabbitmq.com/clustering.html#single-machine #NODENAME=rabbit # By default RabbitMQ will bind to all interfaces, on IPv4 and IPv6 if # available. Set this if you only want to bind to one network interface or# # address family. NODE_IP_ADDRESS=0.0.0.0 # Defaults to 5672. NODE_PORT=5672
- сохранить файл и перезапустить службу
rabbitmq-server
:
sudo systemctl restart rabbitmq-server
СУБД должна быть настроен так, чтобы она могла принимать подключения с узлов Termidesk, для этого нужно:
- отредактировать файл
/etc/postgresql/11/main/postgresql.conf
: в разделеCONNECTIONS AND AUTHENTICATION
изменить строкуlisten_addresses
, заменивlocalhost
на «*». Пример:
#------------------------------------------------------------------------------ # CONNECTIONS AND AUTHENTICATION #------------------------------------------------------------------------------ # - Connection Settings - listen_addresses = '*' # what IP address(es) to listen on; # comma-separated list of addresses; # defaults to 'localhost'; use '*' for all # (change requires restart) port = 5432 # (change requires restart)
- отредактировать файл
/etc/postgresql/<версия СУБД PostgreSQL>/main/pg_hba.conf
: в разделе#IPv4 local connections
в столбцеADDRESS
текущее значение нужно изменить наall
. Пример:
# TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all peer # IPv4 local connections: host all all all md5 # IPv6 local connections: host all all ::1/128 md5 # Allow replication connections from localhost, by a user with the # replication privilege. local replication all peer host replication all 127.0.0.1/32 md5 host replication all ::1/128 md5
- сохранить файлы и перезапустить службу
postgresql
:
sudo systemctl restart postgresql
Установка основного узла Termidesk
Процесс установки основного узла Termidesk аналогичен комплексной установке Termidesk: при установке выбираются роли «Портал администратора», «Портал пользователя», «Менеджер рабочих мест (очереди)». Компонент «Шлюз» устанавливается на этот же узел из пакета termidesk-gateway
.
После установки необходимо:
- скорректировать файл конфигурации веб-сервера
/etc/apache2/apache2.conf
. Для этого нужно найти и раскомментировать строку с параметромAstraMode
, далее присвоить данному параметру значениеoff
, точно соблюдая отступы и пробелы в файле:
# Astra security mode # AstraMode off
- запустить службу
termidesk-taskman
, не добавляя ее в раздел автоматической загрузки:
sudo systemctl start termidesk-taskman
Перенос каталога с конфигурационными файлами и ключами
Настройки основного узла Termidesk используются как эталонные для остальных узлов Ternidesk.
После установки основного узла Termidesk нужно передать каталоги /etc/opt/termidesk-vdi
и /etc/termidesk/
на остальные узлы Termidesk:
sudo scp -r /etc/opt/termidesk-vdi localuser@ipaddr_or_fqdn_host:/home/user/ sudo scp -r /etc/termidesk localuser@ipaddr_or_fqdn_host:/home/user/
где:
-r
- ключ для рекурсивной (со вложенными каталогами) передачи;
localuser
- имя пользователя целевого узла;
ipaddr_or_fqdn_host
- IP-адрес или FQDN целевого узла;
/home/user
- путь, куда будет скопирован каталог.
Перед началом установки остальных узлов необходимо переместить скопированные ранее каталоги:
sudo mv /home/user/termidesk-vdi /etc/opt/ sudo mv /home/user/termidesk /etc/
Установка резервных узлов Termidesk
Процесс установки резервных узлов Termidesk аналогичен установке основного узла, но в диалоге подключения к СУБД и RabbitMQ информация о подключении не заполняется. Действия после установки также аналогичны действиям, выполняемым на основном узле.
Проверка работоспособности узлов Termidesk
После установки нужно убедиться, что на основном и резервных узлах Termidesk правильно запущены службы, для этого выполнить на каждом узле:
sudo systemctl -a | grep termidesk
На основном узле вывод команды должен отображать, что активны и загружены все службы Termidesk, пример вывода:
admin@disp1.termidesk.localsudo systemctl -a | grep termidesk termidesk-celery-beat.service loaded active running Termidesk-VDI Celery Beat termidesk-celery-worker.service loaded active running Termidesk-VDI Celery Beat termidesk-taskman.service loaded active running Termidesk-VDI Taskman daemon termidesk-vdi.service loaded active running Termidesk-VDI daemon termidesk-gateway.service loaded active running Termidesk-Gateway daemon
На резервных узлах вывод команды должен отображать, что активны и загружены все службы, кроме termidesk-taskman
, пример вывода:
admin@disp1.termidesk.localsudo systemctl -a | grep termidesk termidesk-celery-beat.service loaded active running Termidesk-VDI Celery Beat termidesk-celery-worker.service loaded active running Termidesk-VDI Celery Beat termidesk-taskman.service inactive dead Termidesk-VDI Taskman daemon termidesk-vdi.service loaded active running Termidesk-VDI daemon termidesk-gateway.service loaded active running Termidesk-Gateway daemon
Затем необходимо проверить доступность резервных узлов по протоколу HTTPS, выполнив в веб-браузере переход по адресу: https://disp2.termidesk.local. Убедиться, что отобразилась страница входа в Termidesk.
Настройка узлов в режиме высокой доступности
Действия по настройке узлов будут идентичными приведенным в подразделе Настройка «Менеджера рабочего места» в режиме высокой доступности документа
СЛЕТ.10001-01 90 02 «Руководство администратора. Настройка программного комплекса» за исключением файла /etc/keepalived/keepalive
d.conf
.
Файл /etc/keepalived/keepalive
d.conf
должен быть приведен к виду (по очереди на каждом из узлов):
Значения параметров в файле keepalived.conf
приведены в качестве примера. Значения должны быть заменены на актуальные, соответствующие схеме адресации, принятой в инфраструктуре организации.
Параметры, явно подлежащие изменению, отмечены комментарием «# НУЖНО УКАЗАТЬ».
global_defs { router_id disp1.termidesk.local # НУЖНО УКАЗАТЬ: hostname хоста script_user user # НУЖНО УКАЗАТЬ: вместо user -> пользователь, от имени которого запускается keepalived enable_script_security } vrrp_script check_httpd { script "/usr/bin/pgrep apache" # path of the script to execute interval 1 # seconds between script invocations, default 1 second timeout 3 # seconds after which script is considered to have failed #weight <INTEGER:-254..254> # adjust priority by this weight, default 0 rise 1 # required number of successes for OK transition fall 2 # required number of successes for KO transition #user USERNAME [GROUPNAME] # user/group names to run script under init_fail # assume script initially is in failed state } # Для каждого виртуального IPv4-адреса создается свой экземпляр vrrp_instance vrrp_instance termidesk-taskman { notify /etc/keepalived/notify.sh # Initial state, MASTER|BACKUP # As soon as the other machine(s) come up, # an election will be held and the machine # with the highest priority will become MASTER. # So the entry here doesn't matter a whole lot. state BACKUP # interface for inside_network, bound by vrrp # НУЖНО УКАЗАТЬ: eth0 -> интерфейс, смотрящий в Интернет interface eth0 # arbitrary unique number from 0 to 255 # used to differentiate multiple instances of vrrpd # running on the same NIC (and hence same socket). # НУЖНО УКАЗАТЬ: вместо 2 -> номер экземпляра vrrp_instance virtual_router_id 2 # for electing MASTER, highest priority wins. # to be MASTER, make this 50 more than on other machines. # НУЖНО УКАЗАТЬ: вместо 128 -> приоритет экземпляра vrrp_instance priority 128 preempt_delay 5 # Seconds # VRRP Advert interval in seconds (e.g. 0.92) (use default) advert_int 1 # НУЖНО УКАЗАТЬ: вместо 192.0.2.1 -> IPv4-адрес интерфейса, смотрящего в Интернет unicast_src_ip 192.0.2.1 authentication { auth_type PASS # НУЖНО УКАЗАТЬ: ksedimret -> заменить на безопасный пароль auth_pass ksedimret } virtual_ipaddress { # В этой секции происходит назначение IP-алиаса # НУЖНО УКАЗАТЬ: вместо 192.0.2.1/24 -> виртуальный IPv4-адрес и сетевой префикс с интерфейса, смотрящего в Интернет # НУЖНО УКАЗАТЬ: вместо eth0 -> интерфейс, смотрящий в Интернет # НУЖНО УКАЗАТЬ: вместо eth0:106 -> интерфейс, смотрящий в Интернет:4-й октет виртуального IPv4-адреса 192.0.2.1/24 dev eth0 label eth0:106 } track_script { check_httpd } } vrrp_instance termidesk-vdi { notify /etc/keepalived/notify.sh # Initial state, MASTER|BACKUP # As soon as the other machine(s) come up, # an election will be held and the machine # with the highest priority will become MASTER. # So the entry here doesn't matter a whole lot. state BACKUP # interface for inside_network, bound by vrrp # НУЖНО УКАЗАТЬ: eth0 -> интерфейс, смотрящий в Интернет interface eth0 # arbitrary unique number from 0 to 255 # used to differentiate multiple instances of vrrpd # running on the same NIC (and hence same socket). # НУЖНО УКАЗАТЬ: вместо 107 -> номер экземпляра vrrp_instance virtual_router_id 107 # for electing MASTER, highest priority wins. # to be MASTER, make this 50 more than on other machines. # НУЖНО УКАЗАТЬ: вместо 128 -> приоритет экземпляра vrrp_instance priority 128 preempt_delay 5 # Seconds # VRRP Advert interval in seconds (e.g. 0.92) (use default) advert_int 1 # НУЖНО УКАЗАТЬ: вместо 192.0.2.3 -> IPv4-адрес интерфейса, смотрящего в Интернет unicast_src_ip 192.0.2.3 authentication { auth_type PASS # НУЖНО УКАЗАТЬ: ksedimret -> заменить на безопасный пароль auth_pass ksedimret } virtual_ipaddress { # В этой секции происходит назначение IP-алиаса # НУЖНО УКАЗАТЬ: вместо 192.0.2.1/24 -> виртуальный IPv4-адрес и сетевой префикс с интерфейса, смотрящего в Интернет # НУЖНО УКАЗАТЬ: вместо eth0 -> интерфейс, смотрящий в Интернет # НУЖНО УКАЗАТЬ: вместо eth0:107 -> интерфейс, смотрящий в Интернет:4-й октет виртуального IPv4-адреса 192.0.2.1/24 dev eth0 label eth0:107 } track_script { check_httpd } } vrrp_instance termidesk-gateway { notify /etc/keepalived/notify.sh # Initial state, MASTER|BACKUP # As soon as the other machine(s) come up, # an election will be held and the machine # with the highest priority will become MASTER. # So the entry here doesn't matter a whole lot. state BACKUP # interface for inside_network, bound by vrrp # НУЖНО УКАЗАТЬ: eth0 -> интерфейс, смотрящий в Интернет interface eth0 # arbitrary unique number from 0 to 255 # used to differentiate multiple instances of vrrpd # running on the same NIC (and hence same socket). # НУЖНО УКАЗАТЬ: вместо 108 -> номер экземпляра vrrp_instance virtual_router_id 108 # for electing MASTER, highest priority wins. # to be MASTER, make this 50 more than on other machines. # НУЖНО УКАЗАТЬ: вместо 64 -> приоритет экземпляра vrrp_instance priority 64 preempt_delay 5 # Seconds # VRRP Advert interval in seconds (e.g. 0.92) (use default) advert_int 1 # НУЖНО УКАЗАТЬ: вместо 192.0.2.2 -> IPv4-адрес интерфейса, смотрящего в Интернет unicast_src_ip 192.0.2.2 authentication { auth_type PASS # НУЖНО УКАЗАТЬ: ksedimret -> заменить на безопасный пароль auth_pass ksedimret } virtual_ipaddress { # В этой секции происходит назначение IP-алиаса # НУЖНО УКАЗАТЬ: вместо 192.0.2.1/24 -> виртуальный IPv4-адрес и сетевой префикс с интерфейса, смотрящего в Интернет # НУЖНО УКАЗАТЬ: вместо eth0 -> интерфейс, смотрящий в Интернет # НУЖНО УКАЗАТЬ: вместо eth0:108 -> интерфейс, смотрящий в Интернет:4-й октет виртуального IPv4-адреса 192.0.2.1/24 dev eth0 label eth0:108 } track_script { check_httpd } }