В Termidesk предусмотрена отказоустойчивая установка для сохранения работоспособности при возникновении нештатных ситуаций. Описание применимо к ферме Termidesk. Перечень условий для отказоустойчивой установки: Если будет использоваться внешняя СУБД, нужно установить RabbitMQ на один из узлов c компонентами Termidesk или на отдельный узел. Упрощенная схема отказоустойчивой установки представлена на рисунке. Перечень обозначенных компонентов приведен в таблице. Все примеры IP-адресов и FQDN должны быть заменены на актуальные, соответствующие схеме адресации, принятой в инфраструктуре организации. Следует учесть, что в примерах конфигурационных файлов и запросах также используются IP-адреса и FQDN из таблицы, в рабочей конфигурации их следует изменить на актуальные. Основной узел (master). Установлен с компонентами: 192.0.2.2 192.0.2.1 (виртуальный IP-адрес) Резервный узел (slave). Установлен с компонентами: 192.0.2.3 192.0.2.1 (виртуальный IP-адрес) К виртуальному IP-адресу подключается программный клиент. Этот IP-адрес назначается в настройках VRRP и одинаков для обоих узлов Termidesk. Отказоустойчивая установка проводится в следующей последовательности: 1) на один узел устанавливаются СУБД и RabbitMQ. При установке следует учесть, что в БД должны отсутствовать записи (необходимо использовать чистую БД); 2) устанавливается основной узел Termidesk с компонентом «Универсальный диспетчер». При установке необходимо выбрать роль «Портал универсальный». Роль активируется при одновременном выборе ролей «Портал администратора» и «Портал пользователя» в диалоговом окне псевдографического интерфейса инсталлятора. На этот же узел устанавливается «Шлюз» из пакета 3) с основного узла Termidesk на резервные копируется каталог 4) устанавливаются резервные узлы Termidesk; 5) проверяется работоспособность узлов Termidesk; 6) выполняется настройка узлов в режиме высокой доступности. Процесс установки СУБД PostgreSQL и брокера сообщений RabbitMQ не отличается от процесса, описанного в разделе Подготовка среды функционирования. Для завершения настройки RabbitMQ нужно: СУБД должна быть настроен так, чтобы она могла принимать подключения с узлов Termidesk, для этого нужно: Процесс установки основного узла Termidesk аналогичен комплексной установке Termidesk: при установке выбираются роли «Портал администратора», «Портал пользователя», «Менеджер рабочих мест (очереди)». Компонент «Шлюз» устанавливается на этот же узел из пакета После установки необходимо: Настройки основного узла Termidesk используются как эталонные для остальных узлов Ternidesk. После установки основного узла Termidesk нужно передать каталоги где: Перед началом установки остальных узлов необходимо переместить скопированные ранее каталоги: Процесс установки резервных узлов Termidesk аналогичен установке основного узла, но в диалоге подключения к СУБД и RabbitMQ информация о подключении не заполняется. Действия после установки также аналогичны действиям, выполняемым на основном узле. После установки нужно убедиться, что на основном и резервных узлах Termidesk правильно запущены службы, для этого выполнить на каждом узле: На основном узле вывод команды должен отображать, что активны и загружены все службы Termidesk, пример вывода: На резервных узлах вывод команды должен отображать, что активны и загружены все службы, кроме Затем необходимо проверить доступность резервных узлов по протоколу HTTPS, выполнив в веб-браузере переход по адресу: https://disp2.termidesk.local. Убедиться, что отобразилась страница входа в Termidesk. Отказоустойчивая установка Termidesk
Основные принципы отказоустойчивой установки
Обозначение на схеме Установленные на узел компоненты FQDN узла IP-адрес Сервер Termidesk 1 termidesk-vdi) с ролью «Портал универсальный»; termidesk-gateway)disp1.termidesk.localСервер Termidesk 2 termidesk-vdi) с ролью «Портал универсальный»; termidesk-gateway)disp2.termidesk.localСУБД PostgreSQL Установлены СУБД PostgreSQL и RabbitMQ (обе службы на одном узле) db.termidesk.local192.0.2.4 termidesk-gateway; /etc/opt/termidesk-vdi вместе с его содержимым;Установка и настройка СУБД PostgreSQL
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
/etc/postgresql/<версия СУБД PostgreSQL>/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-gateway./etc/apache2/apache2.conf. Для этого нужно найти и раскомментировать строку с параметром AstraMode, далее присвоить данному параметру значение off, точно соблюдая отступы и пробелы в файле:# Astra security mode
#
AstraMode off
termidesk-taskman, не добавляя ее в раздел автоматической загрузки:sudo systemctl start termidesk-taskman
Перенос каталога с конфигурационными файлами и ключами
/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
sudo systemctl -a | grep 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
Настройка узлов в режиме высокой доступности
Действия по настройке узлов будут идентичными приведенным в подразделе Настройка менеджера ВРМ в режиме высокой доступности документа MultiExcerpt именем Децимальный номер не найден -- Проверьте имя страницы и имя MultiExcerpt используемые в MultiExcerpt-Include 90 02 «Руководство администратора. Настройка программного комплекса» за исключением файла /etc/keepalived/keepalived.conf.
Файл /etc/keepalived/keepalived.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
}
}