你不知道什么是起搏器模块吗?不要一呆呆地活着啊!
從一開始就用標題冒犯了大家,其實只是個惡作劇而已。
首先
你知道心脏起搏器吗?Pacemaker是一个高可用性群集平台的开源软件,可以说是事实上的标准。在Qiita上有许多带有pacemaker标签的文章。不熟悉Pacemaker的系统工程师们可能没有注意到它。请注意,尽管在容器时代,Kubernetes开始承担应用系统的高可用性群集平台的角色,但不是所有软件都被容器化。Pacemaker在各种系统中仍然扮演着重要的高可用性群集平台的角色。
然而,尽管如上所述,没有专门用于配置Pacemaker的Ansible模块。虽然有一个名为pacemaker_cluster的模块,但它不适用于集群配置,只能用于在线、离线、重启和清理已配置的集群。
因此,使用Ansible配置Pacemaker上的集群一直以来都是困难的。有些人制作了专门用于资源配置的Ansible角色,而其他人制作了使用Pacemaker配置命令的Ansible模块。然而,这些方法往往难以保证幂等性,存在各种限制和困难。
我也在编写类似的Ansible模块,但由于crm命令已经过时,所以我创建了一个新的用于设置Pacemaker的Ansible模块。我已经在https://github.com/yosshy/ansible-pacemaker2 上发布了该模块。
模块构成
目前,以下8种Ansible模块已经完备。
-
- pacemaker_resource:リソース設定用
-
- pacemaker_resource_default:リソースのデフォルト設定用
-
- pacemaker_resource_group:リソースグループ設定用
-
- pacemaker_colocation:Colocation 制約設定用
-
- pacemaker_location:Location 制約設定用
-
- pacemaker_order:Order 制約設定用
-
- pacemaker_order_set:Order Set 制約設定用
- pacemaker_property:クラスタプロパティ設定用
这些模块使用cibadmin来获取当前的Pacemaker集群配置,并进行配置,因此Ansible需要预先在SSH连接的主机上安装cibadmin。不过,通常Pacemaker集群配置了环境,cibadmin已经安装在其中了。
每个模块都在执行相同的处理任务。
-
- 使用cibadmin命令以XML格式获取现有的Pacemaker设置。
-
- 根据模块的参数修改XML的一部分。
- 如果在修改之前和之后XML之间有差异,则使用cibadmin命令将XML应用于Pacemaker。
这样一来,确保了 Ansible 模块要求的“如果需要,则进行配置;如果不需要,则不做任何操作”的等同性。
安装指南
我会准备一个Ansible模块存放处。
$ mkdir -p ~/.ansible/plugins/modules
我会克隆存储库。
$ git clone https://github.com/yosshy/ansible-pacemaker2
将位于库中的文件复制到Ansible模块位置。
$ cp ansible-pacemaker2/library/* ~/.ansible/plugins/modules
Ansible 模块的存放位置默认有几个选项,可以通过 ansible.cfg、环境变量或 ansible/ansible-playbook 执行时的选项进行更改。详情请参考以下页面。
-
- DEFAULT_MODULE_PATH
- Embedding Modules and Plugins In Roles
例子的应用
我会引用在README中写的示例(用于MariaDB主从集群设置的2个节点的Ansible Playbook)。节点名暂时设为server1、server2。
# ①Pacemaker クラスタの設定
- pacemaker_property:
params: stonith-enabled=false start-failure-is-fatal="false"
# ②MariaDB 実行リソースの設定
- pacemaker_resource:
name: mariadb-service
type: ocf:heartbeat:mysql
params: |
binary=/usr/bin/mysqld_safe
datadir=/var/lib/mysql
log=/var/log/mariadb/mariadb.log
pid=/run/mariadb/mariadb.pid
replication_user=repl
replication_passwd=slavepass
op:
- start interval=0 timeout=120s
- stop interval=0 timeout=120s
- monitor interval=20s timeout=30s
- monitor interval=10s role=Master timeout=30s
- monitor interval=30s role=Slave timeout=30s
- promote interval=0 timeout=120s
- demote interval=0 timeout=120s
- notify interval=0 timeout=90s
master: |
master-max=1
master-node-max=1
clone-max=2
clone-node-max=1
notify=true
#③MariaDB 用フローティング IP リソースの設定
- pacemaker_resource:
name: mariadb-vip
type: ocf:heartbeat:IPaddr2
params: ip=192.168.0.100
op:
- monitor interval=30s
#④2,3の各リソースによるリソースグループの設定
- pacemaker_resource_group:
resource:
- mariadb-service
- mariadb-vip
#⑤2,3の各リソースの同居設定
- pacemaker_colocation:
resource1: mariadb-service=master
resource2: mariadb-vip
score: INFINITY
#⑥3のリソース起動サーバで server1 を優先するよう設定
- pacemaker_locaiton:
resource: mariadb-vip
node: server1
score: 100
基于纸面限制,我不会在这里进行详细解释,但对于已经使用过 pcs 命令的人来说,这并不是太难的内容。
各种属性将以 key=value 的形式列举为 params 参数的值。我曾考虑过使用字典类型,但为了避免与 pacemaker_resource 模块的 op 参数列表条目的格式不匹配(或变得复杂),选择了这种形式。如果使用 “|” ,则可以相对清晰地描述。
请在安装模块后执行以下命令以获取各模块的说明。
$ ansible-doc <モジュール名>
请注意
正常设置的Pacemaker集群环境通常可以通过在集群节点上执行pcs命令来进行Pacemaker的配置和控制。这同样适用于Pacemaker模块集。
因此,在使用Pacemaker模块集的Ansible Playbook中,可以将Pacemaker的配置和控制放在Playbook或者Task中进行。
run_once: yes
最好指定一个节点来执行模块。
在日本时间的平成时代最后一个圣诞节中,请大家尽情享受pacemaker模块系列。