Terraform
Terraform est un outil d'infrastructure en tant que code (IaC) open-source développé par HashiCorp. Il permet aux utilisateurs de définir et de provisionner des infrastructures de datacenter dans un langage de configuration déclaratif (connu sous le nom de HashiCorp Configuration Langage - HCL), ou en utilisant le JSON.
Nous allons utiliser terraform pour déployer notre infrastructure. Sur toute la partie hyperviseurs et VM terraform sera utilisé.
Terraform dialoguera principalement avec Xen Orchestra pour la gestion des VMs et des hyperviseurs.
Provider
Pour le provider, nous avons utilisé le provider qui est fournis avec Xen orchestra.
Pour l'importer dans terraform, nous avons créé un fichier main.tf qui regroupe toutes les informations liées au provider de XenOrchestra.
main.tf
Liaison à XenOrchestra
La première étape est de générer des identifiants sur XenOrchestra qui seront dédiés à terraform. Il est important de créer un compte générique à terraform pour que dans les logs de XenOrchestra. Il peut y avoir la possibilité d'identifier les actions réalisées par terraform et celle qui n'ont pas été éxécuté par terraform.
Une fois l'utilisateur créé dans XenOrchestra, il faut créer les variables de connexions.
variable.tf
Ensuite, nous utiliserons les variables d'environnement pour définir les variables
En se rendant dans le projet gitlab terraform. Puis Settings → CI/CD → Variables. On cliquera sur add variable

Et on fera cette étape pour le mot de passe et l'URL.
Configuration de l'environnement pour XO
Pour une vm, nous avons besoin de data pour définir l'environnement du cluster à utiliser.
Dans XCP-NG plusieurs informations sont nécessaires pour l'environnement du cluster. Il faut une pool qui définira l'ensemble d'hôtes où pourra être déployé la VM. Ensuite, il faut le réseau qui sera utilisé par la VM, le template utilisé pour la VM. Et enfin la pool de stockage pour la VM.
Tout ceci a été renseigné dans le fichier xen_orchestra.tf
Création de la VM
Ensuite, il fallait créer un template pour terraform avec toutes les ressources nécessaires pour la création de la VM.
VM
Tout cela a été défini dans le fichier
vm.tf
Dans ce fichier, nous retrouvons toutes les informations liées à la création de la VM. On y retrouve le nom de la VM, la description, la mémoire, le nombre de CPU, le template, le cloud-config, le réseau, le disque, etc.
TFVARS
Il n'était pas possible de marquer toutes les informations directement dans le fichier vm.tf. C'est pour cela que nous avons utilisé des boucles for et un fichier tfvars afin de provisionner toutes les VMs.
terraform.tfvars
Voici un exemple uniquement pour une VM, ensuite il suffit de copier-coller le block et de changer les informations pour chaque VM.
Template cloud init
Pour le cloud init, nous avons utilisé un fichier template qui sera utilisé pour la création de la VM. Ce fichier nous permet de définir le nom de la VM et l'utilisateur qui sera utilisé pour la connexion. Le template terraform nous permettra de générer un fichier cloud init unique pour chaque VM.
cloud-init.tftpl
Puis la meme chose, mais pour la configuration réseau
Utilisation de terraform
Pour utiliser terraform, il suffit de lancer les commandes suivantes:
tofu init permet d'initialiser le projet terraform tofu plan permet de voir les changements qui seront effectués tofu apply -auto-approve permet d'appliquer les changements
CI/CD avec Gitlab
Pour automatiser le déploiement de l'infrastructure avec Terraform, nous avons utilisé GitLab CI/CD. Nous avons créé un fichier .gitlab-ci.yml qui contient les étapes nécessaires pour déployer l'infrastructure. Et utiliser le store terraform de gitlab pour stocker l'état de l'infrastructure.
Initialiser le store terraform de gitlab
Pour initialiser le store terraform de gitlab, il faut se rendre dans le projet gitlab terraform. Et copier l'id du projet dans le fichier main.tf dans la section terraform comme ceci :
Une fois cela fait il faut lancer la commande tofu init pour initialiser le store terraform de gitlab.

Fichier .gitlab-ci.yml
Pour automatiser le déploiement de l'infrastructure avec Terraform, nous avons créé un fichier .gitlab-ci.yml. Ce fichier contient les étapes nécessaires pour déployer l'infrastructure à chaque commit sur la branche main.
gitlab-ci.yml
Ce fichier permet de déployer l'infrastructure à chaque fois qu'il y a un commit sur la branche main.
Execution de la pipeline
