Feed abonnieren

In der heutigen Welt ist es entscheidend, Kunden Services kontinuierlich und mit minimalen bis keinen Ausfällen zur Verfügung zu stellen. Das Red Hat Enterprise Linux (RHEL) High Availability Add-On unterstützt Sie dabei, dieses Ziel zu erreichen, indem es die Zuverlässigkeit, Skalierbarkeit und Verfügbarkeit von Produktionssystemen verbessert. Dies gelingt mithilfe von HA-Clustern (High Availability, Hochverfügbarkeit), die Single Points of Failure eliminieren und beim Ausfall eines Knotens in einem Service einen Failover zu einem anderen Cluster-Knoten durchführen.

In diesem Beitrag zeige ich, wie Sie die RHEL-Systemrolle ha_cluster zur Konfiguration eines HA-Clusters nutzen, der einen Apache HTTP-Server mit gemeinsamem Storage im Aktiv/Passiv-Modus ausführt.

RHEL-Systemrollen sind Ansible Roles und Ansible-Module, die in RHEL enthalten sind und konsistente Workflows bereitstellen, um die Ausführung manueller Aufgaben zu optimieren. Weitere Informationen zum RHEL-HA-Clustering finden Sie in der Dokumentation Konfigurieren und Verwalten von Hochverfügbarkeits-Clustern.

Überblick über die Umgebung

In meiner Beispielumgebung habe ich ein Kontrollknotensystem namens controlnode und zwei gemanagte Knoten, rhel8-node1 und rhel8-node2, die allesamt auf RHEL 8.6 ausgeführt werden. Die beiden gemanagten Knoten werden über einen APC-Netzschalter mit dem Hostnamen apc-switch eingeschaltet.

Ich möchte einen Cluster mit dem Namen rhel8-clustererstellen, der aus den Knoten rhel8-node1 und rhel8-node2 besteht. Der Cluster führt einen Apache HTTP-Server im Aktiv/Passiv-Modus mit einer Floating-IP-Adresse aus, die Seiten aus einem ext4-Dateisystem bereitstellt, das auf einem logischen LVM-Datenträger (Logical Volume Management) gemountet ist. Das Fencing wird über apc-switch bereitgestellt.

Beide Cluster-Knoten sind mit dem gemeinsamen Storage über ein ext4-Dateisystem verbunden, das auf einem logischen LVM-Volume gemountet ist. Auf beiden Knoten ist ein Apache HTTP-Server installiert und konfiguriert. Weitere Informationen finden Sie in den Kapiteln Konfigurieren eines LVM-Volumes mit einem ext4-Dateisystem in einem Pacemaker-Cluster und Konfigurieren eines Apache HTTP-Servers im Dokument Konfigurieren und Verwalten von Hochverfügbarkeits-Clustern.

Ich habe bereits auf allen 3 Servern ein Ansible-Dienstkonto mit dem Namen ansible eingerichtet. Die SSH-Schlüsselauthentifizierung habe ich dabei so eingerichtet, dass sich das ansible-Konto auf controlnode bei jedem Knoten anmelden kann. Zusätzlich wurde das Dienstkonto ansible so konfiguriert, dass es auf jedem Knoten über sudo Zugriff auf das Root-Konto hat. Außerdem habe ich die Pakete rhel-system-roles und ansible auf controlnode installiert. Weitere Informationen zu diesen Aufgaben finden Sie im Beitrag Einführung in RHEL-Systemrollen.

Definition von Inventory-Datei und Rollenvariablen

Im System controlnode muss zunächst eine neue Verzeichnisstruktur erstellt werden:

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

Diese Verzeichnisse werden wie folgt verwendet:

  • Das Verzeichnis ha_cluster enthält das Playbook und die Inventory-Datei.
  • Die Datei ha_cluster/group_vars enthält Variablendateien für Inventory-Gruppen, die auf Hosts in den entsprechenden Ansible-Inventory-Gruppen angewendet werden.

Ich muss eine Ansible-Inventory-Datei definieren, um die Hosts aufzulisten und zu gruppieren, für die die Systemrolle ha_cluster konfiguriert werden soll. Ich erstelle die Inventory-Datei unter ha_cluster/inventory.yml mit dem folgenden Inhalt:

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

