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

    1. Создайте обычный текстовый файл encrypted_vars.yaml с вашими желаемыми секретными значениями:
    # cat encrypted_vars.yaml
    ---
    cluster_user_pass: 'cluster-user-pass'
    fence_vmware_login: 'vcenter-user'
    fence_vmware_passwd: 'vcenter-pass'
    
    1. Зашифруйте файл с помощью ansible-vault:
    # ansible-vault encrypt encrypted_vars.yaml
    
    1. Проверьте новое содержимое 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"

Старые видеопримеры выполнения роли с настройками по умолчанию для:

Лицензия

GPLv3

Информация об авторе

Чтобы связаться с автором, вы можете использовать электронную почту ondrej-xa2iel8u@famera.cz или создать проблему на GitHub при запросе какой-либо функции.

О проекте

pacemaker basic cluster role with fencing configuration (xvm, kdump, custom)

Установить
ansible-galaxy install OndrejHome/ansible.ha-cluster-pacemaker
Лицензия
gpl-3.0
Загрузки
2470
Владелец