OndrejHome.ha-cluster-pacemaker

高可用集群 - Pacemaker

在 CentOS/RHEL 6/7/8/9,AlmaLinux 8/9,Rocky Linux 8/9,Fedora 31-40 和 CentOS 8/9 Stream 系统上配置和扩展基本 Pacemaker 集群的角色。

该角色可以配置 Pacemaker 集群的以下方面:

  • 启用所需的系统仓库
  • 安装所需的包
  • 创建和配置用于运行 Pacemaker 集群的用户和组
  • 配置防火墙
  • /etc/hosts 中生成条目
  • 授权集群节点
  • 创建集群或扩展集群(检查 allow_cluster_expansion
    • "2 个或更多" 节点的集群
    • 单个心跳,rrp 或 knet,最多可连接 8 条线路
    • 远程节点
    • 使用自动检测或自定义选择的接口/IP 用于心跳
  • 启动并在启动时启用集群
  • 配置 stonith 设备
    • 默认安装和配置 fence_xvm stonith 设备
    • 可选配置 fence_kdump
    • 可选配置 fence_vmware (SOAP/REST) 或其他任何 fence_* stonith 设备
    • 可选配置 fence_aws

角色完全支持默认配置的 --check 模式,并对其他大多数选项部分支持。

报告问题时,请提供以下信息(如果可能):

  • 使用的 Ansible 版本
  • 运行 Ansible 的操作系统
  • 产生错误的剧本和清单文件(适当时删除敏感信息)
  • 您遇到的错误消息或行为描述

要求

该角色依赖于角色 ondrejhome.pcs-modules-2

Ansible 2.8 或更高版本。(注意:如果遇到问题,可以尝试更新 Ansible 到 2.8 及以上版本)

RHEL 6/7/8: 预计机器将已经注册。该角色默认启用对“高可用性”或“弹性存储”频道的访问。如果不希望这样,请检查 enable_repos 变量。

RHEL/CentOS 7: 此角色需要至少版本 2.9python-jinja2 库。如果没有,您可能会遇到问题 #6 中描述的错误。您可以使用以下 RPM 仓库获取更新版本的 python-jinja2 及其依赖项 - 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.10Debian Bullseye 经测试的版本为 20220326,使用 Ansible 版本 2.12。该角色的 Debian 部分不包括 stonith 配置和防火墙配置。注意: 此角色在 Debian 上仅经过有限测试 - 并非所有功能都经过测试。

Debian Bookworm 经 Ansible 版本 2.14Debian Bookworm 测试。该角色的 Debian 部分不包括 stonith 配置和防火墙配置。注意: 此角色在 Debian 上仅经过有限测试 - 并非所有功能都经过测试。

Ansible 版本 2.9.102.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_options 更改传递给 fence_vmware_soap/fence_vmware_rest 的附加属性。 默认情况下,该变量启用加密但禁用证书验证。

    fence_vmware_options: 'ssl="1" ssl_insecure="1"'
    

    注意:只能将 fence_vmware_soap/fence_vmware_rest 中的一个配置为 stonith 设备,因为它们共享同一名称。

  • 使用 fence_kdump 隔离设备配置集群? 这将启动 kdump 服务并定义 fence_kdump 的 stonith 设备。 注意:如果未启动 kdump 服务,则可能无法正常工作

    cluster_configure_fence_kdump: false
    
  • 使用 fence_aws 隔离设备配置集群? 您必须提供 AWS 的实例 ID/区域和能够为该集群启动/停止实例的实例配置文件。 启用此选项时,您需要指定 fence_aws_region 变量以获取 AWS 区域的信息。 注意:如果不设置实例配置文件,则可能无法正常工作。

    cluster_configure_fence_aws: false
    fence_aws_region: ''
    

    注意:您还需要在清单中为每个集群节点定义 instance_id,指定在 AWS 网页控制台上看到的实例 ID,或通过 fence_aws -o list 命令的输出来获取。 (man fence_aws)

    您可以选择使用 fence_aws_options 变量更改传递给 fence_aws 的附加属性。

    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_restfence_vmware_soapfence_xvmfence_kdump
      cluster_configure_stonith_style: 'one-device-per-node'
      
  • (RHEL/CentOS/AlmaLinux/Rocky)启用包含所需包的仓库

    enable_repos: true
    
  • (仅限 RHEL)启用包含所需包的扩展更新(EUS)仓库

    enable_eus_repos: false
    
  • (仅限 RHEL)启用包含所需包的 SAP 解决方案更新服务(E4S)仓库

    enable_e4s_repos: false
    
  • (仅限 RHEL)启用包含所需包的 Beta 仓库

    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)从 /dev/cdrom 提供的光盘媒体安装所需的包

    use_local_media: false
    
  • 启用或禁用 PCSD 网页 GUI。默认情况下,该角色保留安装的默认设置,意味着在 CentOS/RHEL 6.X 上禁用 PCSD 网页 GUI,而在 CentOS/RHEL 7.X 上启用。可以将 truefalse 传递给此变量,以确保启用或禁用 PCSD 网页 GUI。

    enable_pcsd_gui: 'nochange'
    
  • 集群传输协议。默认情况下,该角色将使用给定操作系统的默认值。 对于 CentOS/RHEL 6.X 这意味着 'udp'(UDP 多播),对于 CentOS/RHEL 7.X 这意味着 'udpu'(UDP 单播)。该变量接受以下选项:defaultudpudpu

    cluster_transport: 'default'
    
  • 允许与 ondrejhome.pcs-modules-2 v16 或更高版本一起使用现有集群时添加节点。

    allow_cluster_expansion: false
    
  • 集群网络接口。如果指定,角色将把主 IPv4 地址映射到该接口的主 IPv4 地址。 默认使用 ansible_default_ipv4ansible_all_ipv4_addresses 的第一个 IPv4 地址。 例如,要使用接口 ens8 的主 IPv4 地址,使用 cluster_net_iface: 'ens8'。 接口必须在所有集群节点上存在。

    cluster_net_iface: ''
    
  • 备用网络接口。如果指定,角色将使用该接口的默认 IPv4 设置一个 corosync 冗余环。 接口必须在所有集群节点上存在。

      rrp_interface: ''
    

    注意:您可以在 defaults/main.yml 中定义该变量,此情况下,所有主机在 hosts 文件中使用相同的 rrp_interface 名称。 或者,您可以为 hosts 文件中存在的每个主机指定一个接口;这样可以为每个主机使用特定的接口名称(如果它们没有相同的接口名称)。还要注意,您可以为主机定义 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...
    

