订阅内容

在当今世界,能够持续为客户提供服务并尽可能减少中断或避免中断至关重要。红帽企业 Linux(RHEL)的高可用性附加组件可提升生产系统的可靠性、可扩展性和可用性,帮助您实现这一目标。高可用性(HA)集群可以确保您的系统不会因为单点故障而中断。当某个集群节点出现故障时,它会将服务转移到另一个节点,确保服务持续运行。

在这篇文章中,我将演示如何使用 ha_cluster RHEL 系统角色,以主动/被动模式配置一个运行 Apache HTTP 服务器且具有共享存储的 HA 集群。

RHEL 系统角色是一套集成在 RHEL 中的 Ansible 角色和模块,可提供一致的工作流,帮助您简化手动任务的执行。有关 RHEL HA 集群的更多信息,请参阅配置和管理高可用性集群文档。

环境概述

在我的示例环境中,有一个名为 controlnode 的控制节点系统,以及两个名为 rhel8-node1rhel8-node2 的受控节点,它们都运行 RHEL 8.6。两个受控节点均通过主机名称为 apc-switch 的 APC 电源开关供电。

我要创建一个名为 rhel8-cluster 的集群,由节点 rhel8-node1rhel8-node2 组成。这个集群将在主动/被动模式下运行 Apache HTTP 服务器,并通过浮动 IP 地址从挂载于 LVM(逻辑卷管理)逻辑卷上的 ext4 文件系统提供页面服务。隔离将由 apc-switch 提供。

两个集群节点都通过挂载在 LVM 逻辑卷上的 ext4 文件系统连接到共享存储。两个节点都安装并配置了 Apache HTTP 服务器。请参阅配置和管理高可用性集群文档中的在 Pacemaker 集群中配置具有 ext4 文件系统的 LVM 卷配置 Apache HTTP 服务器章节。

我在三台服务器上都设置了 Ansible 服务账户,取名为 ansible。我设置了 SSH 密钥身份验证,以便 controlnode 上的 ansible 账户可以登录每个节点。此外,ansible 服务账户已配置为能够通过每个节点上的 sudo 访问根账户。我还在 controlnode 上安装了 rhel-system-roles 和 ansible 软件包。有关这些任务的更多信息,请参阅 RHEL 系统角色简介文章。

定义清单文件和角色变量

进入 controlnode 系统后,第一步是创建新的目录结构:

[ansible@controlnode ~]$ mkdir -p ha_cluster/group_vars

这些目录的用途如下:

  • ha_cluster 目录将包含 playbook 和清单文件。
  • ha_cluster/group_vars 文件将包含清单组的变量文件,它们将应用到相应 Ansible 清单组中的主机。

我需要定义一个 Ansible 清单文件,以列出我希望由 ha_cluster 系统角色来配置的主机并进行分组。我将在 ha_cluster/inventory.yml 下创建包含以下内容的清单文件:

---
all:
  children:
    rhel8_cluster:
      hosts:
        rhel8-node1:
        rhel8-node2:

这份清单定义了一个名为 rhel8_cluster 的清单组,并将两个受控节点分配到这个清单组中。

接下来,我将定义角色变量,用于控制 ha_cluster 系统角色在运行时的行为。ha_cluster 角色的 README.md 文件位于 /usr/share/doc/rhel-system-roles/ha_cluster/README.md,其中包含了角色的重要信息,包括可用角色变量的列表及其使用方法。

对于 ha_cluster 角色,其中一个需要定义的变量是 ha_cluster_hacluster_password。该变量定义了 hacluster 用户的密码。我将使用 Ansible Vault 对其值进行加密,以确保其不以纯文本形式存储。

[ansible@controlnode ~]$ ansible-vault encrypt_string 'your-hacluster-password' --name ha_cluster_hacluster_password
New Vault password:
Confirm New Vault password:
ha_cluster_hacluster_password: !vault |
          $ANSIBLE_VAULT;1.1;AES256 376135336466646132313064373931393634313566323739363365616439316130653539656265373663636632383930323230343731666164373766353161630a303434316333316264343736336537626632633735363933303934373666626263373962393333316461616136396165326339626639663437626338343530360a39366664336634663237333039383631326263326431373266616130626333303462386634333430666333336166653932663535376538656466383762343065
