Fernwartung Download starten

Proxmox Snippets: Config-Templates für Cloud-Init wiederverwenden

ProxmoxCloud-InitAutomationVirtualisierung
Proxmox Snippets: Config-Templates für Cloud-Init wiederverwenden

Cloud-Init hat sich in der Proxmox-Welt als De-facto-Standard etabliert, wenn es darum geht, frisch geklonte VMs ohne manuelles Nacharbeiten produktiv zu machen. Die GUI deckt Hostname, IP, SSH-Keys und das Initialpasswort komfortabel ab — alles darüber hinaus, etwa Pakete, Dienste oder Firewall-Regeln, landet schnell in handgepflegten YAML-Dateien, die kopiert, vergessen und am Ende inkonsistent gehalten werden. Genau hier setzt das Snippets-Feature von Proxmox VE an: Es erlaubt Ihnen, beliebige Cloud-Init-Bausteine zentral auf einem Storage abzulegen und beim VM-Klon einfach per Konfigurationsschalter zu referenzieren.

In diesem Beitrag zeigen wir, wie Sie Snippets-Storage einrichten, wie Sie eine wiederverwendbare Web-Server-Vorlage aufbauen und wie Sie diese sauber an neue VMs hängen. Wir nutzen Proxmox VE 8.4 mit Cloud-Init 24.x als Basis — die Konzepte gelten aber auch für ältere 8.x-Versionen.

Was sind Proxmox Snippets eigentlich?

Snippets sind ein eigener Content-Typ auf einem Proxmox-Storage, vergleichbar mit iso, vztmpl oder backup. Während ISO-Images für die Installation und Container-Templates für LXC zuständig sind, liefern Snippets kleine Textdateien, die andere Komponenten konsumieren — in der Praxis vor allem Cloud-Init und Hook-Skripte. Die Dateien liegen ganz normal im Dateisystem unter /var/lib/vz/snippets/ (bei Storage-Typ dir) oder auf einem CephFS-/NFS-Mount, und sind damit für alle Cluster-Nodes erreichbar, sofern der Storage Shared ist.

Cloud-Init kennt drei klassische Eingabedateien, die sich als Snippet ablegen lassen:

  • user-data: Pakete, Befehle, Nutzer, SSH-Keys, runcmd-Blöcke
  • network-config: VLANs, Bonds, statische Routen jenseits der GUI-Möglichkeiten
  • meta-data: instance-id, hostname, gelegentlich Cloud-spezifische Felder

Proxmox generiert diese Dateien normalerweise selbst aus den GUI-Eingaben. Mit Snippets überschreiben Sie das Verhalten gezielt für einzelne VMs und behalten trotzdem die Möglichkeit, die GUI-Werte als Fallback zu nutzen.

Snippets-Storage einrichten

Damit ein Storage Snippets aufnimmt, muss er den Content-Typ snippets aktiviert haben. Auf einem Single-Node oder kleinen Cluster reicht oft das vorhandene Local-Storage; in größeren Umgebungen empfiehlt sich ein CephFS- oder NFS-Share, weil Snippets sonst pro Node manuell synchron gehalten werden müssen.

In der GUI öffnen Sie Datacenter -> Storage, wählen den Storage aus und ergänzen unter “Content” den Haken bei “Snippets”. Auf der Kommandozeile geht es schneller — ein Blick in die zentrale Konfigurationsdatei pve-storage.cfg zeigt das Prinzip:

# /etc/pve/storage.cfg
dir: local
        path /var/lib/vz
        content iso,vztmpl,backup,snippets
        shared 0

cephfs: cephfs-snippets
        path /mnt/pve/cephfs-snippets
        content snippets,iso
        fs-name cephfs

Oder per CLI direkt setzen:

pvesm set local --content iso,vztmpl,backup,snippets

Nach dem Aktivieren legen Sie das Verzeichnis testweise an und kontrollieren die Rechte:

mkdir -p /var/lib/vz/snippets
ls -ld /var/lib/vz/snippets

Die Dateien sollten root gehören und für root les- und schreibbar sein — mehr ist nicht nötig, denn qemu-server läuft als root.

Eine wiederverwendbare Web-Server-Vorlage bauen

Jetzt zum konkreten Beispiel: eine user-data, die nginx installiert, eine Standardseite ausliefert und Port 80/443 in der lokalen nftables-Firewall öffnet. Wir nennen die Datei webserver-user-data.yaml und legen sie unter /var/lib/vz/snippets/ ab:

#cloud-config
package_update: true
package_upgrade: true
packages:
  - nginx
  - nftables
  - curl
  - htop

write_files:
  - path: /etc/nginx/sites-available/default
    permissions: '0644'
    content: |
      server {
        listen 80 default_server;
        listen [::]:80 default_server;
        root /var/www/html;
        index index.html;
        server_name _;
        location / { try_files $uri $uri/ =404; }
      }
  - path: /etc/nftables.conf
    permissions: '0755'
    content: |
      #!/usr/sbin/nft -f
      flush ruleset
      table inet filter {
        chain input {
          type filter hook input priority 0; policy drop;
          ct state established,related accept
          iif lo accept
          tcp dport { 22, 80, 443 } accept
          ip protocol icmp accept
        }
      }

