cloud-init template für bereitstellung in whmcs

LucasKer

New Member
Dec 28, 2025
8
0
1
Hi bin gerade dabei für WHMCS cloud-init Templates fertig zu machen damit die Bereitstellung über whmcs autonom funktioniert.

Folgendes hab ich gemacht:
VM in Proxmox erstellt:
qm create 10000 \
--name debian13-cloudinit \
--memory 2048 \
--cores 2 \
--net0 virtio,bridge=vmbr0 \
--scsihw virtio-scsi-pci

Debian 13 cloud Image heruntergeladen und importiert
cd /root/template-iso
wget https://cloud.debian.org/images/cloud/trixie/latest/debian-13-genericcloud-amd64.qcow2

qm importdisk 10000 debian-13-genericcloud-amd64.qcow2 local-zfs
qm set 10000 --scsi0 local-zfs:vm-10000-disk-0
qm set 10000 --boot order=scsi0

Cloud-Init Drive hinzugefügt
qm set 10000 --ide2 local-zfs:cloudinit
qm set 10000 --ipconfig0 ip=dhcp
qm set 10000 --nameserver 8.8.8.8
qm set 10000 --ciuser root
qm set 10000 --ciupgrade 1
qm set 10000 --agent enabled=1



qm template 10000




Muss noch was ergänzt werden, weil in der GUI von Proxmox kann ich über Konsole gehen da steht dann "starting serial terminal on interface serial0", dass bleibt auch da stehen mehr nicht. Wenn ich Enter drücke komme ich zum Login, der Login selbst funktioniert auch. In der sshd_config ist passwort login auch auf yes

Die Bereistellung über WHMCS funktioniert auch, nach dem die VM bereitgestellt wurde steht unter IP-Konfiguration auch die IP die zugewiesen wurde passwort wurde auhc gesetzt nur ich komme nicht über SSH rein. "Permission denied" wenn ich über Terminal versuche reinzukommen. Hab ich bei der cloud-init template erstellung was vergessen? Ich muss mehrere cloud-init templates nachher haben CentOS, Ubuntu oder Debian
 
Hallo @LucasKer,

das "Permission denied" bei SSH kommt fast sicher daher, dass Debian Cloud-Images standardmäßig PermitRootLogin auf prohibit-password setzen. Dein --ciuser root setzt zwar das Passwort, aber SSH blockt den Root-Login per Passwort trotzdem.

Prüf das über die Konsole:
Code:
grep -ri PermitRootLogin /etc/ssh/sshd_config /etc/ssh/sshd_config.d/

Da wird vermutlich prohibit-password stehen. Schau auch in /etc/ssh/sshd_config.d/ — Debian Cloud-Images legen dort gerne eigene Dateien ab, die die Hauptconfig überschreiben.

Empfohlene Lösung: SSH-Keys statt Passwort verwenden. Vor dem Templaten:
Code:
qm set 10000 --sshkeys /root/.ssh/authorized_keys

Falls du für WHMCS zwingend Passwort-Login brauchst, musst du das Image vor dem Templaten anpassen. VM einmal starten und per Konsole:
Code:
echo "PermitRootLogin yes" > /etc/ssh/sshd_config.d/99-allow-root.conf
systemctl restart sshd
Dann VM wieder stoppen und erst danach qm template 10000.

Alternativ kannst du das per cicustom mit einem eigenen Cloud-Init-Config lösen, das wäre sauberer wenn du mehrere Templates baust.

Zum Konsolen-Thema: Die Meldung "starting serial terminal on interface serial0" kommt, weil kein Serial-Port konfiguriert ist. Entweder seriell hinzufügen:
Code:
qm set 10000 --serial0 socket --vga serial0
Oder einfach über noVNC/xterm.js auf die VM zugreifen — da funktioniert der Login ja bereits.
 
PermitRootLogin ist auf yes das hatte ich schon geprüft, aber SSH-Keys würde in dem Fall ja nichts bringen oder sehe ich das Falsch? Weil das ja über WHMCS bereitgestellt wird und für die IP und Passwort Vergabe ist WHMCS zuständig

Waren die Befehle oben alle richtig für die cloudinit template Erstellung oder hast du für mich einen bessere Schritt für Schritt Ablauf wie ich ein sauberes/cleanes cloud init template auf einem frisch installierten Proxmox Host mit ZFS konfiguriere und erstelle. Damit ich die Schritte mal durchgehen kann und es ausprobieren kann dann sollte es im Regelfall ja funktionieren. Weil mit meiner Vorgehensweise scheint es ja nicht sauber zu funktionieren. Danke für die Hilfe!
 
