Настройка менеджера ВРМ в режиме высокой доступности

Настройка выполняется после установки программного комплекса в распределенной конфигурации.

Последовательность настройки узлов с менеджером ВРМ следующая:

  • на узле, выбранном в качестве master, помимо уже запущенных служб, запустить только службу termidesk-taskman, не добавляя ее в раздел автоматической загрузки:
:~$ sudo systemctl start termidesk-taskman
BASH
  • на узлах master и slave установить пакеты программ для организации высокой доступности:
:~$ sudo apt install -y keepalived ipset
BASH

где:

-y - ключ для пропуска подтверждения установки;

  • на узлах master и slave создать каталог /etc/keepalived/ (если каталог ранее не был создан):
:~$ sudo mkdir -p /etc/keepalived
BASH

где:

-p - ключ для создания подкаталогов в указанном пути, если их не существует;

  • на узлах master и slave в каталоге /etc/keepalived/ создать пустые файлы keepalived.conf (файл настроек режима высокой доступности) и notify.sh (управление переключениями режимов высокой доступности):
:~$ sudo touch /etc/keepalived/keepalived.conf
:~$ sudo touch /etc/keepalived/notify.sh
BASH
  • отредактировать созданный файл /etc/keepalived/keepalived.conf, приведя его к следующему виду (по очереди на каждом из узлов):

Значения параметров в файле keepalived.conf приведены в качестве примера. Значения должны быть заменены на актуальные, соответствующие схеме адресации, принятой в инфраструктуре предприятия.

global_defs {

	router_id NAME_OF_ROUTER_ID # НУЖНО УКАЗАТЬ: 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).
	# НУЖНО УКАЗАТЬ: вместо 106 -> номер экземпляра vrrp_instance
	virtual_router_id 106

	# 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

	# НУЖНО УКАЗАТЬ: вместо IP_ADDRESS_OF_THIS_HOST -> IPv4-адрес интерфейса, смотрящего в Интернет
	unicast_src_ip IP_ADDRESS_OF_THIS_HOST
        
	authentication {        
		auth_type PASS
		# НУЖНО УКАЗАТЬ: ksedimret -> заменить на безопасный пароль
		auth_pass ksedimret
	}
                         
	virtual_ipaddress {
		# НУЖНО УКАЗАТЬ: вместо VIRTUAL_IP_ADDREESS/MASK -> виртуальный IPv4-адрес и сетевой префикс с интерфейса, смотрящего в Интернет
		# НУЖНО УКАЗАТЬ: вместо eth0 -> интерфейс, смотрящий в Интернет
		# НУЖНО УКАЗАТЬ: вместо eth0:<значение> -> интерфейс, смотрящий в Интернет:4-й октет виртуального IPv4-адреса
		VIRTUAL_IP_ADDREESS/MASK dev eth0 label eth0:<значение>
	}
                
	track_script {
		check_httpd
	}
}
BASH

где:

script_user - значение этого параметра соответствует наименованию пользователя, от имени которого запускается служба keepalived (обычно - root);

NAME_OF_ROUTER_ID - имя зоны маршрутизации VRRP (общее для узлов master и slave);

IP_ADDREESS_OF_THIS_HOST - текущий статический IP-адрес узла, на котором запускается служба keepalived;

VIRTUAL_IP_ADDRESS/MASK - виртуальный статический IP-адрес и маска (общие для узлов master и slave);

eth0:<значение> - значение четвертого октета виртуального IPv4-адреса. Например, если используется виртуальный статический IP-адрес 192.0.2.30, то данный параметр примет значение eth0:30;

В рамках одной распределенной установки значение NAME_OF_ROUTER_ID параметра router_id должно быть идентичным. Если в сети или в одном VLAN присутствуют несколько распределенных установок Termidesk, то значение NAME_OF_ROUTER_ID параметра router_id должно быть уникальным для каждого экземпляра установки.

  • по очереди на каждом из узлов master и slave  отредактировать созданный файл /etc/keepalived/notify.sh, приведя его к следующему виду:
#!/bin/sh -e

SELF_BIN=$(realpath ${0})
SELF_DIR=$(dirname ${SELF_BIN})
TYPE=${1}
NAME=${2}
STATE=${3}
PRIORITY=${4}
TASKMAN_SYSTEMCTL_NAME="termidesk-taskman"
TASKMAN_SYSTEMCTL_DESCRIPTION="Termidesk-VDI Taskman daemon"
TASKMAN_SYSTEMCTL_PIDFILE="/run/termidesk-taskman/pid"
msg2log () {
	logger -i "Termidesk: ${1}"
}
taskman_stop () {
	msg2log "Stopping ${TASKMAN_SYSTEMCTL_NAME} service"
	systemctl is-active -q ${TASKMAN_SYSTEMCTL_NAME} && systemctl stop -q ${TASKMAN_SYSTEMCTL_NAME}
}
taskman_start () {
	msg2log "Starting ${TASKMAN_SYSTEMCTL_NAME} service"
	systemctl is-active -q ${TASKMAN_SYSTEMCTL_NAME} || systemctl start -q ${TASKMAN_SYSTEMCTL_NAME}
}
# VRRP event type: INSTANCE, name: lsb_40, state: BACKUP, priority: 64
msg2log "VRRP event type: ${TYPE}, name: ${NAME}, state: ${STATE}, priority: ${PRIORITY}"
case ${STATE} in
	BACKUP)
		[ "${NAME}" = "${TASKMAN_SYSTEMCTL_NAME}" ] && taskman_stop
	;;
	FAULT)
		[ "${NAME}" = "${TASKMAN_SYSTEMCTL_NAME}" ] && taskman_stop
	;;
	MASTER)
		[ "${NAME}" = "${TASKMAN_SYSTEMCTL_NAME}" ] && taskman_start
	;;
	*)
		msg2log "Error: unknown state ${STATE}"
		exit 1
	;;
esac
exit 0
BASH
  • на узлах master и slave сделать файл notify.sh исполняемым:
:~$ sudo chmod +x /etc/keepalived/notify.sh
BASH
  • на узлах master и slave добавить в автоматическую загрузку и запустить сервис keeaplived:
:~$ sudo systemctl enable keepalived
:~$ sudo systemctl start keepalived
BASH