Automatisierung von Proxmox-Container-Updates

Ein Leitfaden für die Umsetzung automatisierter Updates mit Ansible
28. November 2024 durch
Automatisierung von Proxmox-Container-Updates
manaTec GmbH, Julius Fitzek
 

Die Automatisierung der Proxmox-Container-Updates mit Ansible beschreibt den Prozess, bei dem regelmäßige Aktualisierungen der Container, die in einer Proxmox Virtual Environment (PVE) betrieben werden, effizient und fehlerfrei durch automatisierte Workflows durchgeführt werden. Hierbei wird Ansible, ein Open-Source-Automatisierungstool, genutzt, um Skripte zu schreiben, die das Update-Management der Container übernehmen. Mit Ansible können Aufgaben wie das Auslesen der aktuellen Container-Statusinformationen, die Durchführung von Paketupdates oder Systemaktualisierungen sowie Neustarts der Container zentral gesteuert werden.

Der Ansatz bietet folgende Vorteile:

  • Zeitersparnis: Manuelle Eingriffe werden reduziert, und wiederholbare Prozesse können schneller ausgeführt werden.
  • Zuverlässigkeit: Durch die Automatisierung wird die Wahrscheinlichkeit menschlicher Fehler minimiert.
  • Skalierbarkeit: Updates können gleichzeitig auf mehreren Containern oder Servern durchgeführt werden.
  • Dokumentation und Nachvollziehbarkeit: Die Skripte dokumentieren automatisch die durchgeführten Prozesse und Änderungen.

Typischerweise umfasst ein solches Automatisierungsszenario die Erstellung von Ansible-Playbooks, die spezifische Tasks wie das Aktualisieren von Paketlisten, das Installieren ausstehender Updates oder das Verifizieren von Erfolgen übernehmen. Ergänzend können Überwachungsmechanismen integriert werden, die sicherstellen, dass der Prozess erfolgreich abgeschlossen wurde.

Zusammengefasst ermöglicht die Nutzung von Ansible für Proxmox-Container-Updates eine robuste, konsistente und wartungsfreundliche Lösung, um IT-Infrastrukturen effizient zu betreiben.

Ansible Komponenten

Ansible besteht aus mehreren Hauptkomponenten, die zusammenarbeiten, um Automatisierungsaufgaben effizient durchzuführen. Hier ist eine Übersicht der wichtigsten Komponenten:

1. Inventory

Das Inventory ist eine zentrale Komponente, die die Zielsysteme definiert, auf denen Aufgaben ausgeführt werden sollen. Das Format gleicht einer einfachen Textdatei im INI- oder YAML-Format. Die Organisation und Ablage erfolgt in dynamischen Inventories, die Hosts aus externen Quellen (z. B. Cloud-Diensten oder APIs) abrufen. Eine gezielte Gruppierung dieser Hosts ermöglicht die gezielte Anwendung von Playbooks auf eine spezifische Auswahl von Servern.

2. Module

Module sind kleine Programme, die spezifische Aufgaben auf den Zielsystemen ausführen. Es gibt folgende Arten von Modulen:

  • Dateimanagement: file, copy, template
  • Benutzer- und Gruppenkonfiguration: user, group
  • Paketmanagement: yum, apt, dnf
  • System-Management: service, reboot
  • Stateless: Module ändern nur, was notwendig ist, und hinterlassen das System in einem definierten Zustand.

3. Playbooks

Playbooks sind YAML-Dateien, die Automatisierungsaufgaben beschreiben. Durch Reihen von Plays kann definiert werden, welche Hosts welche Aufgaben ausführen. Dabei enthält ein Play verschiedene Tasks, die durch Module realisiert werden.

  • Beispiel:

- name: Create a new directory

  file:

    path: /tmp/my_directory

    state: directory

Dynamisches Inventory

Ein dynamisches Inventory lässt sich durch den Einsatz von Plugins oder Skripten erstellen, die Proxmox über die API abfragen. Auf diese Weise können sämtliche Hosts und Container automatisch erfasst werden. 

Erstellung der YAML-Datei

In diesem Fall nutzen wir das Plugin community.general.proxmox, um alle Hosts innerhalb unseres Proxmox-Clusters dynamisch zu identifizieren und zu verwalten.

Hierzu erstellen wir eine Datei namens inventory.yml:

plugin: community.general.proxmox

url: https://your-proxmox-instance:8006

api_user: <your api user>

api_token_id: <your token id>

api_token_secret: <your token secret>

groups:

  # All containers tagged with 'odoo' that are running

  odoo_running: "(proxmox_tags_parsed|list|select('contains', 'odoo')) and (proxmox_status == 'running')"

Die Datei nutzt die folgenden Parameter:

url: URL der Proxmox-Serverinstanz, einschließlich des Ports 8006, der standardmäßig für das Proxmox-Webinterface und die API verwendet wird.

api_user: Der Proxmox-Benutzer, der für die Authentifizierung verwendet wird. Dieser Benutzer sollte über die erforderlichen Berechtigungen verfügen, um die gewünschten Ressourcen abzufragen und zu verwalten.

api_token_id: Die ID eines API-Tokens, das mit dem api_user verknüpft ist. Tokens bieten eine sichere, programmgesteuerte Möglichkeit zur Authentifizierung.

