Buil d'images KVM avec Packer
Encore un outil DevOps de chez Hashicorp, cette fois, c’est Packer qui facilite la création d’images de système d’exploitations. Il vient en amont des autres produit Hashicorp que sont Vagrant et Terraform.
À partir d’un fichier de configuration, Packer est capable de construire en parallèle des images pour différents environnements que ce soit cloud ou on-premises.
Installation de packer
Packer ↗ est disponible comme tous les outils d’Hashicorp pour toutes les plateformes : Macos, Windows, Linux, FreeBSD, OpenBSD et même Solaris.
Personnellement je l’utilise dans ma vm de développement tournant sur une ubuntu qui intègre presque tous les prérequis. Il faudra que je complète avec les dernières trouvailles.
Fonctionnement général
Packer va tout simplement instancié une VM en utilisant la couche de virtualisation de votre choix. Moi, c’est avec libvirt. Il va monter l’image iso et lancer l’installation via un fichier kickstart. Le plus long est d’arriver à avoir une config kickstart générale permettant d’arriver à ses objectifs.
Le fichier kickstart se trouve dans le répertoire http
.
En post-traitement on peut lancer des scripts pour faire le ménage par exemple. Mais vous pouvez faire tout ce que vous voulez.
Construction d’une image Oracle Linux 8 compatible cloud-init
Le code source de cette image est disponible sur mon compte gitlab ↗.
Packer peut utiliser deux types de fichiers json ou hcl2. On retrouve plus de ressources avec du fichier json donc je prends ce format.
On retrouve trois sections :
- builders qui a la tâche de créer la machine virtuelle avec l’hyperviseur de son choix;
- provisioners qui permet de configurer la machine ;
- post-processors finalise le travail en stockant et en distribuant les images à destination de vagrant par exemple. Ici j’utilise des scripts shell, mais on pourrait aussi bien utiliser Ansible.
Si vous regardez l’exemple ci-dessous. On a un builder, un provisionner et pas de post-processor. En effet, mes images sont directement utilisées dans un cluster kvm.
Attention chaque builder possède ses propres paramètres. Vous pouvez consulter la liste ici ↗. Dans mon exemple j’utilise qemu ↗ pour créer des images KVM.
On peut utiliser des variables soient prédéfinies soient que vous déclarez
vous-même. Les variables sont entre doubles crochets {{}}
.
À la fin du fichier se trouve la partie de déclaration de ces variables (on
pourrait le mettre tout au début). On retrouve ensuite ses variables entre
crochet commençant par {{ user kickstart.cfg
}}
Description du fichier kickstart :
- un clavier et lang en fr;
- un timezone défini sur Paris en UTC;
- les services ssh et network démarrés ;
- le mot de pass root est password (à vous de le changer)
- selinux est désactivé ainsi que firewalld
Construction de l’image
Avant de lancer le build on peut contrôler notre fichier de configuration :
On lance la construction :
Si vous rencontrez des difficultés il suffit d’ajouter devant PACKER_LOG=1
Test de l’image
Maintenant on peut contrôler que notre image est fonctionnelle (remplacer avec votre fichier qcow2) :
Vous pouvez vous connecter dessus avec une simple commande ssh:
Réduire la taille de vos images
Dans le cas où vous souhaiteriez réduire la taille de vos images, vous pouvez utiliser virt-sparsify
Vérifions que tout est installé et correctement paramétré :
Pour le premier lancement, contrôlez que vous n’avez pas d’erreur (remplacer avec votre fichier qcow2) :
Aller plus loin
Je vous ai mis dans le projet gitlab des exemples de fichiers kickstart des principales distributions Linux.
La suite dans les prochains jours où nous verrons comment utiliser cette image sur un cluster kvm distant avec mise à jour du DNS PowerDNS.