Custom Cloud Init Config in Proxmox VE

Aus Thomas-Krenn-Wiki
Zur Navigation springen Zur Suche springen

Um Custom-CI (Custom Cloud-Init) Parameter in Proxmox VE verwenden zu können, müssen folgende Dinge beachtet werden:

  • Anlage eines Snippet-Directorys
  • Definition des Snippet-Directorys als Datastore in der Proxmox VE Web-UI
  • Anlage der Custom-Cloud-Init Files (z.B. ci-user-90000.yml)
  • Referenz der CI-Custom-File innerhalb der VM-Definition

Hinweis: wir haben Cloudinit in einem Einsteiger Webinar vorgestellt: https://www.youtube.com/watch?v=EKn7lTJrOW8&t

Snippet-Directory erstellen

Proxmox VE benötigt für die Weitergabe der CI-Custom Informationen die jeweiligen Cloud-Init-Config-Files in einem definiertem Storage für Snippets. Dieser kann wie folgt angelegt werden:

 root@PMX7:~# mkdir /mnt/pve/cephfs/cloud-init

In diesem Verzeichnis werden die Snippets für Cloud-Init-Konfigurationen angelegt werden. Danach muss man das Verzeichnis noch über die Web-UI als Datastore für Snippets hinzufügen.

Wichtig: bei Cluster-Systemen: damit die VMs mit Cloud-Init-Drive HA-fähig bleiben, müssen die Snippets auf einem zentralem Speicher wie z.B. cephfs abgelegt werden, damit diese je nach Ausfallszenario, auf jedem Node verfügbar sind für das Anstarten der VMs.

Ist die Custom-CI-Config auf einem lokalen Datastore, so kann die VM nicht auf anderen Servern angestartet werden, da der Config-Verweis somit ungültig wird.

Custom CI Config Files

Wichtiger Hinweis: sobald man Custom-CI Parameter definiert, greifen die Cloud-Init-Parameter aus der Proxmox VE Web-UI nicht mehr. Edit 27.06.2024: Es scheint wohl, dass man die beiden Optionen (Web-UI Parameter) und Custom-CI kombinieren kann. Wie sinnvoll das ist und ob sich das zukünftig ändern, kann man nicht sagen. Letztendlich Vorrang hat immer das Custom-CI File.

Die VM kann mittels mehrerer Cloud-Init-Files konfiguriert werden: https://pve.proxmox.com/wiki/Cloud-Init_Support#_cloud_init_specific_options

meta=<volume>
Specify a custom file containing all meta data passed to the VM via" ." cloud-init. This is provider specific meaning configdrive2 and nocloud differ.

network=<volume>
To pass a custom file containing all network data to the VM via cloud-init.

user=<volume>
To pass a custom file containing all user data to the VM via cloud-init.

vendor=<volume>
To pass a custom file containing all vendor data to the VM via cloud-init

Diese legt man nun nach belieben an. Es folgt eine Beispielkonfiguration:

vendor File

das Vendor-File wird nur beim First-Boot der neuen VM-Ressource ausgeführt und berücksichtigt.

root@PMX7:/mnt/pve/cephfs/cloud-init/snippets# nano ci-vendor-90000.yml

#cloud-config
runcmd:
    - apt update
    - apt install -y qemu-guest-agent
    - systemctl start qemu-guest-agent
    - reboot

network File

das Network-File definiert, die Netzwerkkonfiguration des Systems. Weitere Details findet man in der Cloud-Init Dokumentation: https://cloudinit.readthedocs.io/en/23.4.1/reference/network-config-format-v2.html

Als Beispiel habe ich eine Konfiguration von 2 Netzwerkadaptern genommen inklusive manueller statischer Routen.

root@PMX7:/mnt/pve/cephfs/cloud-init/snippets# cat ci-network-90000.yml
#
network:
  version: 2
  ethernets:
    ens18:
      dhcp4: true
    ens19:
      dhcp4: no
      addresses:
       - 192.168.99.10/24
      nameservers:
        addresses: [192.168.110.61]
      routes:
        - to: 192.168.99.0/24
          via: 192.168.99.1
          metric: 3

user File

das User-File definiert sonstige Einstellungen wie z.B. den Hostnamen, den Default-User, SSH-Keys oder die Installation von Paketen.

root@PMX7:/mnt/pve/cephfs/cloud-init/snippets# cat ci-user-90000.yml
#cloud-config
hostname: ubuntu2404-ci
manage_etc_hosts: true
user: tk
ssh_authorized_keys:
  - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQD= tkag\jsterr@Standard-150
  - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC= tkag\jsterr@Standard-020
chpasswd:
  expire: False
users:
  - default
locale: de_DE.UTF-8
timezone: Europe/Berlin
runcmd:
  - echo "Hello World Test" > test.txt
packages:
  - qemu-guest-agent
  - docker.io

Custom CI Config setzen

nachdem man die gewünschten Files erstellt hat, kann man diese nun mittels Kommandozeile der gewünschten VM mitgeben:

root@PMX7:/mnt/pve/cephfs/cloud-init/snippets# qm set 90000 --cicustom "user=ci-snippets:snippets/ci-user-90000.yml,vendor=ci-snippets:snippets/ci-vendor-90000.yml,network=ci-snippets:snippets/ci-network-90000.yml"

VM mit Custom CI Config starten

nach dem Setzen der Konfiguration, startet man die VM und diese verwendet dann anschließend die oben referenzierte custom Cloud-Init-Konfiguration, welche in unserem Fall folgendes erledigt:

  • Hostname setzen (ubuntu 2404-ci)
  • SSH Keys hinterlegen
  • Netzwerk wird konfiguriert (ens18 und ens19)
  • Updates werden eingespielt und anschließender Reboot des Servers
  • User Anlage des Users tk
  • Locales definieren (de_DE.UTF-8)
  • Timezone setzen (Europe / Berlin)
  • Eine Datei text.txt anlegen und mit "Hello World Test" befüllen
  • Die Pakete qemu-guest-agent und "docker.io" werden installiert


Foto Jonas Sterr.jpg

Autor: Jonas Sterr

Ich beschäftige mich mit den Themen Software Defined Storage, Proxmox Virtualisierung auf Basis von KVM, QEMU & Ceph im Produktmanagement der Thomas-Krenn.AG in Freyung. Proxmox ist meine absolute Leidenschaft und ich freue mich gerne über Kontaktanfragen und einen Austausch auf LinkedIn.


Das könnte Sie auch interessieren

ESXi VM Importer - Proxmox VE Storage Plugin
Proxmox VE Support-Subskriptionen
Proxmox VM erstellen