ha-cluster-pacemaker
ha-cluster-pacemaker
Роль для настройки и расширения базового кластера pacemaker на системах CentOS/RHEL 6/7/8/9, AlmaLinux 8/9, Rocky Linux 8/9, Fedora 31/32/33/34/35/36/37/38/39/40 и CentOS 8/9 Stream.
Эта роль может настраивать следующие аспекты кластера pacemaker:
- включить необходимые системные репозитории
- установить необходимые пакеты
- создать и настроить пользователей и группы для работы кластера pacemaker
- настроить файервол
- сгенерировать записи в
/etc/hosts
- авторизовать узлы кластера
- создать кластер или расширить кластер (проверьте
allow_cluster_expansion
)- кластер из "2 или более" узлов
- один сердечник, rrp или knet с до 8 связями
- удаленные узлы
- использовать автоматически обнаруженные или пользовательские интерфейсы/IP для сердечника
- запустить и включить кластер при загрузке
- настроить устройства stonith
- по умолчанию установить и настроить устройства
fence_xvm
- по желанию настроить
fence_kdump
- по желанию настроить
fence_vmware
(SOAP/REST) или любое другое устройствоfence_*
- по желанию настроить
fence_aws
- по умолчанию установить и настроить устройства
Роль полностью поддерживает режим --check
для настройки по умолчанию и частично поддерживает для большинства других опций.
При сообщении о проблеме, пожалуйста, укажите следующую информацию (если возможно):
- используемая версия ansible
- ОС, с которой запустили ansible
- playbook и файл инвентаризации, которые вызвали ошибку (удалите конфиденциальную информацию, где это уместно)
- сообщение об ошибке или описание неправильного поведения, с которым вы столкнулись
Требования
Эта роль зависит от роли ondrejhome.pcs-modules-2.
Ansible 2.8 или позже. (ПРИМЕЧАНИЕ: возможно использование более ранних версий, в случае проблем попробуйте обновить Ansible до 2.8+)
RHEL 6/7/8: Ожидается, что машины уже зарегистрированы. Роль по умолчанию включит доступ к каналу 'Высокая доступность' или 'Отказоустойчивое хранилище'. Если это не нужно, проверьте переменную enable_repos
.
RHEL/CentOS 7: Эта роль требует, как минимум, версию 2.9
библиотеки python-jinja2
. Если она отсутствует, вы можете столкнуться с ошибкой, описанной в вопросе #6. Чтобы получить обновленную версию python-jinja2
и ее зависимости, вы можете использовать следующий репозиторий RPM - https://copr.fedorainfracloud.org/coprs/ondrejhome/ansible-deps-el7/ для CentOS 7 и RHEL 7.
CentOS 8 Stream протестировано с версией 20240129, минимальная рекомендуемая версия ansible - 2.11.0, которая начинает идентифицировать систему как 'CentOS', а не 'RedHat' (в отличие от CentOS Linux). Устаревшие версии CentOS 8 Stream 20201211 минимальная рабочая версия ansible - 2.9.16/2.10.4. Версия 2.8.18 не работала на момент тестирования. Это связано с Служба в неизвестном состоянии #71528.
CentOS 9 Stream протестировано с версией 20240129 минимальная рекомендуемая версия ansible - 2.11.0.
Debian Buster протестировано с версией 20210310 с версией ansible 2.10 и Debian Bullseye протестировано с версией 20220326 с версией ansible 2.12. Часть роли для Debian не включает конфигурацию stonith и конфигурацию файервола. Примечание: Эта роль прошла лишь ограниченное тестирование на Debian - не все функции этой роли были протестированы.
Debian Bookworm протестировано с версией ansible 2.14 и Debian Bookworm. Часть роли для Debian не включает конфигурацию stonith и конфигурацию файервола. Примечание: Эта роль прошла лишь ограниченное тестирование на Debian - не все функции этой роли были протестированы.
Версия Ansible 2.9.10 и 2.9.11 будет завершаться ошибкой "'hostvars' is undefined"
при попытке настроить удаленные узлы. Это относится только к случаям, когда есть хотя бы один узел с cluster_node_is_remote=True
. Избегайте этих версий Ansible, если вы планируете настраивать удаленные узлы с помощью этой роли.
На CentOS Linux 8 вы должны убедиться, что репозитории BaseOS и Appstream работают должным образом. Поскольку CentOS Linux 8 находится на стадии завершения поддержки, эта роль настроит репозиторий HA на vault.centos.org, если запрошена конфигурация репозитория (enable_repos: true
) (что является значением по умолчанию).
Распределения версии pcs-0.11 (AlmaLinux 9, Rocky Linux 9, RHEL 9, Fedora 36/37/38) поддерживаются только с ondrejhome.pcs-modules-2 версии 27.0.0 или выше.
Переменные роли
пользователь, используемый для авторизации узлов кластера
cluster_user: 'hacluster'
пароль для пользователя, используемого для авторизации узлов кластера
cluster_user_pass: 'testtest'
группа, к которой принадлежит пользователь кластера (должна быть 'haclient')
cluster_group: 'haclient'
имя кластера
cluster_name: 'pacemaker'
настройка файервола для кластеризации, ПРИМЕЧАНИЕ: в RHEL/Centos 6 это заменяет файл конфигурации iptables!
cluster_firewall: true
включить кластер при загрузке на обычных (не pacemaker_remote) узлах
cluster_enable_service: true
настроить кластер с устройством fence_xvm ? Это скопирует /etc/cluster/fence_xvm.key на узлы и добавит устройства изоляции в кластер. ПРИМЕЧАНИЕ: вам необходимо определить 'vm_name' в инвентаризации для каждого узла кластера.
cluster_configure_fence_xvm: true
настроить кластер с устройством fence_vmware_soap/fence_vmware_rest ? Это установит агент fence_vmware_soap/fence_vmware_rest и настроит его. Когда это включено, вам необходимо указать 3 дополнительные переменные с информацией для доступа к vCenter. ПРИМЕЧАНИЕ: вам также нужно определить 'vm_name' в инвентаризации для каждого узла кластера, указывая имя или UUID виртуальной машины, как видно на гипервизоре или в выводе команды
fence_vmware_soap -o list
/fence_vmware_rest
.cluster_configure_fence_vmware_soap: false cluster_configure_fence_vmware_rest: false fence_vmware_ipaddr: '' fence_vmware_login: '' fence_vmware_passwd: ''
Вы можете по желанию изменить дополнительные параметры, передаваемые fence_vmware_soap/fence_vmware_rest, с помощью переменной
fence_vmware_options
. По умолчанию эта переменная включает шифрование, но отключает проверку сертификатов.fence_vmware_options: 'ssl="1" ssl_insecure="1"'
ПРИМЕЧАНИЕ: только одно из fence_vmware_soap/fence_vmware_rest может быть настроено, так как устройства stonith имеют одно и то же имя.
настроить кластер с устройством fence_kdump ? Это запускает службу kdump и определяет устройства stonith fence_kdump. ПРИМЕЧАНИЕ: если служба kdump не запущена, это не будет работать должным образом или вообще.
cluster_configure_fence_kdump: false
настроить кластер с устройством fence_aws? Вы должны указать идентификатор экземпляра/регион AWS и профиль экземпляра, который может запускать/останавливать экземпляры для этого кластера. Когда это включено, вам необходимо указать переменную
fence_aws_region
с информацией о регионе AWS. ПРИМЕЧАНИЕ: если вы не настроите профиль экземпляра, это не будет работать должным образом или вообще.cluster_configure_fence_aws: false fence_aws_region: ''
ПРИМЕЧАНИЕ: вам также нужно определить
instance_id
в инвентаризации для каждого узла кластера, указывая идентификатор экземпляра, как видно в веб-консоле AWS или в выводе командыfence_aws -o list
(man fence_aws).Вы можете по желанию изменить дополнительные параметры, передаваемые fence_aws, с помощью переменной
fence_aws_options
.fence_aws_options: ''
ПРИМЕЧАНИЕ: примеры правильных параметров для некоторых конкретных случаев использования можно найти в следующих документах.
https://access.redhat.com/articles/4175371#create-stonith
https://docs.aws.amazon.com/sap/latest/sap-hana/sap-hana-on-aws-cluster-resources-1.htmlКак сопоставить устройства изоляции с узлами кластера? По умолчанию для каждого узла кластера создается отдельное устройство stonith ('одно-устройство-на-узел'). Некоторые агенты изоляции могут изолировать несколько узлов с использованием одного и того же устройства stonith ('единое-устройство-на-кластер') и могут иметь проблемы при использовании нескольких устройств из-за ограничений на количество пользователей. Доступные варианты:
one-device-per-node
- (по умолчанию) - создается одно устройство stonith на узел кластераone-device-per-cluster
- (на поддерживаемых агентах изоляции) - создается только одно общее устройство stonith на весь кластер, поддерживаемые агенты:fence_vmware_rest
,fence_vmware_soap
,fence_xvm
,fence_kdump
cluster_configure_stonith_style: 'one-device-per-node'
(RHEL/CentOS/AlmaLinux/Rocky) включить репозитории, содержащие необходимые пакеты
enable_repos: true
(только для RHEL) включить расширенные репозитории обновлений (EUS), содержащие необходимые пакеты
enable_eus_repos: false
(только для RHEL) включить репозитории обновления SAP Solutions (E4S), содержащие необходимые пакеты
enable_e4s_repos: false
(только для RHEL) включить бета-репозитории, содержащие необходимые пакеты
enable_beta_repos: false
(только для RHEL) тип включаемых репозиториев, обратите внимание, что в репозиториях E4S доступен только тип 'ha'
- ha - Высокая доступность
- rs - Отказоустойчивое хранилище
repos_type: 'ha'
(только для RHEL) custom_repository позволяет включить репозиторий с произвольным именем. Имена репозиториев RHEL8 можно найти по адресу http://downloads.redhat.com/redhat/rhel/rhel-8-beta/rhel-8-beta.repo
custom_repository: ''
(только для CentOS) установить необходимые пакеты с CD-ROM, доступного по адресу /dev/cdrom
use_local_media: false
Включить или отключить веб-интерфейс PCSD. По умолчанию данная роль поддерживает настройку по умолчанию, это означает, что веб-интерфейс PCSD отключен на CentOS/RHEL 6.X и включен на CentOS/RHEL 7.X. Значения
true
илиfalse
могут быть переданы этой переменной, чтобы убедиться, что веб-интерфейс PCSD включен или отключен.enable_pcsd_gui: 'nochange'
Протокол передачи кластера. По умолчанию эта роль будет использовать то, что по умолчанию для данной ОС. Для CentOS/RHEL 6.X это означает 'udp' (UDP multicast), а для CentOS/RHEL 7.X это означает 'udpu' (UDP unicast). Эта переменная принимает следующие параметры:
default
,udp
иudpu
.cluster_transport: 'default'
Разрешить добавление узлов в существующий кластер при использовании ondrejhome.pcs-modules-2 v16 или новее.
allow_cluster_expansion: false
Сетевой интерфейс кластера. Если указан, роль будет сопоставлять хосты с основным IPv4-адресом с этого интерфейса. По умолчанию используется IPv4-адрес из
ansible_default_ipv4
или первый IPv4-адрес изansible_all_ipv4_addresses
. Например, чтобы использовать основной IPv4-адрес с интерфейсаens8
, используйтеcluster_net_iface: 'ens8'
. Интерфейс должен существовать на всех узлах кластера.cluster_net_iface: ''
Резервный сетевой интерфейс. Если указан, роль создаст резервное соединение corosync, используя основной IPv4 по умолчанию с этого интерфейса. Интерфейс должен существовать на всех узлах кластера.
rrp_interface: ''
ПРИМЕЧАНИЕ: эту переменную можно определить либо в defaults/main.yml, в этом случае одно и то же имя rrp_interface используется для всех хостов в файле hosts. Либо вы можете указать интерфейс для каждого хоста, присутствующего в файле hosts: это позволяет использовать конкретное имя интерфейса для каждого хоста (в случае если у них разные имена интерфейсов). Также обратите внимание, что вместо определения rrp_interface для хоста вы можете определить rrp_ip: в этом случае этот альтернативный ip будет использоваться для настройки corosync RRP (этот IP должен отличаться от стандартного IPv4 адреса хоста). Это позволяет использовать альтернативный ip, принадлежащий тому же основному интерфейсу.
Нужно ли добавлять хосты в /etc/hosts. По умолчанию запись для имени хоста определяется переменной
cluster_hostname_fact
добавляется для каждого хоста в/etc/hosts
. Это можно отключить, установивcluster_etc_hosts
вfalse
.cluster_etc_hosts: true
Какой факт Ansible использовать в качестве имени узлов кластера. По умолчанию эта роль использует факт
ansible_hostname
как имя хоста для каждого хоста. В некоторых окружениях может быть полезно использовать Полное Квалифицированное Доменное Имя (FQDN)ansible_fqdn
или имя узлаansible_nodename
.cluster_hostname_fact: "ansible_hostname"
Должен ли узел быть настроен как удаленный узел pacemaker. По умолчанию это
false
, и узел будет полным членом кластера Pacemaker. Удаленные узлы pacemaker не являются полными членами кластера и позволяют превышать максимальный размер кластера в 32 полных члена. Обратите внимание, что удаленные узлы поддерживаются данной ролью только в EL7 и EL8.cluster_node_is_remote: false
Упорядоченный список переменных для определения основного IP кластера (ring0). Первый совпадающий IPv4 используется, остальные обнаруженные IPv4 пропускаются. В большинстве случаев это не требует изменений, в некоторых специальных случаях таких, как отсутствие оконечного шлюза или при необходимости использовать неосновной IPv4 с данного интерфейса, это можно настроить.
ring0_ip_ordered_detection_list: - "{{ hostvars[inventory_hostname]['ansible_'+cluster_net_iface].ipv4.address|default('') }}" - "{{ ansible_default_ipv4.address|default('') }}" - "{{ ansible_all_ipv4_addresses[0]|default('') }}"
Настроить свойства кластера (Не обязательно)
cluster_property: - name: required node: optional value: optional
Настроить ресурсы по умолчанию кластера (Не обязательно)
cluster_resource_defaults: - name: required defaults_type: optional value: optional
Настроить ресурсы кластера (Не обязательно)
cluster_resource: - name: required resource_class: optional resource_type: optional options: optional force_resource_update: optional ignored_meta_attributes: optional child_name: optional
Настроить ограничения порядка кластера (Не обязательно)
cluster_constraint_order: - resource1: required resource1_action: optional resource2: required resource2_action: optional kind: optional symmetrical: optional
Настроить ограничения колокации кластера (Не обязательно)
cluster_constraint_colocation: - resource1: required resource1_role: optional resource2: required resource2_role: optional score: optional influence: optional
Настроить ограничения местоположения кластера (Не обязательно)
узел на основе
cluster_constraint_location: - resource: required node_name: required score: optional
по правилам (нужна версия ondrejhome.pcs-modules-2 30.0.0 или новее)
cluster_constraint_location: - resource: required constraint_id: required rule: required score: optional
Рассмотрение вопросов безопасности
Пожалуйста, подумайте об обновлении значения по умолчанию для cluster_user_pass
.
Чтобы защитить конфиденциальные значения в переменных, передаваемых в эту роль, вы можете использовать ansible-vault
для их шифрования. Рекомендуемый подход - создать отдельный файл с желаемыми переменными и их значениями, зашифровать весь файл с помощью ansible-vault encrypt
, а затем включить этот файл в секцию pre_tasks:
, чтобы он загружался перед выполнением роли. Пример ниже иллюстрирует этот процесс.
Создание файла encrypted_vars.yaml
- Создайте обычный текстовый файл
encrypted_vars.yaml
с вашими желаемыми секретными значениями:
# cat encrypted_vars.yaml --- cluster_user_pass: 'cluster-user-pass' fence_vmware_login: 'vcenter-user' fence_vmware_passwd: 'vcenter-pass'
- Создайте обычный текстовый файл
- Зашифруйте файл с помощью
ansible-vault
:
# ansible-vault encrypt encrypted_vars.yaml
- Зашифруйте файл с помощью
- Проверьте новое содержимое
encrypted_vars.yaml
:
# cat encrypted_vars.yaml $ANSIBLE_VAULT;1.1;AES256 31306461386430...
- Проверьте новое содержимое
Пример playbook, который использует значения из encrypted_vars.yaml
- hosts: cluster
pre_tasks:
- include_vars: encrypted_vars.yaml
roles:
- { role: 'ondrejhome.ha-cluster-pacemaker', cluster_name: 'test-cluster' }
ПРИМЕЧАНИЕ: Шифрование только значения переменной и его размещение в vars:
не рекомендуется, так как это может привести к ошибкам, таким как argument 1 must be str, not AnsibleVaultEncryptedUnicode
. Подход, при котором зашифрован весь файл, кажется, не подвержен этой проблеме.
Настройка значений по умолчанию для модуля Ansible
Хотя эта роль не предоставляет всех параметров конфигурации через переменные, вы можете использовать module_defaults
для изменения значений по умолчанию параметров, которые эта роль не использует. Ниже приведен неполный список примеров, где это может быть полезно.
Пример module_default A для установки токена totem на 15 секунд
- hosts: cluster
modules_defaults:
pcs_cluster:
token: 15000 # по умолчанию 'null' - зависит от значения по умолчанию ОС
Пример module_default B для отключения установки слабых зависимостей на системах EL8+/Fedora
- hosts: cluster
modules_defaults:
yum:
install_weak_deps: false # по умолчанию 'true'
Пример module_default C для отключения установки рекомендуемых пакетов на системах Debian
- hosts: cluster
modules_defaults:
apt:
install_recommends: false # по умолчанию 'null' - зависит от конфигурации ОС
ПРИМЕЧАНИЕ: module_defaults
применяется только к опциям, которые не указаны в задаче - вы не можете переопределить значение, установленное задачей в этой роли, только изменение значений, которые не использовались.
Пример Playbook
Пример playbook A для создания кластера с именем 'test-cluster', включенного при загрузке, с fence_xvm
и настройками файервола. ПРИМЕЧАНИЕ: cluster_name
является необязательным и по умолчанию равно pacemaker
.
- hosts: cluster
roles:
- { role: 'ondrejhome.ha-cluster-pacemaker', cluster_name: 'test-cluster' }
Пример playbook B для создания кластера с именем 'test-cluster' без настройки файервола и без fence_xvm
.
Для правильной авторизации кластера ожидается, что файервол уже настроен или отключен.
- hosts: cluster
roles:
- { role: 'ondrejhome.ha-cluster-pacemaker', cluster_name: 'test-cluster', cluster_firewall: false, cluster_configure_fence_xvm: false }
Пример playbook C для создания кластера с именем vmware-cluster
с устройством изоляции fence_vmware_soap
.
- hosts: cluster
vars:
fence_vmware_ipaddr: 'vcenter-hostname-or-ip'
fence_vmware_login: 'vcenter-username'
fence_vmware_passwd: 'vcenter-password-for-username'
roles:
- { role: 'ondrejhome.ha-cluster-pacemaker', cluster_name: 'vmware-cluster', cluster_configure_fence_xvm: false, cluster_configure_fence_vmware_soap: true }
Пример playbook D для создания кластера с именем test-cluster
, где /etc/hosts
не изменяется:
- hosts: cluster
roles:
- { role: 'ondrejhome.ha-cluster-pacemaker', cluster_name: 'test-cluster', cluster_etc_hosts: false }
Пример playbook E для создания кластера с именем vmware-cluster
с одним устройством fence_vmware_rest
для всех узлов кластера.
- hosts: cluster
vars:
fence_vmware_ipaddr: 'vcenter-hostname-or-ip'
fence_vmware_login: 'vcenter-username'
fence_vmware_passwd: 'vcenter-password-for-username'
roles:
- { role: 'ondrejhome.ha-cluster-pacemaker', cluster_name: 'vmware-cluster', cluster_configure_fence_xvm: false, cluster_configure_fence_vmware_rest: true, cluster_configure_stonith_style: 'one-device-per-cluster' }
Пример playbook F для создания кластера с именем aws-cluster
с одним устройством fence_aws
для всех узлов кластера.
- hosts: cluster
roles:
- { role: 'ondrejhome.ha-cluster-pacemaker', cluster_name: 'aws-cluster', cluster_configure_fence_xvm: false, cluster_configure_fence_aws: true, cluster_configure_stonith_style: 'one-device-per-cluster', enable_repos: false, fence_aws_region: 'aws-region' }
Пример playbook Конфигурация ресурсов .
- hosts: cluster
vars:
cluster_property:
- name: 'maintenance-mode'
value: 'true'
cluster_resource:
- name: 'apache2'
resource_type: 'systemd:apache2'
options: 'meta migration-threshold=2 op monitor interval=20s timeout=10s'
- name: 'cluster_vip'
resource_type: 'ocf:heartbeat:IPaddr2'
options: 'ip=192.168.1.150 cidr_netmask=24 meta migration-threshold=2 op monitor interval=20'
cluster_constraint_colocation:
- resource1: 'cluster_vip'
resource2: 'apache2'
score: 'INFINITY'
cluster_resource_defaults:
- name: 'failure-timeout'
value: '30'
roles:
- { role: 'ondrejhome.ha-cluster-pacemaker', cluster_name: 'apache-cluster'}
Пример файла инвентаризации для систем CentOS/RHEL/Fedora, создающих базовые кластеры.
[cluster-centos7]
192.168.22.21 vm_name=fastvm-centos-7.8-21
192.168.22.22 vm_name=fastvm-centos-7.8-22
[cluster-fedora32]
192.168.22.23 vm_name=fastvm-fedora32-23
192.168.22.24 vm_name=fastvm-fedora32-24
[cluster-rhel8]
192.168.22.25 vm_name=fastvm-rhel-8.0-25
192.168.22.26 vm_name=fastvm-rhel-8.0-26
Пример файла инвентаризации для кластера, использующего соединение RRP по пользовательскому интерфейсу и/или используя пользовательские IP для RRP
[cluster-centos7-rrp]
192.168.22.27 vm_name=fastvm-centos-7.6-21 rrp_interface=ens6
192.168.22.28 vm_name=fastvm-centos-7.6-22 rrp_ip=192.168.22.29
Пример файла инвентаризации с двумя полными членами и двумя удаленными узлами:
[cluster]
192.168.22.21 vm_name=fastvm-centos-7.6-21
192.168.22.22 vm_name=fastvm-centos-7.6-22
192.168.22.23 vm_name=fastvm-centos-7.6-23 cluster_node_is_remote=True
192.168.22.24 vm_name=fastvm-centos-7.6-24 cluster_node_is_remote=True
Пример файла инвентаризации с fence_aws:
[cluster]
172.31.0.1 instance_id="i-acbdefg1234567890"
172.31.0.2 instance_id="i-acbdefg0987654321"
Старые видеопримеры выполнения роли с настройками по умолчанию для:
- CentOS 7.6 установка кластера из двух узлов CentOS 7.6: https://asciinema.org/a/226466
- Fedora 29 установка кластера из двух узлов Fedora 29: https://asciinema.org/a/226467
Лицензия
GPLv3
Информация об авторе
Чтобы связаться с автором, вы можете использовать электронную почту ondrej-xa2iel8u@famera.cz или создать проблему на GitHub при запросе какой-либо функции.
pacemaker basic cluster role with fencing configuration (xvm, kdump, custom)
ansible-galaxy install OndrejHome/ansible.ha-cluster-pacemaker