Dans le premier billet consacré au couple
Terraform / Libvirt, nous avions vu comment créer des ressources, mais
pas comment enchaîner automatiquement le provisioning. Par provisioning
j’entends l’utilisation des fonctions remote-exec et local-exec qui
permettent par exemple de lancer des playbooks ansible ou des scripts.
Je bloquais sur :
Comment attendre que la machine provisionnée ait une adresse IP allouée par le
serveur DHCP.
Comment attendre la fin de la partie cloud-init
Depuis j’ai pas mal bossé sur mon projet de Home Lab Devops ou je cherche à
tout automatiser et j’ai fini par trouver les solutions à ces problèmes.
Attendre que la machine ait une adresse IP
Si je reprends la création de la ressource libvirt_domain qui est la machine en
elle-même, telle que je la définissais auparavant.
Ce qu’il manquait, c’était trois choses pour que terraform comprenne que
l’adresse IP était définie :
le paramètre qemu_agent = true qui indique qu’il faut utiliser l’agent
qemu pour récupérer l’adresse IP
le paramètre wait_for_lease = true dans la partie network_interface
et surtout dans le cloud-init le démarrage du qemu-guest-agent
Ce qui donne :
Et dans le cloud-init complet :
Attendre que le cloud-init soit terminé.
Maintenant que l’adresse IP est récupérée nous pouvons lancer un
remote-exec avec la commande cloud-init status --wait qui va se charger
d’attendre la fin de la configuration de la machine.
Donc dans le bloc de ressource de la machine nous pouvons ajouter ceci :
Vous remarquerez que dans la définition de la connection j’utilise :
l’addresse IP de la machine
la clé privé pour me connecter à la machine.
Lancer un playbook ansible
Pour lancer le playbook Ansible, il faut utiliser un local-exec. Il suffit
de l’ajouter à la suite du précédent remote-exec :
On réutilise l’adresse IP et cette on charge la clé depuis une variable
définie dans le fichier variables.tf (pour montrer les deux façons de la
récupérer.)
Le fichier variables.tf :
Pour cete exemple j’utilise un simple playbook dont le contenu est le suivant :
Mais on pourrait faire tout le provisonning d’une application comme je le faire
sur les application de mon Home Lab: rundeck, powerdns et nexus.
Plus loin
Je vous propose de créer dans le projet home lab un template avec le contenu
précédent. Comme ça vous pouvez l’utiliser comme base pour vos projets. Le
lien ↗
Je dois encore trouver comment automatiser la récupération de l’image Ubuntu
et le changement de sa taille directement par terraform. En effet par défaut
elle ne fait que 2Go. On ne peut pas utiliser l’url avec le paramètre
size.