# 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](https://www.youtube.com/c/NilsRatusznik) et [Twitch](https://www.twitch.tv/ahp_nils) de [@AHP\_Nils](https://twitter.com/AHP_Nils) traite de ce sujet au moment de la rédaction de cet article.
## Cloud-Init
[Cloud-Init](https://cloud-init.io) est un projet développé par [Canonical](https://canonical.com) pour Ubuntu datant de 2010 sous les licences [Apache 2.0 et GPLv3](https://github.com/canonical/cloud-init/blob/main/LICENSE).
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 :
- AWS
- Azure
- [OVHcloud](https://www.ovhcloud.com)
- [Scaleway](https://www.scaleway.com)
- Digital Ocean
- [Joyent/SmartOS](https://doc.ataxya.net/Joyent/SmartOS)
- OpenNebula
- etc.
Mais aussi disponible sur des offres de cloud privé :
- [KVM](https://www.linux-kvm.org)
- [LXD](https://linuxcontainers.org/lxd/)
- OpenStack
- MASS de Canonical
- VMware
Cloud-Init est disponible pour différents systèmes d'exploitation :
- Alpine Linux
- ArchLinux
- [Debian](https://cloud.debian.org/images/cloud/)
- DragonFlyBSD
- Fedora
- FreeBSD
- Gentoo Linux
- NetBSD
- OpenBSD
- openEuler
- RHEL/CentOS/AlmaLinux/Rocky/PhotonOS/Virtuozzo/EuroLinux/CloudLinux/MIRACLE LINUX
- SLES/openSUSE
- [Ubuntu](https://cloud-images.ubuntu.com)
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](https://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.
```shell
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 :
```shell
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 :
```shell
qm set 9000 --serial0 socket --vga serial0
```
On importe le fichier .qcow2 pour en faire un disque :
```shell
qm importdisk 9000 debian-11-genericcloud-amd64.qcow2 local-lvm
```
On attache le disque à la machine virtuelle :
```shell
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 :
```shell
qm resize 9000 scsi0 +20G
```
On ajoute le volume dédié à Cloud-Init :
```shell
qm set 9000 --ide2 local-lvm:cloudinit
```
Création du template :
```shell
qm template 9000
```
Le template Debian est terminé.
### Création d'une machine virtuelle
On clone le template :
```shell
qm clone 9000 100 --name deb-cloud-init-test
```
#### Méthode Proxmox
On configure l'IP de la machine virtuelle :
DHCP :
```shell
qm set 100 --ipconfig0 ip=dhcp
```
IP fixe :
```shell
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 :
```shell
qm set 100 --nameserver 192.168.1.1
```
Utilisateur :
```shell
qm set 100 -ciuser nidouille
```
Clefs SSH :
```shell
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**
```shell
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](https://forum.proxmox.com/threads/cloud-init-and-cicustom.58959/)
```shell
--cicustom "user=,network=,meta="
```
Fichier basique pour mon home-lab :
```yaml
#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/wiki/Cloud-Init_Support)
[https://pve.proxmox.com/pve-docs/qm.1.html](https://pve.proxmox.com/pve-docs/qm.1.html)
[https://github.com/proxmox/pve-docs/blob/master/qm-cloud-init.adoc](https://github.com/proxmox/pve-docs/blob/master/qm-cloud-init.adoc)
Forum Proxmox :
[https://forum.proxmox.com/threads/cloud-init-and-cicustom.58959/](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](https://www.nextinpact.com/article/48588/cloud-init-a-decouverte-standard-post-installation-sous-linux)