Wenn PermitRootLogin yes schon gesetzt ist, prüf auch ob PasswordAuthentication wirklich auf yes steht — Debian Cloud-Images setzen das teilweise separat auf no:

Code:
grep -ri PasswordAuthentication /etc/ssh/sshd_config /etc/ssh/sshd_config.d/

Außerdem prüf, ob das Passwort von WHMCS tatsächlich ankommt:

Code:
passwd -S root

Wenn da L (locked) steht, ist der Account gesperrt trotz gesetztem Passwort.

Hier ein sauberer Ablauf für ein Debian Cloud-Init Template auf ZFS:

Code:
# 1. Image herunterladen
wget -P /root/template-iso https://cloud.debian.org/images/cloud/trixie/latest/debian-13-genericcloud-amd64.qcow2

# 2. VM erstellen
qm create 10000 --name debian13-cloudinit --memory 2048 --cores 2 \
  --net0 virtio,bridge=vmbr0 --scsihw virtio-scsi-pci \
  --serial0 socket --vga serial0 --ostype l26

# 3. Disk importieren und zuweisen
qm importdisk 10000 /root/template-iso/debian-13-genericcloud-amd64.qcow2 local-zfs
qm set 10000 --scsi0 local-zfs:vm-10000-disk-0,discard=on
qm set 10000 --boot order=scsi0

# 4. Disk vergrößern (Cloud-Images sind nur ~2GB)
qm disk resize 10000 scsi0 20G

# 5. Cloud-Init Drive
qm set 10000 --ide2 local-zfs:cloudinit

# 6. Cloud-Init Defaults
qm set 10000 --ciuser root --ciupgrade 1 --agent enabled=1
qm set 10000 --ipconfig0 ip=dhcp

# 7. VM starten und qemu-guest-agent + SSH-Config anpassen
qm start 10000

Dann über die serielle Konsole (qm terminal 10000) einloggen und:

Code:
# Guest-Agent installieren (wichtig für WHMCS IP-Erkennung)
apt-get update && apt-get install -y qemu-guest-agent
systemctl enable qemu-guest-agent

# SSH Passwort-Login sicherstellen
echo "PermitRootLogin yes" > /etc/ssh/sshd_config.d/99-allow-root.conf
echo "PasswordAuthentication yes" > /etc/ssh/sshd_config.d/99-allow-password.conf
systemctl restart sshd

# Cloud-Init für nächsten Lauf zurücksetzen
cloud-init clean

# Maschine herunterfahren
poweroff

Danach das Template erstellen:

Code:
qm template 10000

Wichtig: Vor dem cloud-init clean nicht vergessen — sonst überspringt Cloud-Init beim nächsten Clone die Konfiguration, weil es denkt, es ist schon gelaufen.

Für CentOS/Ubuntu gleiches Vorgehen, nur anderes Cloud-Image und bei CentOS yum statt apt-get für den Guest-Agent.
 
  • Like
Reactions: LucasKer
Ich hab alle Befehle der Reihe nach ausgeführt

root@host:~# qm terminal 10000

starting serial terminal on interface serial0 (press Ctrl+O to exit)

Das steht erstmal lange da nach dem Boot und irgendwann kommt dann:
[FAILED] Failed to start systemd-networkd-w… Wait for Network to be Configured.
See 'systemctl status systemd-networkd-wait-online.service' for details.

Und dann noch weiteres wie alles bootet was aber soweit dann "OK" aussieht.

Der Host hat eine Netzwerkverbindung mit einer ISO kann ich Problemlos eine VM erstellen und auch per SSH zugreifen etc nur mit dem cloud init templates komme ich nicht vorwärts. Genauso gemacht wie von dir beschrieben. Dadurch das was mit dem Netzwerk in der cloud init nicht passt geht natürlich auch die weiteren Befehle mit "qemu-guest-agent" nicht.

Hast du eine Ahnung woran das liegen könnte, muss ich hier bei cloud init noch was beachten?

Ich hab temporär über die GUI auch ein passwort vergeben, damit ich mich auch einloggen konnte. Wenn wir das mit der Netzwerk Thematik geklärt haben muss ich dann einfach nachdem ich alles erledigt habe das passwort dort wieder raus löschen vor dem letzten Schritt mit dem Template Klon. Korrekt?
 