Encryption successful

your-hacluster-password 替换为您选择的密码。运行命令后,系统将提示您输入 Vault 密码,用于在运行 playbook 时解密变量。输入 Vault 密码并再次输入进行确认后,加密的变量将显示在输出中。该变量之后将放入变量文件中,变量文件将在下一步中创建。

现在,我将在 ha_cluster/group_vars/rhel8_cluster.yml 中创建一个文件,为 rhel8_cluster 清单组中的集群节点定义变量。该文件包含以下内容:

---
ha_cluster_cluster_name: rhel8-cluster
ha_cluster_hacluster_password: !vault |
       $ANSIBLE_VAULT;1.1;AES256
       3761353364666461323130643739313936343135663237393633656164393161306535
       39656265373663636632383930323230343731666164373766353161630a3034343163
       3331626434373633653762663263373536393330393437366662626337396239333331
       6461616136396165326339626639663437626338343530360a39366664336634663237
       3330393836313262633264313732666161306263333034623866343334306663333361
       66653932663535376538656466383762343065
ha_cluster_fence_agent_packages:
  - fence-agents-apc-snmp
ha_cluster_resource_primitives:
  - id: myapc
    agent: stonith:fence_apc_snmp
    instance_attrs:
      - attrs:
          - name: ipaddr
            value: apc-switch
          - name: pcmk_host_map
            value: rhel8-node1:1;rhel8-node2:2
          - name: login
            value: apc
          - name: passwd
            value: apc
  - id: my_lvm
    agent: ocf:heartbeat:LVM-activate
    instance_attrs:
      - attrs:
          - name: vgname
            value: my_vg
          - name: vg_access_mode
            value: system_id
  - id: my_fs
    agent: ocf:heartbeat:Filesystem
    instance_attrs:
      - attrs:
          - name: device
            value: /dev/my_vg/my_lv
          - name: directory
            value: /var/www
          - name: fstype
            value: ext4
  - id: VirtualIP
    agent: ocf:heartbeat:IPaddr2
    instance_attrs:
      - attrs:
          - name: ip
            value: 198.51.100.3
          - name: cidr_netmask
            value: 24
  - id: Website
    agent: ocf:heartbeat:apache
    instance_attrs:
      - attrs:
          - name: configfile
            value: /etc/httpd/conf/httpd.conf
          - name: statusurl
            value: http://127.0.0.1/server-status
ha_cluster_resource_groups:
  - id: apachegroup
    resource_ids:
      - my_lvm
      - my_fs
      - VirtualIP
      - Website

这样,ha_cluster 角色就会在节点上创建名为 rhel8-cluster 的集群。

集群中将定义一个类型为 stonith:fence_apc_snmp 的隔离设备 myapc。该设备可通过 apc-switch IP 地址访问,登录名和密码分别为 apcapc。集群节点由此设备供电:rhel8-node1 插入插槽 1,rhel8-node2 插入插槽 2。由于不会使用其他隔离设备,我指定了 ha_cluster_fence_agent_packages 变量。这样做将覆盖默认值,避免安装其他隔离代理。

集群中将运行四个资源:

  • LVM 卷组 my_vg 将由类型为 ocf:HeartBeat:LVM-activatemy_lvm 资源激活。
  • ext4 文件系统将通过类型为 ocf:heartbeat:Filesystemmy_fs 资源,从共享存储设备 /dev/my_vg/my_lv 挂载到 /var/www 上。
  • HTTP 服务器的浮动 IP 地址 198.51.100.3/24 将由类型为 ocf:HeartBeat:IPaddr2VirtualIP 资源进行管理。
  • HTTP 服务器将由类型为 ocf:heartbeat:apacheWebsite 资源表示,其配置文件存储在 /etc/httpd/conf/httpd.conf 中,用于监控的状态页面可在 http://127.0.0.1/server-status 获取。

