Отказоустойчивая установка Termidesk

Основные принципы отказоустойчивой установки

В Termidesk предусмотрена отказоустойчивая установка для сохранения работоспособности при возникновении нештатных ситуаций. 

Описание применимо к ферме Termidesk.

Перечень условий для отказоустойчивой установки:

  • брокер сообщений RabbitMQ устанавливается на одном узле с СУБД (в общем случае этот компонент может устанавливаться на отдельный узел, но в рамках настоящей процедуры данный вариант не рассматривается);

При использовании внешней по отношению к Termidesk СУБД, следует установить брокер сообщений RabbitMQ на отдельный узел.

  • на всех узлах настроены статические IP-адреса;
  • на всех узлах настроена синхронизация времени от единого источника;
  • в инфраструктуре организации должна работать служба DNS, которая должна правильно разрешать имена всех узлов фермы Termidesk в IP-адреса.

Упрощенная схема отказоустойчивой установки фермы Termidesk приведена на рисунке.

Отказоустойчивая схема установки Termidesk

Перечень обозначенных компонентов приведен в таблице.

Все примеры IP-адресов и FQDN должны быть заменены на актуальные, соответствующие схеме адресации, принятой в инфраструктуре организации. Следует учесть, что в примерах конфигурационных файлов и запросах также используются IP-адреса и FQDN из таблицы, в рабочей конфигурации их следует изменить на актуальные.

Перечень компонентов для отказоустойчивой установки
Обозначение на схемеУстановленные на узел компонентыFQDN узла

Ферма Termidesk

«Сервер Termidesk 1»

Основной узел (master). Установлен с компонентами:

  • «Универсальный диспетчер» (служба termidesk-vdi)  с ролью «Портал универсальный»;
  • «Менеджер рабочих мест» (службы termidesk-celery-beat и termidesk-celery-worker);
  • «Шлюз» (служба termidesk-gateway)
disp1.termidesk.local
«Сервер Termidesk 2»

Резервный узел (slave). Установлен с компонентами:

  • «Универсальный диспетчер» (служба termidesk-vdi)  с ролью «Портал универсальный»;
  • «Менеджер рабочих мест» (службы termidesk-celery-beat и termidesk-celery-worker);
  • «Шлюз» (служба termidesk-gateway)
disp2.termidesk.local
«Сервер СУБД и RabbitMQ 1»Установлены СУБД PostgreSQL и RabbitMQ (обе службы на одном узле)db1.termidesk.local

Отказоустойчивая установка фермы Termidesk проводится в следующей последовательности:

1) на одном узле устанавливаются СУБД  и RabbitMQ. При установке следует учесть, что в БД должны отсутствовать записи (необходимо использовать чистую БД);

При использовании внешней по отношению к Termidesk СУБД, следует установить брокер сообщений 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
BASH
  • сохранить файл и перезапустить службу rabbitmq-server:
sudo systemctl restart rabbitmq-server
BASH

СУБД должна быть настроен так, чтобы она могла принимать подключения с узлов Termidesk, для этого нужно:

  • отредактировать файл /etc/postgresql/15/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)
BASH
  • отредактировать файл /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
BASH
  • сохранить файлы и перезапустить службу postgresql:
sudo systemctl restart postgresql
BASH

Установка основного узла Termidesk

Процесс установки основного узла Termidesk аналогичен комплексной установке Termidesk: при установке выбираются роли «Портал администратора», «Портал пользователя», «Менеджер рабочих мест». Компонент «Шлюз» устанавливается на этот же узел из пакета termidesk-gateway.

После установки необходимо:

  • скорректировать файл конфигурации веб-сервера /etc/apache2/apache2.conf. Для этого нужно найти и раскомментировать строку с параметром AstraMode, далее присвоить данному параметру значение off, точно соблюдая отступы и пробелы в файле:
# Astra security mode
#
AstraMode off
BASH
  • если в инфраструктуре Termidesk будет использоваться портал «Агрегатор» («Агрегатор администратора» и/или «Агрегатор пользователя»), то после установки нужно обязательно задать сертификат для расшифровки JWT-токена. Сертификат может быть задан через файл /etc/opt/termidesk-vdi/termidesk.conf (параметры AGGREGATOR_JWT_SSL_CERT и AGGREGATOR_JWT_SSL_CERT_SECOND) или через утилиту termidesk-config.

После установки параметры компонентов «Универсальный диспетчер» и «Менеджер рабочих мест» могут быть изменены через файл /etc/opt/termidesk-vdi/termidesk.conf (см. подраздел Параметры конфигурирования компонентов «Универсальный диспетчер», «Менеджер рабочих мест» документа СЛЕТ.10001-01 90 02 «Руководство администратора. Настройка программного комплекса») или через утилиту termidesk-config (см. подраздел Утилита termidesk-config документа СЛЕТ.10001-01 90 02 «Руководство администратора. Настройка программного комплекса»).

После установки компонента «Шлюз» выполнить:

  • привести файл /etc/termidesk/gateway.yaml к виду согласно подразделу Параметры конфигурирования компонента документа СЛЕТ.10001-01 90 05 «Руководство администратора. Настройка компонента «Шлюз». Задать актуальные значения IP-адресов (или FQDN) параметрам:
    • url: ${urlCheckToken} - для обслуживания API-запросов по валидации подключений, запрашиваемых «Универсальным диспетчером» через «Шлюз»;
    • url: ${coordinatorUrl} - для подключения к RabbitMQ;
  • сохранить файл, а затем перезапустить службу:
