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

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

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

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

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

Если будет использоваться внешняя СУБД, нужно установить RabbitMQ-server на один из узлов c компонентами Termidesk или на отдельный узел.

  • на всех узлах настроены статические IP-адреса;
  • на всех узлах настроена синхронизация времени от единого источника.

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

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

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

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

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

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

  • «Универсальный диспетчер» (служба termidesk-vdi);
  • «Шлюз» (служба termidesk-gateway)

При установке «Универсального диспетчера» необходимо выбрать роль «Портал администратора» диалоговом окне псевдографического интерфейса инсталлятора. В общем случае может использоваться и/или роль «Портал пользователя»

disp1.termidesk.local

192.0.2.2 

192.0.2.1 (виртуальный IP-адрес)

Сервер Termidesk 2

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

  • «Универсальный диспетчер» (служба termidesk-vdi);
  • «Шлюз» (служба termidesk-gateway).

При установке «Универсального диспетчера» необходимо выбрать роль «Портал администратора» диалоговом окне псевдографического интерфейса инсталлятора. В общем случае может использоваться и/или роль «Портал пользователя»

disp2.termidesk.local

192.0.2.3

192.0.2.1 (виртуальный IP-адрес)

СУБД PostgreSQLУстановлены СУБД PostgreSQL и RabbitMQ-server (обе службы на одном узле)db.termidesk.local192.0.2.4

К виртуальному IP-адресу подключается программный клиент. Этот IP-адрес назначается в настройках VRRP и одинаков для обоих узлов Termidesk.

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

1) устанавливается узел с компонентами СУБД и RabbitMQ-server (обе службы на одном узле). Выполняется настройка СУБД;

2) устанавливается основной узел Termidesk с компонентом «Универсальный диспетчер» (при установке выбирается роль «Портал администратора»), на этот же узел устанавливается «Шлюз» из пакета termidesk-gateway;

3) с основного узла Termidesk на резервные копируется каталог /etc/opt/termidesk-vdi вместе с его содержимым;

4) устанавливаются резервные узлы Termidesk;

5) проверяется работоспособность узлов Termidesk;

6) выполняется настройка узлов в режиме высокой доступности.

Установка и настройка СУБД Postgres-11

Процесс установки СУБД Postgres-11 и брокера сообщений RabbitMQ-server не отличается от процесса, описанного в разделе Подготовка среды функционирования).

Для завершения настройки RabbitMQ-server нужно:

  • отредактировать файл 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/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)
BASH
  • затем отредактировать файл /etc/postgresql/11/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-taskman, не добавляя ее в раздел автоматической загрузки:
:~$ sudo systemctl start termidesk-taskman
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

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

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

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

:~$ sudo systemctl -a | grep termidesk
BASH

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

admin@disp1.termidesk.local:~$ sudo systemctl -a | grep termidesk
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
BASH

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

admin@disp1.termidesk.local:~$ sudo systemctl -a | grep termidesk
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
BASH

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

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

Действия по настройке узлов будут идентичными приведенным в подразделе Настройка «Менеджера рабочего места» в режиме высокой доступности документа СЛЕТ.10001-01 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
	}
}
BASH