# Proxmox VM Template & Cloud-Init auto install

# Voraussetzungen

- **Proxmox VE** ≥ 6.x
- Linux-Cloud-Image (Ubuntu, Debian, Alma, Rocky, …)
- SSH-Key auf deinem Client

# 1. Cloud-Image herunterladen

```bash
wget <https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img>

```

💡 Wichtig: **Normale ISOs funktionieren nicht**, nur *Cloud Images*.

Weitere Ubuntu Cloud Images gibts hier: [https://cloud-images.ubuntu.com/](https://cloud-images.ubuntu.com/)

# 2. VM als Cloud-Init-Template anlegen

```bash
qm create 9000 \\
  --name ubuntu-cloudinit \\
  --memory 2048 \\
  --cores 2 \\
  --net0 virtio,bridge=vmbr0

```

## Disk importieren:

```bash
qm importdisk 9000 noble-server-cloudimg-amd64.img local-lvm

```

Wichtige Information: Bei Proxmox version 9.1.4 und neuer gibt es einen bug wenn man den VM Speicher als LVM-Thin formatiert hat. In dem Fall muss die Image Datei unter local (pve) → Import → Upload hochgeladen werden.

![3360-1658-max.png](https://bookstack.7chatban.de/uploads/images/gallery/2026-03/3360-1658-max.png)

Im Anschluss muss das Hochgeladene image nur noch Hard Disk importiert werden.

![300-632-max.png](https://bookstack.7chatban.de/uploads/images/gallery/2026-03/300-632-max.png)

## Disk &amp; Boot setzen:

```bash
qm set 9000 \\
  --scsihw virtio-scsi-pci \\
  --scsi0 local-lvm:vm-9000-disk-0 \\
  --boot c \\
  --bootdisk scsi0

```

## Cloud-Init aktivieren:

```bash
qm set 9000 --ide2 local-lvm:cloudinit
qm set 9000 --serial0 socket --vga serial0

```

## Cloud-Init konfigurieren (Proxmox GUI)

Dies ist nur erforderlich wenn man nicht mit Snippets arbeitet

Wenn man aber mit Snippets arbeitet ist es ratsam im Template in IP-Config die Konfiguration auf DHCP zu stellen.

Wenn trotzdem eine statische IP für einen Dienst gewünscht wird, kann man dies auch über das Snippet konfigurieren.

In der VM unter **Cloud-Init**:

- 👤 User: `ubuntu`
- 🔐 SSH Public Key einfügen
- 🌐 IP-Config: 
    - DHCP **oder**
    - `ip=192.168.1.50/24,gw=192.168.1.1`
- 🖥 DNS optional

# VM zum Template machen

```bash
qm template 9000

```

🎉 Fertig! Das Golden Image ist bereit.

# Snippets erstellen und einbinden

## Snippet Speicherort einstellen

Bevor wir Snippets verwenden können, muss erst einmal das Speichern von Snippets erlaubt werden.

Dafür im Proxmox Webinterface unter dem Punkt Datacenter → Storage → local → Edit

![3360-1650-max.png](https://bookstack.7chatban.de/uploads/images/gallery/2026-03/3360-1650-max.png)

Hier muss nur im Content Menü Snippets angeklickt werden und dann nur noch mit OK bestätigt werden.

![1320-724-max.png](https://bookstack.7chatban.de/uploads/images/gallery/2026-03/1320-724-max.png)

Nun muss über die Proxmox shell nur noch die Datei am Richtigen Ort abgelegt werden

Snippets liegen dann hier:

```bash
/var/lib/vz/snippets/

```

## user-data Datei erstellen

Beispiel:

```bash
nano /var/lib/vz/snippets/user-data-web.yaml

```

Inhalt:

```bash
#cloud-config

hostname: web01

users:
  - name: devops
    shell: /bin/bash
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    ssh_authorized_keys:
      - ssh-ed25519 AAAA...DEINKEY

package_update: true
packages:
  - nginx
  - curl

runcmd:
  - systemctl enable nginx
  - systemctl start nginx
  - echo "Provisioned by cloud-init" > /etc/motd

```

Wichtig:

- Erste Zeile **muss** `#cloud-config` sein
- YAML korrekt eingerückt!

## VM klonen (vom Template)

```bash
qm clone 9000 101 --name web01

```

## Custom user-data anhängen

```bash
qm set 101 --cicustom "user=local:snippets/user-data-web.yaml"

```

## VM Starten

```bash
qm start 101

```

Fertig 🎉

Beim ersten Boot wird die Config ausgeführt.

## Erweiterte Beispiele

Weitere Beispiele habe ich auf meiner Cloud liegen.

[Proxmox](https://cloud.7chatban.de/s/6Y8stSb58Qmiywt)