Dienste mit Handlern verwalten

AnsibleBeginner
Jetzt üben

Einführung

Handler sind spezielle Ansible-Tasks, die nur dann ausgeführt werden, wenn sie von einem Task mit Statusänderung benachrichtigt werden. Sie werden häufig zum Neuladen und Neustarten von Diensten verwendet.

In diesem Lab stellen Sie eine sichere Demo-systemd-Unit bereit, benachrichtigen Handler bei Änderungen an der Unit-Datei und überprüfen, ob der Dienst aktiv und aktiviert ist.

Ein Dienstautomatisierungsprojekt erstellen

In diesem Schritt erstellen Sie ein Projekt für die Dienstautomatisierung. Dieses Lab verwendet einen lokalen Host-Alias, da der Dienst den tatsächlichen Systemzustand auf der RHEL 10 VM darstellt.

cd /home/labex/project
mkdir -p rhce-ansible/{inventory,files,playbooks,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[service_hosts]
host ansible_connection=local
EOF

Auch bei einer lokalen Verbindung verwaltet das Playbook den tatsächlichen systemd-Status auf der VM. Aus diesem Grund verwendet dieses Lab einen Host-Alias und später become: true, anstatt mehrere unabhängige Dienst-Hosts zu simulieren.

Eine Demo-systemd-Unit-Datei erstellen

In diesem Schritt erstellen Sie die Quell-Unit-Datei, die Ansible nach /etc/systemd/system kopieren wird. Der Dienst führt /usr/bin/sleep infinity aus, ist also sicher und einfach zu überprüfen. Bevor Sie Befehle in diesem Schritt ausführen, kehren Sie in das Ansible-Projektverzeichnis zurück. Dies sorgt für konsistente Befehlspfade, auch wenn LabEx jeden Schritt separat ausführt.

cd /home/labex/project/rhce-ansible
cat > files/rhce-handler-demo.service <<'EOF'
[Unit]
Description=RHCE handler demo service

[Service]
Type=simple
ExecStart=/usr/bin/sleep infinity
Restart=always
RestartSec=1

[Install]
WantedBy=multi-user.target
EOF

Diese Unit ist absichtlich harmlos: Sie startet einen langlebigen sleep-Prozess und startet ihn neu, falls er beendet wird. Der Abschnitt [Install] ermöglicht es Ansible, den Dienst für multi-user.target zu aktivieren.

sed -n "1,12p" files/rhce-handler-demo.service

Überprüfen Sie die Zeilen ExecStart und WantedBy, bevor Sie fortfahren. Wenn die Quell-Unit-Datei fehlerhaft ist, wird Ansible die falsche Dienstdefinition getreu bereitstellen.

Ein Playbook mit Handlern schreiben

In diesem Schritt schreiben Sie ein Playbook, das die Unit-Datei kopiert und Handler benachrichtigt. Der Task meta: flush_handlers führt ausstehende Handler vor dem Dienst-Task aus, sodass systemd über die neue Unit informiert ist. Bevor Sie Befehle in diesem Schritt ausführen, kehren Sie in das Ansible-Projektverzeichnis zurück.

cd /home/labex/project/rhce-ansible
cat > playbooks/manage-service.yml <<'EOF'
---
- name: Deploy and manage the demo service
  hosts: service_hosts
  become: true
  gather_facts: false
  tasks:
    - name: Install demo systemd unit
      ansible.builtin.copy:
        src: ../files/rhce-handler-demo.service
        dest: /etc/systemd/system/rhce-handler-demo.service
        mode: '0644'
      notify:
        - Reload systemd
        - Restart demo service

    - name: Run handlers before enabling the service
      ansible.builtin.meta: flush_handlers

    - name: Ensure demo service is active and enabled
      ansible.builtin.systemd:
        name: rhce-handler-demo.service
        state: started
        enabled: true

  handlers:
    - name: Reload systemd
      ansible.builtin.systemd:
        daemon_reload: true

    - name: Restart demo service
      ansible.builtin.systemd:
        name: rhce-handler-demo.service
        state: restarted
EOF

Der copy-Task benachrichtigt die beiden Handler nur, wenn sich die Unit-Datei ändert. meta: flush_handlers führt alle ausstehenden Handler aus, bevor der systemd-Task startet und den Dienst aktiviert. Dies ist wichtig, da systemd die Unit-Dateien neu laden muss, bevor es einen neuen Dienst erkennt.

ansible-playbook playbooks/manage-service.yml --syntax-check

Die Syntaxprüfung sollte erfolgreich sein, bevor das Playbook in /etc/systemd/system schreibt. Sie erkennt Einrückungsfehler in der Task-Liste und im handlers-Abschnitt, ohne den Dienststatus zu ändern.

Das Playbook ausführen und den Dienst überprüfen

In diesem Schritt führen Sie das Dienst-Playbook aus. Der erste Durchlauf sollte die Unit installieren, systemd neu laden, den Dienst starten und für den Bootvorgang aktivieren. Bevor Sie Befehle in diesem Schritt ausführen, kehren Sie in das Ansible-Projektverzeichnis zurück.

cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/manage-service.yml | tee reports/service-first-run.txt

Der erste Durchlauf sollte die Unit-Datei kopieren, systemd neu laden, den Demo-Dienst über den Handler neu starten und sicherstellen, dass der Dienst aktiviert ist. Durch das Speichern der Ausgabe können Sie überprüfen, ob der Handler-Pfad ausgeführt wurde.

systemctl is-active rhce-handler-demo.service
systemctl is-enabled rhce-handler-demo.service

is-active überprüft den Laufzeitstatus für den aktuellen Bootvorgang, während is-enabled prüft, ob der Dienst in ein Boot-Target verknüpft ist. RHCE-Dienst-Tasks erfordern oft beides.

Die Unit-Datei ändern und den Handler erneut auslösen

In diesem Schritt nehmen Sie eine kontrollierte Änderung an der Quell-Unit-Datei vor. Wenn der copy-Task die Änderung erkennt, benachrichtigt er die Handler erneut. Bevor Sie Befehle in diesem Schritt ausführen, kehren Sie in das Ansible-Projektverzeichnis zurück.

cd /home/labex/project/rhce-ansible

Das lineinfile-Modul kann lokale Dateien auch über einen Ad-hoc-Befehl bearbeiten. Hier wird nur eine Zeile in der Quell-Unit geändert.

ansible localhost -c local -m ansible.builtin.lineinfile -a 'path=files/rhce-handler-demo.service regexp=^RestartSec= line=RestartSec=3'

Dies ändert die Quelldatei, nicht die installierte Unit unter /etc/systemd/system. Der nächste Playbook-Durchlauf sollte die Änderung an der Quelle bemerken, die aktualisierte Unit kopieren und die Handler erneut benachrichtigen.

ansible-playbook playbooks/manage-service.yml | tee reports/service-second-run.txt
grep -F RestartSec /etc/systemd/system/rhce-handler-demo.service

Die installierte Unit sollte nun RestartSec=3 anzeigen. Der Dienst sollte aktiv und aktiviert bleiben, da die Handler nach der Dateiänderung systemd neu geladen und den Demo-Dienst neu gestartet haben.

Zusammenfassung

Sie haben eine sichere systemd-Unit bereitgestellt, Handler für das Neuladen von systemd und den Neustart von Diensten verwendet, den aktiven und aktivierten Dienststatus überprüft und den Handler durch eine kontrollierte Änderung der Unit-Datei erneut ausgelöst.