api_token_secret: Das geheime Token, das zur Authentifizierung mit der API verwendet wird.

Definition der Inventory-Gruppe

Definiert eine dynamische Inventory-Gruppe mit dem Namen odoo_running.

Hierbei gilt die folgende Gruppen-Definition:

  • proxmox_tags_parsed|list|select('contains', 'odoo'): Filtert Container oder VMs, die mit dem Tag odoo markiert sind.
  • proxmox_status == 'running': Schließt nur Ressourcen ein, die aktuell den Status running haben.

Ergebnis

Die Gruppe odoo_running enthält alle Proxmox-Container, die mit odoo getaggt sind und laufen.

Es wird dringend empfohlen, die Authentifizierungsdaten nicht im Klartext in der Inventory-Datei zu speichern. Stattdessen sollte ein Werkzeug wie Ansible Vault genutzt werden, um diese sensiblen Informationen sicher zu verschlüsseln. Eine detaillierte Erklärung zu Ansible Vault würde jedoch den Umfang dieses Artikels überschreiten.

Das dynamische Inventory kann nun mit dem folgenden Befehl abgerufen werden:

ansible-inventory-i inventory.yml --list

Playbook

Nun können wir ein Playbook erstellen, das Tasks gegen eine spezifische Inventory-Gruppe ausführt. Dabei wird die Gruppe aus dem zuvor definierten Inventory verwendet, um gezielt bestimmte Hosts oder Container anzusprechen. Das Playbook dient als Vorlage für die Automatisierung von Aufgaben auf diesen Systemen.

- name: Update all running odoo container

  hosts: odoo_running

  tasks:

    - name: Update packages

      ansible.builtin.apt:

        upgrade: yes

        update_cache: yes

        autoremove: yes

Dieser Task des Playbooks aktualisiert alle installierten Pakete auf die neuesten verfügbaren Versionen, aktualisiert den Paket-Cache und entfernt überflüssige Pakete.

Dies ist eine Standardaufgabe zur Systemwartung und eignet sich hervorragend, um Systeme auf dem neuesten Stand zu halten und sicherzustellen, dass keine unnötigen Pakete installiert sind.

Hier die Beschreibung der Task im Detail:

Task-Name

- name: Update packages

  • Der Name des Tasks lautet Update packages.
  • Dies ist eine beschreibende Bezeichnung, die im Ansible-Ausgabeprotokoll erscheint, um den Zweck der Aufgabe zu verdeutlichen.

Modul

ansible.builtin.apt:

  • Das verwendete Modul ist ansible.builtin.apt, das speziell für die Verwaltung von Paketen auf Systemen mit dem Advanced Packaging Tool (APT) entwickelt wurde.

Parameter

1. upgrade: yes

  • Führt ein vollständiges Upgrade durch (entspricht apt-get upgrade).
  • Installiert neue Versionen vorhandener Pakete, aktualisiert abhängige Pakete und ersetzt alte Pakete, wenn nötig.

2. update_cache: yes

  • Aktualisiert den lokalen Paket-Cache, bevor andere Aktionen ausgeführt werden (entspricht apt-get update).
  • Dadurch wird sichergestellt, dass die Paketquellen auf dem neuesten Stand sind.

3. autoremove: yes

  • Entfernt automatisch ungenutzte Pakete (entspricht apt-get autoremove).
  • Hilft dabei, das System aufzuräumen und nicht mehr benötigte Abhängigkeiten zu löschen.

Playbook ausführen

Der Befehl für die Ausführung des Playbook ist folgender:

ansible-playbook playbook.yml -i inventory.yml

Der Befehl funktioniert in drei Schritten: Zunächst lädt Ansible die Hosts, indem es die Datei inventory.yml liest, um die Zielmaschinen und Gruppen zu identifizieren. Anschließend wird das Playbook playbook.yml ausgeführt, wobei die Anweisungen im Playbook schrittweise auf die im Inventory definierten Hosts angewendet werden. Im letzten Schritt werden die Tasks für jede Maschine im Inventory in der angegebenen Reihenfolge verarbeitet, wobei die Ergebnisse, wie Erfolg, Änderungen oder Fehler, während der Ausführung angezeigt werden.

Fazit

Die Verbindung von dynamischem Inventory, leistungsfähigen Modulen und flexiblen Playbooks erlaubt eine effiziente und sichere Durchführung von Updates. Besonders in Umgebungen mit einer großen Anzahl von Containern oder virtuellen Maschinen zeigt sich der Nutzen dieses Ansatzes deutlich. Die Automatisierung mit Ansible stellt eine hervorragende Lösung dar, um die Verwaltung von Proxmox-Containern zu optimieren und die Effizienz des Betriebs erheblich zu erhöhen. Dies bildet eine solide Grundlage für den Aufbau einer modernen, skalierbaren und verlässlichen IT-Infrastruktur. 

Wenn du weitere Unterstützung bei der Automatisierung von Proxmox-Updates benötigst, kontaktiere uns gerne jederzeit!


​Quellen: linuxcontainers.orgproxmox.com, docs.ansible.com

 
B2B Rechnungskauf mit Odoo und Mondu
Optimiere deinen B2B-Cashflow mit einer einfachen Integration