Das `systemd-networkd-wait-online` schlägt fehl, weil DHCP nicht durchkommt. Entweder läuft kein DHCP-Server in dem Netz hinter vmbr0, oder er antwortet nicht auf die VM.

Für die Template-Vorbereitung setz temporär eine statische IP, damit du die Pakete installieren kannst:

Code:
qm stop 10000
qm set 10000 --ipconfig0 ip=DEINE_IP/24,gw=DEIN_GATEWAY
qm start 10000

Dann über qm terminal 10000 einloggen und die Schritte von oben durchführen (Guest-Agent, SSH-Config). Danach:

Code:
# IP-Config zurück auf DHCP setzen (oder leer lassen, WHMCS setzt das)
qm stop 10000
qm set 10000 --ipconfig0 ip=dhcp

Wenn WHMCS die IP-Vergabe komplett übernimmt und statische IPs zuweist, prüf ob WHMCS ipconfig0 beim Clonen mit der richtigen IP setzt — das ist dann der entscheidende Punkt für die Netzwerkkonfiguration nach Bereitstellung.

Zum Passwort: Ja, vor dem qm template 10000 das manuell gesetzte Passwort in der GUI unter Cloud-Init wieder entfernen. WHMCS setzt beim Provisionieren ein eigenes. Was du in der Cloud-Init-Config im Template stehen lässt, ist der Default — alles was WHMCS beim Clone überschreibt, überschreibt es.
 
  • Like
Reactions: LucasKer
Danke das hat geklappt, über WHMCS wurde die VM bereitgestellt und der SSH Zugriff geht auch. Wenn ich in der VM die erstellt wurde in der GUI von Proxmox gehe steht in der Konsole "starting serial terminal on interface serial0" was hat es damit auf sich, weil erst nach Enter kommt der Login Bereich.

Dann noch allgemeine Frage LVM oder ZFS was empfehlt sich eher?

Ich hab mehrere Hosts bei denen ich die cloud init templates benötige ich brauch zig template Debian, Ubuntu, CentOS, Windows.... muss ich diese auf allen Hosts so erstellen oder kann ich das Template runter laden und dort einfach hochladen?

Wie oft sollte ich die Templates aktualisieren und dafür einfach dann aus dem template eine VM klonen updaten und wieder zurück klonen?
 
@LucasKer,

Serielle Konsole: Das ist normales Verhalten bei --vga serial0. Die GUI zeigt dann die serielle Konsole statt einer grafischen — da muss man immer erst Enter drücken, damit der Login-Prompt erscheint. Wenn dich das stört, kannst du bei den geklonten VMs (nicht im Template) --vga std oder --vga virtio setzen. Für das Template selbst lass es auf serial0, damit qm terminal weiter funktioniert.

LVM vs ZFS: Für Cloud-Init Templates und WHMCS-Provisionierung ist ZFS klar im Vorteil — schnelle Clones (linked clones sind instant), Snapshots, Checksummen, Kompression. LVM-thin kann linked Clones auch, aber ZFS bringt mehr Features mit. Wenn deine Hosts schon auf ZFS laufen, bleib dabei.

Templates auf andere Hosts übertragen: Ja, du musst die nicht überall neu bauen. Zwei Wege:

  • vzdump 10000 --mode stop --storage local auf dem Quell-Host, dann die .vma-Datei auf den Ziel-Host kopieren und mit qmrestore wiederherstellen
  • Oder wenn du Proxmox Backup Server nutzt: dort hin sichern und auf den anderen Hosts restoren

Nach dem Restore auf dem Ziel-Host einfach wieder qm template VMID ausführen.

Templates aktualisieren: Einmal im Monat oder spätestens alle 3 Monate ist sinnvoll. Der Ablauf:

Code:
# Clone erstellen
qm clone 10000 99999 --name debian13-update --full
qm set 99999 --ipconfig0 ip=TEMP_IP/24,gw=GATEWAY
qm start 99999

# In der VM updaten
apt-get update && apt-get dist-upgrade -y
cloud-init clean
poweroff

# Altes Template löschen, neues erstellen
qm destroy 10000 --purge
qm set 99999 --ipconfig0 ip=dhcp
qm template 99999
# Ggf. VMID anpassen oder in WHMCS die neue VMID hinterlegen

Für Windows-Templates brauchst du übrigens cloudbase-init statt cloud-init und die VirtIO-Treiber im Image — das ist ein anderer Workflow als bei Linux.