Terraform - Infrastructure-as-a-Code
C'est un outil pour définir et provisionner des infrastructures Cloud en utilisant simplement un fichier de configuration (IaC).
---
- Fichiers
Il y a différents fichiers de base (.tf) qui sont nécessaire pour le bon fonctionnement de Terraform.
``` project/ ├── globals.tfvars └── environments/
└── dev/
├── main.tf
├── variables.tf
└── provider.tf
└── prod/
├── main.tf
├── variables.tf
└── provider.tf
```
- Provider
Ce fichier permet de définir :
``` terraform {
required_version = ">=1.2"
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "=4.1.0"
}
}
backend "azurerm" {
resource_group_name = "rg-rd-tfstate-chn"
storage_account_name = "rdsttfstate"
container_name = "tfstate"
key = "terraform.tfstate"
}
}
provider "azurerm" {
features {}
}
```
- Définir la version et le provider requis pour Terraform - Où doit être modifier le tfstate (storage account Azure, S3 sur Exo, ...) - Le Cloud Provider à utiliser (Azure, AWS, Exoscale, etc.) afin d'avoir accès à la bibliothèque (disponible sur https://registry.terraform.io/)
- Main
Le fichier main.tf est le fichier principal, part le quel les différentes actions vont agir sur l'infrastructure (création, suppression et modification).
``` resource "azurerm_Resource_group" "example" { name = "example-rg" location = "France Central" } ```
- Resource : permet de définir qu'il s'agit d'une ressource - azurerm_Resource_group : RG sur Azure, information trouvable sur la registry - example : c'est la variable de la ressource, dans le cas ou on doit la rappeler
- Variables
Dans les bonnes pratiques de Terraform, il faut :
``` variables.tf
variable "resource_group_name" {
description = "Nom du groupe de ressources" type = string
}
--
variables.tfvars
resource_group_name = "rg-rd-testmachine-chn" ```
- Déclarer les variables dans un variable.tf - Définir les valeurs des variables du .tf dans un variable.**tfvars**
---
- Procédure
Afin de déployer via du code du Terraform, il est séquencé en trois parties : init, plan & apply.
- Init
La première étape est init (initialisation) :
``` terraform init ```
- Installation des plugins pour interagir avec le provider - Initialisation du Backend pour le .tfstat - Préparation du dossier de travail pour l'execution des autres commandes Terraform
- Plan
La deuxième étape est plan (planification):
``` terraform plan ```
- Analyse les fichiers de configurations pour déterminer les ressources à créer, modifier ou supprimer - Il présente un plan d'exécution afin de voir ce qui va être modifié - Permet d'avoir un review des changements avant d'appliquer
- Apply
La dernière étape est apply (application)
``` terraform apply ```
- Confirmation des changement avant d'appliquer - Une fois confirmer, il va appliquer les changements relatif à vos fichiers de configuration - Mettre à jour le .tfstat
---
- .tfstate
C'est un fichier crucial afin de maintenir un alignement correcte entre la configuration et l'infrastructure actuel. Après chaque modification, ce fichier doit être mis à jour.
On peut grâce à lui afficher les ressources managées part Terraform
``` terraform show ```
---
- Destroy
Il est possible de supprimer tout la configuration générée par Terraform
``` terraform destroy ```
- Affiche les ressources qui vont être supprimées - Demande une confirmation avant de supprimer - Une fois confirmé, il supprime les ressources
- Suppression d'une ressource
Afin de supprimer une ressource, il suffit simplement de retirer la ressource du main.tf. Ceci va supprimer la ressource et mettre à jour le .tfstate
---
- Modules
Terraform, c'est des input sur une infrastructure. Cependant, parfois, il est nécessaire d'utiliser le résultat pour d'autres projets (modules) dans un même gros projet (project).
``` project/ ├── provider.tf ├── main.tf └── modules/
└── azure_rg_module/
├── main.tf
├── output.tf
└── variables.tf
└── azure_resource_module/
├── main.tf
├── output.tf
└── variables.tf
```
- main.tf (main branch) : on doit déclarer un module ainsi que sa source, location, ressource_group_name ainsi que ces variables
- Output
Si nous avons par exemple un resource group sur Azure qui va être créer, et qu'un autre projet à besoin de l'id, il est possible de le récupérer grâce au fichier output
