Automatisiertes Debian-Upgrade mit Ansible und Proxmox Snapshots

30.Januar 2025

In diesem Artikel zeige ich euch, wie man mit Ansible ein Debian-System auf einem Proxmox-Server aktualisieren kann. Dabei nutzen wir die Möglichkeit, vor dem Update einen Snapshot der VM zu erstellen. Dies stellt sicher, dass wir im Falle eines Fehlers auf einen funktionierenden Zustand zurückkehren können. Alles wird mit Ansible automatisiert.

Einrichtung des Projekts

Zunächst richten wir ein Projektverzeichnis ein und erstellen eine Python Virtual Environment:

1mkdir ansible-projekt
2cd ansible-projekt
3python3 -m venv .venv

Nachdem die Umgebung eingerichtet ist, aktivieren wir sie und installieren Ansible sowie die benötigten Pakete:

1source .venv/bin/activate
2pip install ansible proxmoxer requests

Hinweis: Die Pakete proxmoxer und requests werden für den Zugriff auf Proxmox benötigt. Für den Zugriff auf den Proxmox-Server wird ein Benutzer mit Passwort oder ein API-Token benötigt. Speichert eure Zugangsdaten niemals direkt im Playbook!

Ansible Playbook zur Aktualisierung des Systems

Hier ist das Playbook, das den Upgrade-Prozess durchführt:

 1---
 2- name: Update Debian System
 3  hosts: all
 4  become: yes
 5
 6  vars:
 7    snapname: before_update
 8
 9  tasks:
10    - name: Prüfe, ob das System Debian 11 ist
11      ansible.builtin.fail:
12        msg: "Dieses Playbook ist nur für Debian 11 (Bullseye)"
13      when: ansible_lsb.release != "11"
14
15    - name: Erstelle einen Snapshot
16      community.general.proxmox_snap:
17        vmid: 111
18        snapname: "{{ snapname }}"
19        state: present
20        api_user: root@pam
21        api_password: xxxxx
22        api_host: 192.168.174.20
23        validate_certs: no
24      become: false
25      delegate_to: localhost
26
27    - name: Ersetze "bullseye" durch "bookworm"
28      ansible.builtin.replace:
29        path: /etc/apt/sources.list
30        regexp: 'bullseye'
31        replace: 'bookworm'
32
33    - name: Update apt Cache
34      ansible.builtin.apt:
35        update_cache: yes
36
37    - name: Aktualisiere das OS
38      ansible.builtin.apt:
39        upgrade: dist
40
41    - name: Starte das System neu
42      reboot:
43        msg: "Rebooting system after upgrade"
44        connect_timeout: 5
45        reboot_timeout: 600
46        pre_reboot_delay: 10
47
48    - name: Erneutes Sammeln der Systeminformationen
49      setup:
50
51    - name: Prüfe, ob Debian 12 installiert ist
52      debug:
53        msg: "Upgrade erfolgreich: System läuft nun mit Debian 12 (Bookworm)"
54      when: ansible_lsb.release == "12"
55
56    - name: Fehlermeldung, falls das System noch Debian 11 ist
57      fail:
58        msg: "Upgrade fehlgeschlagen: System läuft weiterhin mit Debian 11 (Bullseye)"
59      when: ansible_lsb.release == "11"

Schritt-für-Schritt-Erklärung des Playbooks

  1. Prüfung des Betriebssystems:

    • Das Playbook stellt sicher, dass das System Debian 11 ist.
    • Falls nicht, bricht das Playbook mit einer Fehlermeldung ab.
  2. Snapshot-Erstellung:

    • Vor dem Upgrade wird ein Snapshot der VM erstellt.
    • Die Zugangsdaten für Proxmox dürfen nicht im Playbook gespeichert werden.
    • delegate_to: localhost sorgt dafür, dass dieser Task nicht auf der Zielmaschine, sondern direkt auf dem Ansible-Controller ausgeführt wird. Dies ist besonders wichtig für Aufgaben, die mit externen Systemen wie Proxmox interagieren, da sie nicht von der verwalteten VM, sondern von der Steuerungsmaschine aus erfolgen müssen. Dadurch müssen die erforderlichen Python-Pakete wie proxmoxer nur auf dem Controller installiert sein.
  3. Anpassen der Paketquellen:

    • “bullseye” wird in /etc/apt/sources.list durch “bookworm” ersetzt.
  4. Aktualisieren des apt Caches:

    • Der apt Cache wird aktualisiert, damit das System die neuesten Paketlisten kennt.
  5. Upgrade des Betriebssystems:

    • Ein vollständiges Upgrade wird durchgeführt.
  6. Neustart des Systems:

    • Das System wird nach der Aktualisierung neu gestartet.
    • Ansible wartet, bis die Maschine wieder erreichbar ist.
  7. Erneutes Sammeln der Systeminformationen:

    • Nach dem Reboot wird das System erneut analysiert.
  8. Upgrade-Validierung:

    • Es wird geprüft, ob Debian 12 installiert ist.
    • Falls das Upgrade erfolgreich war, gibt es eine Bestätigung.
  9. Fehlerprüfung:

    • Falls das System immer noch Debian 11 ist, wird das Playbook mit einer Fehlermeldung abgebrochen.

Löschen des Snapshots:

Falls das Upgrade erfolgreich war, kann nun der Snapshot gelöscht werden.

Hinweis:

  • Bevor ihr den Snapshot löscht, stellt sicher, dass alle Dienste korrekt laufen (z. B. Webserver, Datenbanken etc.).
  • Falls nach dem Upgrade Probleme auftreten, kann der Snapshot zur Wiederherstellung genutzt werden.

Fazit

Mit diesem Ansible-Playbook lässt sich ein Debian-Upgrade effizient durchführen. Gleichzeitig sorgt der Snapshot für eine Sicherheitsrückfallebene, falls das Update fehlschlägt. So kann das System einfach wiederhergestellt werden.