sudo systemctl restart termidesk-gateway
BASH

Перенос каталога с конфигурационными файлами и ключами

Настройки основного узла  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/
BASH

где:

-r - ключ для рекурсивной (со вложенными каталогами) передачи;

localuser - имя пользователя целевого узла;

ipaddr_or_fqdn_host - IP-адрес или FQDN целевого узла;

/home/user - путь, куда будет скопирован каталог.

Перед началом установки остальных узлов необходимо выполнить на них:

  • переместить скопированные ранее каталоги:
sudo mv /home/user/termidesk-vdi /etc/opt/
sudo mv /home/user/termidesk /etc/
BASH
  • назначить права по использованию ключа и сертификата пользователю termidesk-gateway:
sudo chown termidesk-gateway:termidesk-gateway /etc/termidesk/ssl-cert-snakeoil.*
BASH
  • предоставить права на чтение ключа и сертификата:
sudo chmod 640 /etc/termidesk/ssl-cert-snakeoil.key
sudo chmod 644 /etc/termidesk/ssl-cert-snakeoil.pem
BASH

Установка резервных узлов Termidesk

Процесс установки резервных узлов Termidesk аналогичен установке основного узла, но в диалоге подключения к СУБД и RabbitMQ информация о подключении не заполняется. Действия после установки также аналогичны действиям, выполняемым на основном узле.

Проверка работоспособности узлов Termidesk

После установки нужно убедиться, что на основном и резервных узлах Termidesk правильно запущены службы, для этого выполнить на каждом узле: 

sudo systemctl -a | grep termidesk
BASH

На основном узле вывод команды должен отображать, что активны и загружены все службы 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-vdi.service loaded active running Termidesk-VDI daemon
termidesk-gateway.service loaded active running Termidesk-Gateway daemon
BASH

На резервных узлах вывод команды должен отображать, что активны и загружены все службы, пример вывода:

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-vdi.service loaded active running Termidesk-VDI daemon 
termidesk-gateway.service loaded active running Termidesk-Gateway daemon
BASH

Затем необходимо проверить доступность резервных узлов по протоколу HTTPS,  выполнив в веб-браузере переход по адресу: https://disp2.termidesk.local. Убедиться, что отобразилась страница входа в Termidesk. 

Настройка узлов в режиме высокой доступности 

Начиная с Termidesk версии 6.0 служба termidesk-taskman исключена из компонента «Менеджер рабочих мест». Конфигурационный файл изменен по сравнению с предыдущими версиями.

После исключения службы termidesk-taskman настройка службы keepalived нужна только для резервирования (посредством network failover - конфигурация «Active - Passive»):

  • узлов RabbitMQ;
  • балансировщиков нагрузки (nginx/haproxy)
  • серверов «Удаленного помощника» (при его использовании).

Последовательность настройки узлов:

  • на узлах master и slave установить пакеты программ для организации высокой доступности:
sudo apt install -y keepalived ipset
BASH
  • на узлах master и slave создать каталог /etc/keepalived/ (если каталог ранее не был создан):
sudo mkdir -p /etc/keepalived
BASH
  • на узлах master и slave в каталоге /etc/keepalived/ создать пустой файл keepalived.conf (файл настроек режима высокой доступности):
sudo touch /etc/keepalived/keepalived.conf
BASH
  • отредактировать созданный файл /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" 
	interval 1
	timeout 3
	rise 1
	fall 2
	init_fail
}

# Для каждого виртуального IPv4-адреса создается свой экземпляр vrrp_instance
vrrp_instance termidesk-celery {

	state BACKUP

	# НУЖНО УКАЗАТЬ: eth0 -> интерфейс, смотрящий в Интернет
	interface eth0

	# НУЖНО УКАЗАТЬ: вместо 2 -> номер экземпляра vrrp_instance
	virtual_router_id 2

	# НУЖНО УКАЗАТЬ: вместо 128 -> приоритет  экземпляра vrrp_instance
	priority 128
	
	preempt_delay 5 # значение в секундах
	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 {
	
	state BACKUP

	# НУЖНО УКАЗАТЬ: eth0 -> интерфейс, смотрящий в Интернет
	interface eth0

	# НУЖНО УКАЗАТЬ: вместо 107 -> номер экземпляра vrrp_instance
	virtual_router_id 107

	# НУЖНО УКАЗАТЬ: вместо 128 -> приоритет  экземпляра vrrp_instance
	priority 128
	
	preempt_delay 5
	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 {
	
	state BACKUP

	# НУЖНО УКАЗАТЬ: eth0 -> интерфейс, смотрящий в Интернет
	interface eth0

	# НУЖНО УКАЗАТЬ: вместо 108 -> номер экземпляра vrrp_instance
	virtual_router_id 108

	# НУЖНО УКАЗАТЬ: вместо 64 -> приоритет  экземпляра vrrp_instance
	priority 64
	
	preempt_delay 5
	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
	}
}
BASH
  • на узлах master и slave добавить в автоматическую загрузку и запустить сервис keeaplived:

sudo systemctl enable keepalived
sudo systemctl start keepalived
BASH