Das Inventory definiert eine Inventory-Gruppe namens rhel8_cluster und weist die 2 gemanagten Knoten dieser Gruppe zu.

Als Nächstes definiere ich die Rollenvariablen, die das Verhalten der Systemrolle ha_cluster bei der Ausführung steuern. Die Datei README.md für die Rolle ha_cluster ist unter /usr/share/doc/rhel-system-roles/ha_cluster/README.md verfügbar und enthält wichtige Informationen über die Rolle, einschließlich einer Liste der verfügbaren Rollenvariablen und deren Verwendung.

Eine der Variablen, die für die Rolle ha_cluster definiert werden müssen, ist die Variable ha_cluster_hacluster_password. Sie legt das Passwort für die Benutzer von hacluster fest. Damit dieser Wert nicht im Klartext gespeichert wird, verschlüssele ich ihn mit 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

Ersetzen Sie your-hacluster-password durch das Passwort Ihrer Wahl. Wenn Sie den Befehl ausgeführt haben, werden Sie zur Eingabe eines Vault-Passworts aufgefordert, mit dem die Variable beim Ausführen des Playbooks entschlüsselt werden kann. Wenn Sie das Vault-Passwort eingegeben und durch die erneute Eingabe bestätigt haben, wird die verschlüsselte Variable in der Ausgabe angezeigt. Die Variable wird in der Variablendatei gespeichert, die im nächsten Schritt erstellt wird.

Jetzt erstelle ich eine Datei, die Variablen für meine Cluster-Knoten definiert, die in der Inventory-Gruppe rhel8_cluster aufgeführt sind. Dazu erstelle ich eine Datei unter ha_cluster/group_vars/rhel8_cluster.yml mit folgendem Inhalt:

---
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

Dadurch erstellt die Rolle ha_cluster einen Cluster mit dem Namen rhel8-cluster auf den Knoten.

Im Cluster ist ein Fence-Gerät namens myapc vom Typ stonith:fence_apc_snmp definiert. Das Gerät ist über die IP-Adresse apc-switch mit dem Anmeldenamen apc und dem Passwort apc erreichbar. Cluster-Knoten werden über dieses Gerät mit Strom versorgt: rhel8-node1 wird an Socket 1 angeschlossen und rhel8-node2 wird an Socket 2 angeschlossen. Da keine weiteren Fence-Geräte verwendet werden, habe ich die Variable ha_cluster_fence_agent_packages festgelegt. Dadurch wird der Standardwert überschrieben und verhindert, dass andere Fence-Agenten installiert werden.

Im Cluster werden 4 Ressourcen ausgeführt:

  • Die LVM-Volume-Gruppe my_vg wird von der Ressource my_lvm vom Typ ocf:heartbeat:LVM-activate aktiviert.
  • Das Dateisystem ext4 wird vom gemeinsam genutzten Storage-Gerät /dev/my_vg/my_lv auf /var/www durch die Ressource my_fs vom Typ ocf:heartbeat:Filesystem gemountet.
  • Die Floating-IP-Adresse 198.51.100.3/24 für den HTTP-Server wird von der Ressource VirtualIP vom Typ ocf:heartbeat:IPaddr2 gemanagt.
  • Der HTTP-Server wird durch eine Website-Ressource vom Typ ocf:heartbeat:apache dargestellt. Die Konfigurationsdatei ist unter /etc/httpd/conf/httpd.conf gespeichert und die Statusseite zur Überwachung ist unter http://127.0.0.1/server-status verfügbar.

Alle Ressourcen werden in eine apachegroup-Gruppe platziert, damit sie auf einem einzelnen Knoten ausgeführt und in der angegebenen Reihenfolge gestartet werden: my_lvm, my_fs, VirtualIP, Website.

Erstellung des Playbooks

Im nächsten Schritt wird die Playbook-Datei unter ha_cluster/ha_cluster.yml mit dem folgenden Inhalt erstellt:

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

Dieses Playbook ruft die Systemrolle ha_cluster für sämtliche Systeme auf, die in der Inventory-Gruppe rhel8_cluster definiert sind.

Ausführung des Playbooks

