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üssel | Snippet | Typischer Inhalt |
|---|---|---|
user | user-data | Pakete, runcmd, write_files |
network | network-config | VLAN-Tagging, Bonds, mehrere NICs |
meta | meta-data | instance-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:
- Golden Image als Template anlegen (Debian 12 oder Ubuntu 24.04 mit cloud-init-Paket).
- Snippet-Bibliothek pflegen: ein Snippet pro Rolle (web, db, monitoring, jumphost).
- Klon erzeugen:
qm clone 9000 1234 --name web01 --full - Snippet zuweisen:
qm set 1234 --cicustom "user=local:snippets/webserver-user-data.yaml" - 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. Mitcloud-init status --longim 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 --logsim 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
cronlö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:
Weitere Artikel
Proxmox Live-Migration zwischen Clustern: VM-Umzug ohne Downtime
Cross-Cluster Live-Migration mit Proxmox VE 8: qm remote-migrate richtig nutzen, API-Token und Zertifikate vorbereiten, VMs unterbrechungsfrei umziehen.
Proxmox GPU-Passthrough auf Midrange-Servern: Welche Karten lohnen sich?
Proxmox GPU-Passthrough 2026 für KMU: NVIDIA L4, L40S, AMD Instinct und gebrauchte Tesla T4 im Vergleich. IOMMU, vfio-pci, AI-Inferenz und vGPU-Setup.
Proxmox 3-Node-Cluster ohne Shared Storage: ZFS-Replikation als Ersatz
Proxmox HA-Cluster ohne Ceph oder SAN: Wie ZFS-Replikation, QDevice-Quorum und lokaler Storage einen kostengünstigen 3-Node-Cluster ermöglichen.