Cela fait un petit moment que je souhaite réaliser un post d'initiation à Terraform et nous y voilà enfin !

Comment utiliser Terraform afin de provisionner des instances sur le Public Cloud d'OVH qui utilise OpenStack.

Terraform

Tout d'abord un petit point sur Terraform : C'est un logiciel open source qui est développé par HashiCorp ( Société déjà à l'origine d'autres logiciels que vous utilisez sûrement : Vault, Consul, Nomad, Vagrant ou encore Packer ). Et qui va nous permettre d'automatiser la construction d'une infrastructure dans le Cloud.

C'est l'Infrastructure as Code : https://fr.wikipedia.org/wiki/Infrastructure_as_Code

Tout ceci à l'aide d'un fichier écrit dans un langage de configuration HCL (Hashicorp Configuration Language).

Il est également possible d'écrire ce fichier au format JSON mais je n'aborderai pas ce point aujourd'hui.

Je vais donc pouvoir, dans un fichier, déclarer les éléments nécessaires à mon infrastructure : comme par exemple un front web, une base de données et un back afin de les pousser sur mon fournisseur de Cloud. Et grâce à cela automatiser mes déploiements et éviter ainsi tout configuration manuelle ce qui va - éventuellement - éviter les erreurs liées à la répétition des commandes.

Il faut savoir que les scripts Terraform sont par contre dépendants de votre provider Cloud : Vous ne pourrez pas réutiliser les lignes qui vont suivre, spécifique à OpenStack/OVH, pour alimenter votre Cloud AWS sans réaliser de modification.

Mais passons à l'installation du logiciel, nous pourrons revenir sur les subtilités du logiciel au cours des articles sur ce sujet !

Installation

Pour installer Terraform, rien de plus simple, il suffit dans la plupart des cas de télécharger le package approprié pour votre système ici :

Download Terraform - Terraform by HashiCorp
Download Terraform

Après votre téléchargement, décompressez le package. Terraform fonctionne comme un seul binaire nommé... : terraform.

Vous pouvez ensuite déplacer l'exécutable dans un dossier inclus dans votre $PATH, comme par exemple :

$ mv ~/Downloads/terraform /usr/local/bin/

Validez ensuite le bon fonctionnement de votre installation :

$ terraform -help
Usage: terraform [-version] [-help] <command> [args]

The available commands for execution are listed below.
The most common, useful commands are shown first, followed by
less common or more advanced commands. If you're just getting
started with Terraform, stick with the common commands. For the
other commands, please read the help and docs before usage.

Maintenant que c'est installé, nous allons pouvoir nous servir du provider OpenStack afin d'instancier notre première machine virtuelle !

OVH provider

Il est tout d'abord nécessaire de créer un utilisateur OpenStack sur votre compte Public Cloud et récupérer votre fichier openrc.sh.

Si vous ne possédez pas d'accès, vous pouvez suivre cet article afin de créer votre premier compte :

OVH : Utilisation de l’API OpenStack
Déployer en quelques minutes une instance avec Kubernetes, Traefik et WordPress sur le Cloud Public d’OVH ?! Let’s go !

Dans mon cas je valide le bon fonctionnement de mes accès :

$ source openrc.sh
Please enter your OpenStack Password:

Et je liste par exemple les modèles d'instance disponibles :

$ openstack flavor list

Enfin, pour stocker mes fichiers de configuration, je vais créer un dossier terraform-ovh dans mon répertoire personnel :

$ mkdir ~/terraform-ovh && cd $_

Mon premier fichier providers.tf va me servir à déclarer mon provider OVH :

provider "openstack" {
  auth_url = "https://auth.cloud.ovh.net/v3.0/"
  domain_name = "default" # Nom de domaine - Toujours à "default" pour OVH
  alias = "ovh" 

  #vos accès OpenStack
  user_name   = "xxxxx"
  password    = "xxxxxxxxxxxxxxxxx"
}

Je vais ensuite créer un fichier instance.tf pour créer ma première instance :