Jetzt ist alles vorbereitet und ich kann das Playbook ausführen. In dieser Demonstration verwende ich einen RHEL-Kontrollknoten und führe das Playbook über die Befehlszeile aus. Dabei wechsle ich mit dem Befehl cd in das Verzeichnis ha_cluster und führe das Playbook dann mit dem Befehl ansible-playbook aus.

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

Damit lege ich fest, dass das Playbook ha_cluster.yml ausgeführt werden soll, dass es als Root ausgeführt werden soll (Flag -b), dass die Datei inventory.yml als mein Ansible-Inventory verwendet werden soll (Flag -i) und dass ich zur Eingabe des Vault-Passworts aufgefordert werden soll, um die Variable ha_cluster_hacluster_password zu entschlüsseln (Flag --ask-vault-pass).

Nach Abschluss des Playbooks muss ich sicherstellen, dass keine Aufgaben fehlgeschlagen sind:

Screenshot of a Linux terminal showing no failed tasks

Validierung der Konfiguration

Um zu überprüfen, ob der Cluster eingerichtet wurde und Ressourcen ausführt, melde ich mich bei rhel8-node1 an und zeige den Clusterstatus an:

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

Ich überprüfe dies auch auf rhel8-node2, wo dieselbe Ausgabe angezeigt wird.

Als Nächstes öffne ich einen Webbrowser und stelle eine Verbindung zur IP 198.51.100.3 her, um zu überprüfen, ob der Zugriff auf die Website möglich ist.

Um das Failover zu testen, ziehe ich ein Netzwerkkabel von rhel8-node1 heraus. Nach einer Weile führt der Cluster das Failover aus und isoliert rhel8-node1. Ich melde mich bei rhel8-node2 an und zeige den Cluster-Status an. Der Status zeigt, dass alle Ressourcen von rhel8-node1 zu rhel8-node2 migriert wurden. Ich lade die Website auch im Webbrowser neu, um zu überprüfen, ob sie weiterhin aufgerufen werden kann.

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

Ich verbinde rhel8-node1 wieder mit dem Netzwerk und führe einen Neustart durch, damit es wieder mit dem Cluster verbunden wird.

Fazit

Mit der RHEL-Systemrolle ha_cluster können Sie RHEL-HA-Cluster schnell und konsistent konfigurieren, auf denen verschiedenste Workloads ausgeführt werden. In diesem Beitrag habe ich gezeigt, wie Sie mit der Rolle einen Apache HTTP-Server konfigurieren können, der eine Website über einen gemeinsamen Storage in einem Aktiv/Passiv-Modus ausführt.

Red Hat bietet viele RHEL-Systemrollen, mit denen Sie auch andere wichtige Aspekte Ihrer RHEL-Umgebung automatisieren können. In dieser Liste der verfügbaren RHEL-Systemrollen finden Sie weitere Informationen zu den verschiedenen Rollen, mit denen Sie Ihre RHEL-Server mithilfe von Automatisierung effizienter und konsistenter managen können.

Sie möchten mehr über Red Hat Ansible Automation Platform erfahren? Lesen Sie unser E-Book Handbuch zur Automatisierungsarchitektur.

 


Über den Autor

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

Nach Thema durchsuchen

automation icon

Automatisierung

Das Neueste zum Thema IT-Automatisierung für Technologien, Teams und Umgebungen

AI icon

Künstliche Intelligenz

Erfahren Sie das Neueste von den Plattformen, die es Kunden ermöglichen, KI-Workloads beliebig auszuführen

open hybrid cloud icon

Open Hybrid Cloud

Erfahren Sie, wie wir eine flexiblere Zukunft mit Hybrid Clouds schaffen.

security icon

Sicherheit

Erfahren Sie, wie wir Risiken in verschiedenen Umgebungen und Technologien reduzieren

edge icon

Edge Computing

Erfahren Sie das Neueste von den Plattformen, die die Operations am Edge vereinfachen

Infrastructure icon

Infrastruktur

Erfahren Sie das Neueste von der weltweit führenden Linux-Plattform für Unternehmen

application development icon

Anwendungen

Entdecken Sie unsere Lösungen für komplexe Herausforderungen bei Anwendungen

Original series icon

Original Shows

Interessantes von den Experten, die die Technologien in Unternehmen mitgestalten