使用 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 更改此角色未使用的参数的默认值。以下是一些可能会变得有用的非详尽示例。

示例模块默认值 A 设置 totem 令牌为 15 秒

- hosts: cluster
  modules_defaults:
    pcs_cluster:
      token: 15000               # 默认值为 'null' - 取决于操作系统的默认值

示例模块默认值 B 在 EL8+/Fedora 系统上禁用弱依赖项的安装

- hosts: cluster
  modules_defaults:
    yum:
      install_weak_deps: false   # 默认值为 'true'

示例模块默认值 C 在 Debian 系统上禁用推荐软件包的安装

- hosts: cluster
  modules_defaults:
    apt:
      install_recommends: false  # 默认值为 'null' - 取决于操作系统配置

注意:module_defaults 仅适用于未在任务中指定的选项 - 无法覆盖此角色中任务设置的值,只能更改未使用的选项的值。

示例剧本

示例剧本 A 创建名为 'test-cluster' 的集群,在启动时启用,配置 fence_xvm 和防火墙设置。注意:cluster_name 是可选的,默认为 pacemaker

- hosts: cluster
  roles:
     - { role: 'ondrejhome.ha-cluster-pacemaker', cluster_name: 'test-cluster' }

示例剧本 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 }

示例剧本 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 }

示例剧本 D 创建名为 test-cluster 的集群,不修改 /etc/hosts

- hosts: cluster
  roles:
     - { role: 'ondrejhome.ha-cluster-pacemaker', cluster_name: 'test-cluster', cluster_etc_hosts: false }

示例剧本 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' }

示例剧本 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' }

示例剧本 资源配置

- 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

使用自定义接口和/或使用自定义 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.ha-cluster-pacemaker
许可证
gpl-3.0
下载
2.5k
拥有者