Tutoriel Terraform
===
## Introduction
### Qu'est-ce que Terraform ?
Terraform est un outil d'Infrastructure as Code (IaC) développé par HashiCorp. Il permet aux utilisateurs de définir et de provisionner l'infrastructure des services cloud en utilisant un langage de configuration simple et déclaratif.
### Pourquoi utiliser Terraform ?
- Automatisation de l'infrastructure : Terraform automatise le déploiement et la gestion de l'infrastructure, réduisant le risque d'erreurs humaines.
- Gestion de l'état : Terraform maintient un état de l'infrastructure, permettant des modifications et des déploiements prévisibles.
- Support multi-cloud : Terraform peut gérer les ressources sur plusieurs plateformes cloud, offrant une grande flexibilité.
- Infrastructure en tant que code : Les configurations sont écrites dans des fichiers qui peuvent être versionnés, réutilisés et partagés.
## Installation de Terraform
```shell=
## Linux & Windows
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg -- dearmor -o \
/usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install terraform
## MacOS
brew tap hashicorp/tap
brew install hashicorp/tap/terraform
```
## Configuration de Terraform
Pour pouvoir utiliser Terraform, il faudra plusieurs prérequis en plus de Terraform lui-même. Tout d'abord une clef SSH valide :
```shell=
# Vérifier si une clef SSH est présente
ls ~/.ssh/id_rsa.pub
# Si ce n'est pas le cas, on la crée
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa
```
Pour Terraform avec Azure, il faudra également la présence d'Azure CLI sur votre système : [Install AzureCLI](#)
Pour Terraform avec AWS, il faudra également la présence d'AWS CLI sur votre système : [Install AWS CLI](#)
## Démarrer avec Terraform
```yaml=
provider "azurerm" {
features {}
}
resource "azurerm_resource_group" "example" {
name = "example-rg"
location = "France Metropolitaine"
}
```
Les deux fichiers écrits ici sont simples. Mais ils permettent d'annoncer quel est le fournisseur que vous allez utiliser. Au-dessus : azure, en dessous aws. Par une préférence injuste, tout sera fait sur Azure.
```yaml=
provider "aws" {
region = "eu-west-3"
}
resource "aws_vpc" "example" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "example-vpc"
}
}
```
## terraform init
```shell=
# Connexion à Azure, importance d'avoir AzureCLI
az login
# Initialisation du fichier et du fournisseur
terraform init
```
Que fait terraform init ?
- Installation des plugins : Terraform télécharge et installe les plugins nécessaires pour intéragir avec les fournisseurs spécifiés dans votre configuration (par exemple Azure ou AWS).
- Initialisation du Backend : Si spécifié, configure le backend pour l'état de Terraform.
- Préparation du Répertoire : Terraform prépare le répertoire de travail pour l'exécution des autres commandes Terraform.
Un message de succès indiquera que l'initialisation s'est déroulée correctement. Vous êtes maintenant prêt à planifier et appliquer vos configuations Terraform.
## terraform plan
```shell=
#Exécutez terraform plan dans votre répertoire de projet pour voir quels changements seront appliqués à votre infrastructure.
terraform plan
```
Que fait terraform plan ?
- Analyse de la configuration : Terraform analyse vos fichiers de configuration pour déterminer les ressources à créer, modifier ou détruire.
- Affichage des changements : Terraform présente un plan d'exécution montrant ce qui sera modifié dans l'infrastructure.
- Prévention des surprises : Cela permet de vérifier les changements avant de les appliquer, réduisant le risque d'erreurs inattendues.
Le plan affiche des ajouts (+), des changements (~) et des suppressions (-). Il est crucial de le lire attentivement pour s'assurer que les changements correspondent à vos attentes.
```
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# azurerm_resource_group.example will be created
+ resource "azurerm_resource_group" "example" {
+ id = {known after apply}
+ location = "francemetropolitaine"
+ name = example-rg
}
Plan: 1 to add, 0 to change, 0 to destroy.
```
## terraform apply
```shell=
# Exécutez terraform apply pour appliquer les changements spécifiés dans votre plan d'exécution.
terraform apply
```
Que fait terraform apply ?
- Confirmation des changements : Avant d'appliquer les changements, Terraform affiche le plan et demande une confirmation.
- Modification de l'infrastructure : Si confirmé, Terraform applique les changements à l'infrastructure conformément à votre configuration.
- Mise à jour de l'état : Après l'application des changements, Terraform met à jour le fichier d'état pour refléter l'état actuel de l'infrastructure.
L'état de Terraform est crucial pour maintenir l'alignement entre votre configuration et l'infrastructure réelle. Après chaque application, Terraform met à jour son fichier d'état.
## terraform destroy
```shell=
# Utilisez terraform destroy pour supprimer toutes les ressources gérées par votre configuration Terraform.
terraform destroy
```
Que fait terraform destroy ?
- Affichage des ressources à supprimer : Terraform affiche la liste des ressources qu'il prévoit de supprimer.
- Demande de confirmation : Avant de procéder, Terraform demande une confirmation pour s'assurer que vous souhaitez supprimer ces ressources.
- Destruction des ressources : Si confirmé, Terraform supprime8 toutes les ressources listées, nettoyant ainsi l'infrastructure.
Cette commande est utile lors de la fin d'un projet, pour les environnements de test, ou pour reconstruire entièrement une infrastructure. Il est importnant de l'utiliser avec prudence, car elle supprime toutes les ressources gérées.
## Gestion de l'état
```shell=
# Liste toutes les ressrouces que Terraform gère actuellement
terraform state liste
# Affiche l'état actuel de votre infrastructure telle que connue par Terraform
terraform show
```