#Déclaration d'une ressouce pour ajouter ma clé SSH sur OpenStack
resource "openstack_compute_keypair_v2" "My-Key" {
  provider   = openstack.ovh
  name       = "My-Key"
  public_key = file("~/.ssh/id_rsa.pub")
}

#Déclaration de l'instance à créer
resource "openstack_compute_instance_v2" "test_terraform_instance" {
   name = "terraform_instance"
   provider = openstack.ovh
   image_name = "Ubuntu 20.04"
   flavor_name = "s1-2"
   key_pair    = openstack_compute_keypair_v2.My-Key.name

   network {
      name = "Ext-Net"
   }
}

🚩 Vous pourrez récupérer la liste des images et modèles d'instance avec la commande openstack 🚩

Voici à quoi ressemble mon arborescence avant de lancer Terraform :

lfache@midgar:~/terraform-ovh$
.
├── instance.tf
└── providers.tf

Vous pouvez ensuite initier votre déploiement Terraform :

lfache@midgar:~/terraform-ovh$ terraform init

Initializing the backend...

Initializing provider plugins...
- Checking for available provider plugins...
- Downloading plugin for provider "openstack" (terraform-providers/openstack) 1.29.0...
....

Comme nous utilisons un provider "officiel" le plugin de connexion est automatiquement téléchargé.

Enfin nous pouvons lancer notre déploiement :

lfache@midgar:~/terraform-ovh$ terraform apply

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create
...

Il est nécessaire de valider les modifications en tapant : yes

openstack_compute_keypair_v2.My-Key2: Creating...
openstack_compute_keypair_v2.My-Key2: Creation complete after 2s [id=My-Key]
openstack_compute_instance_v2.test_terraform_instance: Creating...
openstack_compute_instance_v2.test_terraform_instance: Still creating... [10s elapsed]
openstack_compute_instance_v2.test_terraform_instance: Still creating... [20s elapsed]
openstack_compute_instance_v2.test_terraform_instance: Still creating... [30s elapsed]
openstack_compute_instance_v2.test_terraform_instance: Creation complete after 34s [id=d2c9778ca823-4dcc-9286-9286-103665a0]

Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

Terminé !

Mais vous ne connaissez pas l'IP publique de votre instance ! Aucun souci, pour la récupérer :

lfache@midgar:~/Téléchargements$ openstack server list

Il ne reste plus qu'à me connecter à l'instance :

lfache@midgar:~/terraform-ovh$ ssh ubuntu@X.X.X.X

Enfin pour tout supprimer, c'est aussi simple :

lfache@midgar:~/terraform-ovh$ terraform destroy
...

Il sera également nécessaire de valider la suppression avec yes :

openstack_compute_instance_v2.test_terraform_instance: Destroying... [id=d2c9778ca823-4dcc-9286-9286-103665a0]
openstack_compute_instance_v2.test_terraform_instance: Still destroying... [id=d2c9778ca823-4dcc-9286-9286-103665a0, 10s elapsed]
openstack_compute_instance_v2.test_terraform_instance: Destruction complete after 10s
openstack_compute_keypair_v2.My-Key: Destroying... [id=My-Key]
openstack_compute_keypair_v2.My-Key: Destruction complete after 1s

Voilà, vous savez maintenant comment utiliser Terraform pour initialiser vos instances Cloud public chez OVH !

Vous remarquerez d'ailleurs que le provider n'est pas spécifique à OVH et qu'il s'agit d'un provider OpenStack !

Bien évidemment l'exemple que nous venons de voir est ... très simple ! Mais le but aujourd'hui était de se familiariser avec l'outil. Nous aurons l'occasion dans un prochain article de lancer une infrastructure un peu plus complexe :

  • 4 serveurs : 2 front, 1 back, 1 base de données

Afin d'avoir un exemple plus réaliste qu'aujourd'hui !

N'hésitez pas à permettre au blog de continuer à exister et à fournir un contenu de qualité - enfin je l'espère - au travers de vos dons sur : buymeacoff.ee/lfache
Et n'hésitez pas à m'apporter des remarques ou des commentaires sur Twitter, ou ici 👇