Utilisation du provider Terraform Ansible
Mise à jour :
Plutôt que d’opposer Terraform à Ansible, je préfère les utiliser ensemble. Terraform est un outil de provisioning qui permet de décrire l’infrastructure sous forme de code et de la déployer de manière reproductible et automatisée. Ansible, de son côté, est un gestionnaire de configuration qui automatise les tâches répétitives, telles que la gestion des configurations de serveurs, les déploiements d’applications et bien plus encore.
En combinant ces deux outils à travers le provider ansible/ansible pour Terraform, nous pouvons non seulement provisionner les ressources nécessaires, mais aussi les configurer immédiatement après leur création.
Pourquoi utiliser le provider Ansible pour Terraform ?
L’intégration de Terraform et Ansible via le provider ansible/ansible est particulièrement puissante lorsqu’on travaille avec des infrastructures cloud.
Avec Terraform, vous pouvez définir et provisionner vos ressources cloud telles que des instances de calcul, des volumes de stockage et des réseaux privés virtuels (VPC). En utilisant le provider Ansible, vous pouvez créer des inventaires Ansible que vous pouvez ensuite utiliser avec les commandes Ansible.
Les avantages :
- Automatisation complète : Les inventaires sont générés et mis à jour automatiquement, réduisant le risque d’erreurs manuelles et assurant que votre configuration est toujours à jour.
- Scalabilité : Avec des inventaires dynamiques, vous pouvez facilement adapter vos configurations à des environnements de grande taille ou changeants, sans avoir à gérer manuellement les fichiers d’inventaire.
- Flexibilité : Vous pouvez définir des groupes et des variables spécifiques aux hôtes ou groupes d’hôtes, ce qui vous permet de personnaliser la configuration selon les besoins de chaque composant de votre infrastructure.
Utilisation du provider Ansible
L’utilisation du provider ansible/ansible se fait directement via le fichier de configuration Terraform :
terraform { required_providers { outscale = { source = "outscale/outscale" version = ">= 0.12.0" } ansible = { version = "~> 1.3.0" source = "ansible/ansible" } } backend "s3" { profile = "souverain" bucket = "lab04-terraform-state" key = "terraform.state" region = "cloudgouv-eu-west-1" endpoints = { s3 = "https://oos.cloudgouv-eu-west-1.outscale.com" iam = "https://eim.cloudgouv-eu-west-1.outscale.com" } skip_region_validation = true skip_credentials_validation = true skip_metadata_api_check = true skip_s3_checksum = true }}
provider "outscale" { access_key_id = var.access_key_id secret_key_id = var.secret_key_id region = var.region}
Comme d’habitude, il faut initialiser avec la commande terraform init
.
Installation du plugin d’inventaire Ansible Terraform
Pour qu’Ansible puisse utiliser les inventaires générés par Terraform il faut installer la collection cloud.terraform.
ansible-galaxy collection install cloud.terraform
Création de l’inventaire Ansible avec Terraform
Pour rappel, un inventaire définit les hôtes sur lesquels Ansible va exécuter ses tâches. Avec Terraform, il est possible de générer dynamiquement des inventaires basés sur les ressources que vous avez provisionnées, ce qui permet une gestion plus flexible et automatisée de vos configurations.
resource "ansible_group" "servers" { name = "servers"}
resource "ansible_host" "server1" { name = outscale_vm.vm_lab02.public_dns_name groups = [ansible_group.servers.name] variables = { ansible_host = outscale_vm.vm_lab02.public_ip ansible_user = "outscale" ansible_ssh_private_key_file = "/Users/srt20/Projets/outscale/labs/terraform/lab01/my_key.pem" }}
- La ressource
ansible_group
crée un groupe Ansible nommé servers via le paramètre name. - La resource
ansible_host
définit un hôte Ansible, en l’occurrence server1 et l’associe au groupe précédemment créé servers. Elle inclut également des variables spécifiques à cet hôte, telles que l’adresse IP, l’utilisateur SSH et la clé privée SSH utilisée pour l’authentification.
resource "ansible_host" "server1" { name = outscale_vm.vm_lab02.public_dns_name groups = [ansible_group.servers.name] variables = { ansible_host = outscale_vm.vm_lab02.public_ip ansible_user = "outscale" ansible_ssh_private_key_file = "/Users/srt20/Projets/outscale/labs/terraform/lab01/my_key.pem" }}
Pour générer l’inventaire il suffit de lancer la commande suivante :
terraform apply
Utilisation des Inventaires dans les Playbooks
Une fois que l’inventaire dynamique est généré par Terraform, vous pouvez l’utiliser dans vos playbooks Ansible pour exécuter des tâches sur les hôtes définis.
Commencez par créer un fichier inventory.yaml avec ce contenu :
---plugin: cloud.terraform.terraform_provider
On peut rapidement vérifier l’inventaire avec la commande ansible-inventory
:
ansible-inventory -i inventory.yml --list{ "_meta": { "hostvars": { "ows-109-232-233-69.eu-west-2.compute.outscale.com": { "ansible_host": "109.232.233.69", "ansible_ssh_private_key_file": "/Users/srt20/Projets/outscale/labs/terraform/lab01/my_key.pem", "ansible_user": "outscale" } } }, "all": { "children": [ "ungrouped", "servers" ] }, "servers": { "hosts": [ "ows-109-232-233-69.eu-west-2.compute.outscale.com" ] }}
On peut passer à l’écriture de notre playbook Ansible :
---- name: Test hosts: servers tasks: - name: Installation de nginx become: true ansible.builtin.apt: update_cache: true name: - nginx - htop - net-tools - name: Activation et Demarrage du service nginx ansible.builtin.service: name: nginx state: started enabled: true
Dans cet exemple, le playbook Ansible cible tous les hôtes dans le groupe servers et exécute les tâches définies.
Tout est prêt, lancez l’exécution du playbook.
ansible-playbook playbook.yml -i inventory.yml
PLAY [Test] **********************************
TASK [Gathering Facts] **********************************ok: [ows-109-232-233-69.eu-west-2.compute.outscale.com]
TASK [Install nginx] **********************************ok: [ows-109-232-233-69.eu-west-2.compute.outscale.com]
PLAY RECAP **********************************ows-109-232-233-69.eu-west-2.compute.outscale.com : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Lancement du playbook depuis Terraform ?
Pourquoi je n’utilise pas la ressource ansible_playbook
?
- Parce qu’il ne prend pas en charge les fichiers de configuration
ansible.cfg
locaux. - Parce qu’il ne cible que les machines définies dans les ressources
ansible_host
.
Conclusion
En conclusion, l’intégration d’Ansible avec Terraform offre de puissantes possibilités d’automatisation pour la gestion des infrastructures cloud.
Pour une gestion plus précise et conforme aux standards, il est souvent préférable de gérer l’exécution des playbooks Ansible en dehors de Terraform, permettant ainsi un contrôle total sur la configuration et l’exécution des tâches.