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.9
的 python-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.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_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_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 解决方案更新服务(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 上启用。可以将
true
或false
传递给此变量,以确保启用或禁用 PCSD 网页 GUI。enable_pcsd_gui: 'nochange'
集群传输协议。默认情况下,该角色将使用给定操作系统的默认值。 对于 CentOS/RHEL 6.X 这意味着 'udp'(UDP 多播),对于 CentOS/RHEL 7.X 这意味着 'udpu'(UDP 单播)。该变量接受以下选项:
default
,udp
和udpu
。cluster_transport: 'default'
允许与 ondrejhome.pcs-modules-2 v16 或更高版本一起使用现有集群时添加节点。
allow_cluster_expansion: false
集群网络接口。如果指定,角色将把主 IPv4 地址映射到该接口的主 IPv4 地址。 默认使用
ansible_default_ipv4
或ansible_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 文件
- 创建一个纯文本的
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...
- 验证
使用 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"
关于以默认值运行角色的旧视频示例:
- 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.ha-cluster-pacemaker