runcmd:
  - systemctl enable --now nginx
  - systemctl enable --now nftables
  - nft -f /etc/nftables.conf
  - echo "Provisioned by DATAZONE on $(date)" > /var/www/html/index.html

Die #cloud-config-Zeile in der allerersten Zeile ist Pflicht — ohne diesen Marker erkennt Cloud-Init die Datei nicht. Achten Sie außerdem auf saubere Einrückung mit Spaces; Tabs führen zu schwer auffindbaren Parser-Fehlern.

Snippet an eine VM hängen

Mit dem Storage local und der Datei webserver-user-data.yaml referenzieren Sie das Snippet per qm set so:

# Cloud-Init user-data ersetzen
qm set 9001 --cicustom "user=local:snippets/webserver-user-data.yaml"

# Cloud-Init-Drive regenerieren
qm cloudinit update 9001

Der --cicustom-Parameter kennt drei Schlüssel, die Sie einzeln oder kombiniert setzen können:

SchlüsselSnippetTypischer Inhalt
useruser-dataPakete, runcmd, write_files
networknetwork-configVLAN-Tagging, Bonds, mehrere NICs
metameta-datainstance-id, hostname-Logik

Mehrere Schlüssel werden komma-separiert übergeben:

qm set 9001 --cicustom "user=local:snippets/webserver-user-data.yaml,network=local:snippets/dmz-network.yaml"

Die GUI-Werte für SSH-Key, Passwort und IP-Adresse bleiben weiterhin aktiv und werden mit dem Snippet zusammengeführt — Sie müssen also nicht alles in YAML nachbauen.

Workflow im Cluster: Templates, Klone, Pipeline

In der Praxis kombinieren wir Snippets mit klassischen VM-Templates. Eine sinnvolle Pipeline sieht so aus:

  1. Golden Image als Template anlegen (Debian 12 oder Ubuntu 24.04 mit cloud-init-Paket).
  2. Snippet-Bibliothek pflegen: ein Snippet pro Rolle (web, db, monitoring, jumphost).
  3. Klon erzeugen: qm clone 9000 1234 --name web01 --full
  4. Snippet zuweisen: qm set 1234 --cicustom "user=local:snippets/webserver-user-data.yaml"
  5. VM starten: qm start 1234 — der Rest passiert beim ersten Boot.

Wer das in eine Ansible- oder Terraform-Pipeline gießt, gewinnt einen reproduzierbaren Bereitstellungspfad ohne externe Config-Management-Tools. Für reine Container-Workloads ist Kubernetes oft überdimensioniert — ein paar Snippets plus klare Namenskonvention reichen oft völlig.

Stolperfallen aus dem Alltag

Drei Punkte tauchen bei Kundenprojekten immer wieder auf:

  • Snippet wird nicht ausgeführt: Fast immer fehlt die #cloud-config-Zeile oder Cloud-Init wurde im Image deaktiviert. Mit cloud-init status --long im Gast lässt sich der Status auslesen.
  • Änderungen am Snippet greifen nicht: Cloud-Init läuft nur beim ersten Boot. Für Tests cloud-init clean --logs im Gast und neu booten, oder das Cloud-Init-Drive per GUI regenerieren.
  • Snippet auf Node A, VM auf Node B: Bei Live-Migration muss der Storage Shared sein, sonst findet die Ziel-Node die Datei nicht. CephFS, NFS oder ein Sync per cron lösen das Problem.

Für die Versionsverwaltung Ihrer Snippets empfiehlt sich ein Git-Repository, das Sie per cron oder Webhook in /var/lib/vz/snippets/ synchronisieren. So lassen sich Änderungen reviewen, rollen und dokumentieren — ein wichtiger Schritt in Richtung Infrastructure as Code, ohne sofort den vollen Tooling-Stack einzuführen.

Mehr Hintergrund zur Cluster-Architektur und Storage-Auswahl finden Sie in unserer Proxmox-Beratung sowie zu passenden Shared-Storage-Setups in der Übersicht zu TrueNAS.

Fazit

Proxmox Snippets sind ein unspektakuläres, aber extrem nützliches Feature: Sie schließen die Lücke zwischen “GUI reicht nicht mehr” und “voll automatisiertes Config Management”. Wer regelmäßig VMs klont und immer wieder dieselben Schritte nachzieht, gewinnt mit zwei oder drei gut gepflegten Snippets sofort Zeit zurück — und reduziert nebenbei die Drift zwischen Systemen.

DATAZONE unterstützt Sie beim Aufbau wiederverwendbarer Proxmox-Provisionierung — vom Snippet-Katalog über Cluster-Storage bis zur Anbindung an Ihr bestehendes Backup. Sprechen Sie uns an: Kontakt.

Mehr zu diesen Themen:

IT-Beratung gewünscht?

Kontaktieren Sie uns für eine unverbindliche Beratung zu Proxmox, OPNsense, TrueNAS und mehr.

Jetzt Kontakt aufnehmen