所有资源将被归入 apachegroup 组,确保它们在同一节点上运行,并按指定顺序启动:my_lvm、my_fs、VirtualIP、Website。

创建 playbook

下一步是在 ha_cluster/ha_cluster.yml 中创建包含以下内容的 playbook 文件:

---
- name: Deploy a cluster
  hosts: rhel8_cluster
  roles:
    - rhel-system-roles.ha_cluster

这个 playbook 将为 rhel8_cluster 清单组中的所有系统调用 ha_cluster 系统角色。

运行 playbook

现在一切准备就绪,我可以开始运行 playbook 了。在本次演示中,我使用 RHEL 控制节点,并从命令行运行 playbook。我将使用 cd 命令移到 ha_cluster 目录,然后使用 ansible-playbook 命令运行 playbook。

[ansible@controlnode ~]$ cd ha_cluster/
[ansible@controlnode ~]$ ansible-playbook -b -i inventory.yml --ask-vault-pass ha_cluster.yml

我指定以 root 身份运行 ha_cluster.yml playbook(-b 标记),使用 inventory.yml 文件作为我的 Ansible 清单(-i 标记),并且系统会提示我输入 vault 密码来解密 ha_cluster_hacluster_password 变量(--ask-vault-pass 标记)。

Playbook 执行完成后,我需要确认所有任务均未出现失败:

Screenshot of a Linux terminal showing no failed tasks

验证配置

为了验证集群是否已正确设置并运行资源,我将登录到 rhel8-node1 并查看集群状态:

Screenshot of a linux terminal displaying the cluster status of rhel8-node1

我也在 rhel8-node2 上进行了检查,显示的输出与此相同。

接下来,我将打开网页浏览器并连接至 IP 地址 198.51.100.3,以确认网站是否可访问。

为测试故障转移,我将从 rhel8-node1 拔掉网线。片刻之后,集群执行了故障转移并隔离了 rhel8-node1。我登录到 rhel8-node2 并查看了集群状态。结果表明,所有资源都已成功从 rhel8-node1 迁移到 rhel8-node2。接着,我在网页浏览器中重新加载该网站,以确认它依然可以访问。

Screenshot of a linux terminal displaying the cluster status of rhel8-node2

然后,我将 rhel8-node1 重新连接到网络并重启,使其重新加入集群。

结论

ha_cluster RHEL 系统角色可以帮助您快速且一致地配置运行各种工作负载的 RHEL HA 集群。在这篇文章中,我介绍了如何使用角色来配置 Apache HTTP 服务器,使其以主动/被动模式从共享存储运行网站。

红帽提供了许多 RHEL 系统角色,可以帮助您在 RHEL 环境的其他重要方面实现自动化。要探索其他角色,请查看可用 RHEL 系统角色的列表,并立即开始以更高效、一致且自动化的方式管理您的 RHEL 服务器。

想要深入了解红帽 Ansible 自动化平台吗?请查看我们的电子书《自动化架构师手册》。

 


关于作者

Tomas Jelinek is a Software Engineer at Red Hat with over seven years of experience with RHEL High Availability clusters.

Read full bio
UI_Icon-Red_Hat-Close-A-Black-RGB

按频道浏览

automation icon

自动化

有关技术、团队和环境 IT 自动化的最新信息

AI icon

人工智能

平台更新使客户可以在任何地方运行人工智能工作负载

open hybrid cloud icon

开放混合云

了解我们如何利用混合云构建更灵活的未来

security icon

安全防护

有关我们如何跨环境和技术减少风险的最新信息

edge icon

边缘计算

简化边缘运维的平台更新

Infrastructure icon

基础架构

全球领先企业 Linux 平台的最新动态

application development icon

应用领域

我们针对最严峻的应用挑战的解决方案

Original series icon

原创节目

关于企业技术领域的创客和领导者们有趣的故事