Proxmox-Updates mit Ansible automatisieren!

Ich betreibe in meinem Homelab unter anderem einen einzelnen Rootserver. Dieser steht weit entfernt in einem großen Rechenzentrum und bestückt ist er mit dem Hypervisor Proxmox. Inzwischen laufen dort fast alle meine Container und virtuellen Maschinen, die ich zum Experimentieren brauche. Auch ein Ansible-Server ist dort vorhanden.

Schließlich ist Netzwerkautomatisierung kein bloßes Buzzword mehr, sondern alltägliche Praxis in der Linux-Welt. Nachdem ich alle meine virtuellen Server mithilfe von Ansible-Playbooks auf den neuesten Stand bringen kann, mussten noch die Updates beim Proxmox-Server automatisiert werden. Hier war es aber nicht mit einem kleinen Playbook getan.

Schließlich müssen erst alle virtuellen Systeme auf dem Host heruntergefahren werden, bis man schließlich gefahrlos ein Update durchführen kann. Es war also mal wieder an der Zeit, ein kleines Skript zu schreiben. Dieses soll zuerst alle vorhandenen Maschinen ermitteln und diese dann der Reihe nach ausschalten. Direkt danach sollte dann das Update samt Neustart ausgeführt werden.

Und länger um den heißen Brei will ich auch nicht mehr reden. Hier ist es:

#!/bin/bash

# Alle vorhandenen Systeme auf dem PVE-Server ermitteln:

vmson=$(qm list | grep -v -E "VMID" | awk '{print $1}')

# Den Variableninhalt in ein Array umwandeln:

vmsonarray+=($vmson)

# Jedes System mittels einer For-Schleife ausschalten:

for ((u=0; u<${#vmsonarray[*]}; u++))

do 

qm shutdown ${vmsonarray[$u]}

done

# Proxmox updaten, upgraden und im Anschluss neustarten:

apt update -y && apt dist-upgrade -y && systemctl reboot 

Das obige Skript erfordert keinerlei zusätzliche Arbeiten, um es in Betrieb nehmen zu können. Wie bei jedem Bash-Skript sollte man zur leichteren Identifizierung eine Datei mit der Endung .sh anlegen und mit dem Skriptinhalt befüllen. Nun muss man noch dafür sorgen, dass der Superuser root das Programm ausführen kann. Dies gelingt mithilfe des Kommandos chmod 700 /Pfad/zum/Skript.sh

Damit wird für den Eigentümer aber nicht nur die Berechtigung execute, sondern auch read sowie write gesetzt. Man kann also jederzeit Änderungen am Code vornehmen. Ausführen lässt sich das Ganze jetzt manuell via des Befehls ./Pfad/zum/Skript.sh oder mithilfe des Kommando bash /Pfad/zum/Skript.sh Ebenfalls wäre es möglich, einen Cronjob einzurichten.

Das Proxmox-Update-Skript mit Ansible ausführen lassen:

Wie bereits in der Einleitung zu diesem Beitrag erwähnt, arbeite ich selbst im Homelab mit dem Netzwerkautomatisierungswerkzeug Ansible. Damit kann man natürlich nicht nur das Updaten eines Systems automatisieren. Mithilfe von Modulen lassen sich hier ganz tolle Dinge anstellen, wie beispielsweise das Betanken von neuen Servern mit bestimmter Software.

Ein Update-Playbook für Debian-Systeme kann zum Beispiel so aussehen:

---

- name: Update really evrything on Debian
  hosts: [debian]
  gather_facts: false
  tasks:
    - name: Update and upgrade evrything
      apt:
        update_cache: yes
        upgrade: dist

# Ausgabe in der Shell:

root@Ansible:/playbooks# ansible-playbook debian-update.yml 

PLAY [Update really evrything on Debian] ***************************************

TASK [Update and upgrade evrything] ********************************************
ok: [10.20.20.30]

PLAY RECAP *********************************************************************
10.20.20.30                : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Manch einer mag es schon bemerkt haben, Ansible arbeitet mit YAML. Hierbei handelt es sich um eine vereinfachte Auszeichnungssprache, welche den Fokus auf leichte Lesbarkeit legt. Nicht unerwähnt lassen möchte ich an dieser Stelle, dass ein Leerzeichen zu viel oder zu wenig das erfolgreiche Ausführen eines ganzen Playbooks verhindern kann.

Ganz neu in der Linux-Welt ist diese Konfigsprache aber nicht. Wer bereits einmal eine Netzwerkkonfiguration bei Ubuntu-Servern angepasst oder gar ganz neu erstellt hat, sollte ebenfalls in Berührung mit YAML gekommen sein. Da es hier beim Schreiben häufig zu Problemen kommt, sollte man zwei Dinge beachten. Der Editor deiner Wahl sollte hier immer Vim mit Zeilennummerierung sein.

Vim passt automatisch die Einrückungen an und du solltest so keine Probleme mit den Leerzeichen bekommen. Weiterhin kannst du dir bei Problemen Hilfe holen. Gemeint ist hiermit aber nicht der nächstbeste Kollege, sondern das Tool YAML Lint. Damit habe ich schon so manchen Fehler in Netzwerkkonfigurationen gefunden, der mir das Leben schwer gemacht hat.

Wenn es aber um Playbooks geht, würde ich je nach OS auf das APT-Paket ansible-lint oder auf das DNF-Paket python3-ansible-lint zurückgreifen. Wenn diese keinen Fehler finden, erscheint auch keine Ausgabe in der Shell und es gibt daher auch nichts zu beanstanden. Ebenfalls möglich ist ein Test direkt via Ansible. Die Syntax lautet wie folgt: ansible-playbook test.yml –check

Kommen wir aber nun wieder zum Thema zurück. Hier ist mein Playbook:

---
- name: Update really evrything on pve with shutdown of all vms
  hosts: [proxmox]
  gather_facts: false
  tasks:
    - name: Update and upgrade evrything on pve
      shell: 
        cmd: bash /Pfad/zum/Skript.sh 
      register: var_script

    - name: Shell script output
      debug:
        msg: "{{ var_script.stdout_lines }}"
      

Der obige YAML-Code erfüllt trotz der wenigen Zeilen seinen Zweck. Das Playbook nutzt das Modul shell, um das Update-Skript manuell zu starten. Mehr passiert hier gar nicht. Natürlich muss man so einen Fall nicht mit Profi-Tools wie Ansible lösen, aber es lohnt sich eben ab und an über den Tellerrad hinauszublicken und nicht nur mit Cronjobs zu arbeiten oder Skripte selbst zu starten.

Und da Ansible nicht ohne Inventory arbeiten kann, hier noch ein Auszug:

[proxmox]
deine-IP-Adresse-hier

[proxmox:vars]
ansible_user=root
#ansible_password=Schlechte-Wahl-nimm-liber-SSH-Keys
ansible_ssh_private_key_file=/root/.ssh/id_rsa

# Dort findest du die zu bearbeitende Datei -> /etc/ansible/hosts

Von Fabian Wüst

Er ist leidenschaftlicher Open-Source-Benutzer und ein begeisterter Technologie-Enthusiast. Als kreativer Kopf hinter Homelabtopia bringt Fabian hier seine umfangreiche Erfahrung als Linux-Admin ein. Um sicherzustellen, dass du aus seinen Beiträgen den größtmöglichen Nutzen ziehen kannst, führt er ausgiebige Tests durch und errichtet dafür immense Setups.

2 Antworten auf „Proxmox-Updates mit Ansible automatisieren!“

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert