Skip to main content

Cloud-Init

Cet article est à vocation d'initiation et donne les pistes pour démarrer. Je vais me consacrer sur l'utilisation de Cloud-Init dans Proxmox et non un tuto sur Cloud-Init qui est à lui seul un sujet à part entière. La chaine Youtube et Twitch de @AHP_Nils traite de ce sujet au moment de la rédaction de cet article.

Cloud-Init

Cloud-Init est un projet développé par Canonical pour Ubuntu datant de 2010 sous les licences Apache 2.0 et GPLv3.

Pour utiliser Cloud-Init, on utilise un fichier formaté en YAML. Ce fichier permet de définir plusieurs paramètres basiques à des tâches post-lancement de la machine virtuelle. Exemples de ce que l'on peut configurer :

  • Configuration du réseau
  • Nom de la machine virtuelle
  • Clefs ssh autorisées
  • Utilisateurs
  • Installer des paquets
  • Configurer sudo
  • Mise à jour
  • Redimensionner des partitions

Au fil des années, Cloud-Init est devenu un standard d'initialisation des machines virtuelles que l'on retrouve chez les fournisseurs de cloud publics :

Mais aussi disponible sur des offres de cloud privé :

  • KVM
  • LXD
  • OpenStack
  • MASS de Canonical
  • VMware

Cloud-Init est disponible pour différents systèmes d'exploitation :

  • Alpine Linux
  • ArchLinux
  • Debian
  • DragonFlyBSD
  • Fedora
  • FreeBSD
  • Gentoo Linux
  • NetBSD
  • OpenBSD
  • openEuler
  • RHEL/CentOS/AlmaLinux/Rocky/PhotonOS/Virtuozzo/EuroLinux/CloudLinux/MIRACLE LINUX
  • SLES/openSUSE
  • Ubuntu

Les distributions Linux proposent généralement des images de déploiement pour les différents cloud avec Cloud-Init intégré. Concernant la famille des BSD, elles sont toutes trouvables sur le site bsd-cloud-image.org.

Intégration de Cloud-Init dans Proxmox

Je vais faire rapide, Cloud-Init est intégralement supporté.

Pour utiliser basiquement Cloud-Init, il faut rattacher à la machine virtuelle un volume supplémentaire comme pour le cas d'UEFI (soupir).

(et l'utilisation d'un fichier de configuration au format YAML sera à indiquer en ligne de commande)

Template

On va créer un template a base d'une image Debian dédiée au cloud.

wget https://cloud.debian.org/images/cloud/bullseye/latest/debian-11-genericcloud-amd64.qcow2

Ensuite, il faut importer le fichier récupéré pour que Proxmox sache le gérer et en faire un template. Mon proxmox est configuré avec des volumes LVM dont le point de montage est le nom par défaut : local-lvm

Création d'une machine virtuelle :

qm create 9000 --name debian-11-genericcloud-template --memory 1024 --net0 virtio,bridge=vmbr0 --sockets 1 --cpu cputype=kvm64

Cloud-Init demande l'utilisation d'une console série :

qm set 9000 --serial0 socket --vga serial0

On importe le fichier .qcow2 pour en faire un disque :

qm importdisk 9000 debian-11-genericcloud-amd64.qcow2 local-lvm

On attache le disque à la machine virtuelle :

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

Si vous désirez agrandir la taille du disque, par défaut, elle est de 2G pour l'image que j'ai récupérée. On augmente de 18G donc cela fera un disque de 20G :

qm resize 9000 scsi0 +20G

On ajoute le volume dédié à Cloud-Init :

qm set 9000 --ide2 local-lvm:cloudinit

Création du template :

qm template 9000

Le template Debian est terminé.

Création d'une machine virtuelle

On clone le template :

qm clone 9000 100 --name deb-cloud-init-test

Méthode Proxmox

On configure l'IP de la machine virtuelle :

DHCP :

qm set 100 --ipconfig0 ip=dhcp

IP fixe :

qm set 100 --ipconfig0 ip=192.168.1.100/24,gw=192.168.1.1
qm set 100 --ipconfig0 ip6=fd2c:06d1:651e:b83e::2/64,gw6=fd2c:06d1:651e:b83e::1

DNS :

qm set 100 --nameserver 192.168.1.1

Utilisateur :

qm set 100 -ciuser nidouille

Clefs SSH :

qm set 100 --sshkey ~/.ssh/id_rsa.pub

Méthode fichier en YAML

Cette méthode n'est pas très explicite dans Proxmox, la documentation dit que le fichier doit être dans le répertoire snippets sans en indiquer son emplacement. Car par défaut, ce répertoire n'existe pas !

Les fichiers Cloud-Init sont ici dans l'arborescence système : /var/lib/vz/snippets/user-data.yaml

qm set 100 --cicustom "user=local:snippets/userconfig.yaml"

Il est aussi possible d'indiquer un point de montage réseau pour récupérer le fichier. Je ne l'ai pas testé et pour cela, c'est un renvoi sur un sujet du forum de Proxmox : cloud-init and cicustom

--cicustom "user=<volume>,network=<volume>,meta=<volume>"

Fichier basique pour mon home-lab :

#cloud-config

#Mise a jour de l'os
package_update: true
package_upgrade: true

#Installation de paquet
packages:
  - qemu-guest-agent
  - apt-transport-https
  - curl
  - ufw

#Ajout d'un utilisateur
users:
    - default
    - name: nidouille
      groups: [ sudo ]
      shell: /bin/bash
      homedir: /home/nidouille
      sudo: ['ALL=(ALL) NOPASSWD:ALL']
      ssh_authorized_keys: #Clefs ssh publiques

runcmd:
  - curl https://repository.rudder.io/tools/rudder-setup | bash -s setup-agent 7.0 [policy server hostname or ip]
  - wget https://repo.zabbix.com/zabbix/5.4/debian/pool/main/z/zabbix-release/zabbix-release_5.4-1+debian11_all.deb
  - apt update
  - apt install zabbix-agent -y

Bibliographie

Documentation officielle : 

https://pve.proxmox.com/wiki/Cloud-Init_Support

https://pve.proxmox.com/pve-docs/qm.1.html

https://github.com/proxmox/pve-docs/blob/master/qm-cloud-init.adoc

Forum Proxmox :

https://forum.proxmox.com/threads/cloud-init-and-cicustom.58959/

Articles divers :

https://www.nextinpact.com/article/48588/cloud-init-a-decouverte-standard-post-installation-sous-linux