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 est un sujet à par 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 Unbuntu 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ètre basique à des taches 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é
  • 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 publique :

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 d'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 virtuel un volume supplémentaire comme pour le cas l'UEFI (soupire).

Et l'utilisation d'un fichier de configuration au format yaml sera a indiquer en ligne de commande

Template

On va créer un template a base d'une image Debian dédié 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 configurer 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 disque, par défaut, il est de 2G pour l'image que j'ai récupéré. 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

#Instalation 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 publique 

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 officiel : 

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