Aller au contenu

Utilisation du provider Terraform Ansible

Mise à jour :

logo terraform

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.

Terminal window
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 :

Terminal window
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 :

Terminal window
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.

Terminal window
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.