Création d’infrastructure avec Terraform

 english version

Terraform est un outil d’Infrastructure As Code qui vous permet de définir des ressources dans des fichiers de configuration, que vous pouvez modifier, réutiliser et partager.

Vous pouvez ensuite utiliser un workflow pour approvisionner et gérer l’ensemble de votre infrastructure tout au long de son cycle de vie.

Terraform utilise des providers pour gérer chaque fournisseur de cloud. VMWare a développé un provider Terraform pour son outil VCD dont l’ensemble des fonctionnalités est disponible dans la documentation .

Pour chaque type de ressource la documentation contient des exemples d’utilisations, quelques exemples ci-dessous repris de la documentation du provider terraform VCD avec un lien direct vers la documentation associé.

Utilisation VCD provider

terraform {
  required_providers {
    vcd = {
      source = "vmware/vcd"
      version = "3.6.0"
    }
  }
}

provider "vcd" {
  # Configuration options
}

Création de réseaux

Il existe plusieurs type de réseaux : routé, isolé, direct ; dans cet exemple un réseau routé

resource "vcd_network_routed_v2" "nsxt-backed" {
  org         = "my-org"
  name        = "nsxt-routed 1"
  description = "My routed Org VDC network backed by NSX-T"

  edge_gateway_id = data.vcd_nsxt_edgegateway.existing.id

  gateway       = "1.1.1.1"
  prefix_length = 24

  static_ip_pool {
    start_address = "1.1.1.10"
    end_address   = "1.1.1.20"
  }

}

Création de vAPP

Création d’une vAPP nommé « web » a laquelle on associe un réseau d’organisation.

resource "vcd_vapp" "web" {
  name = "web"

  metadata = {
    CostAccount = "Marketing Department"
  }
}

# attach a existing org network to the vapp
resource "vcd_vapp_org_network" "routed_network" {
  vapp_name        = vcd_vapp.web.name
  org_network_name = vcd_network_routed_v2.nsxt-network.name
}

Création de VM dans une vapp

Création d’une VM nommé « my-VM » dans la vAPP « web »

resource "vcd_vapp_vm" "my-VM" {
  vapp_name           = vcd_vapp.web.name
  name                = "my-VM"
  computer_name       = "db-vm"
  catalog_name        = "cat-where-is-template"
  template_name       = "vappWithMultiVm"
  memory              = 512
  cpus                = 2
  cpu_cores           = 1
}

Utilisation d’un projet terraform

Terraform est un outil en ligne de commande, qui peut être executer sur différents OS (linux, windows, MacOs).

L’application d’une configuration terraform se fait en général en 2 phases, une commande « plan » qui affiche les modifications qui vont être appliquer et une commande « apply » qui execute les modifications.

A la premiere utilisation d’un projet il faut également faire avant le plan et l’apply une commande « init » pour initialiser le projet (téléchargement des providers utilisés)

#> cd [project directory]

#> terraform init
Initializing modules...

Initializing the backend...

Initializing provider plugins...
- Reusing previous version of hashicorp/local from the dependency lock file
- Reusing previous version of vmware/vcd from the dependency lock file
- Using previously-installed hashicorp/local v2.2.2
- Using previously-installed vmware/vcd v3.5.1

Terraform has been successfully initialized!

#> terraform plan
terraform plan -var-file smart.tfvars

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:

[...]

Plan: 13 to add, 0 to change, 0 to destroy.

Changes to Outputs:
+ out_vm = (sensitive value)
──────────────────────────────────────────────────────────────────
#> terraform apply

[terraform redisplay the terraform plan]

Plan: 13 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.

Enter a value:

[to apply the change you must enter yes, then terraform display the log of apply]

vcd_vapp.vapp1["vapp_01"]: Creating...
vcd_network_isolated_v2.inetwork["iso_03"]: Creating...
vcd_network_isolated_v2.inetwork["iso_02"]: Creating...
vcd_network_routed_v2.rnetwork["rtr_01"]: Creating...

[...]

module.vm_instance["vm-02"].vcd_vm_internal_disk.diskadd["1"]: Still creating... [40s elapsed]
module.vm_instance["vm-02"].vcd_vm_internal_disk.diskadd["1"]: Creation complete after 42s [id=2002]
local_file.output: Creating...
local_file.output: Creation complete after 0s [id=09a3efb91e3e2d185c46aa6a084b276220818ea9]

Apply complete! Resources: 13 added, 0 changed, 0 destroyed.
#>

Exemple d’un projet Iac avec Terraform et Gitlab

Notes a propos des identifiants

Ne jamais mettre d’identifiants (login, password, token) dans votre code terraform, utiliser des variables, et stocker le contenu de celle ci non dans un fichier mais dans un gestionnaire de secret. Selon la technique de déploiement utilisé vous aurez différentes possibilité, par exemple la documentation de Gitlab donne explique comment utiliser Hashicorp Vault pour definir vos identifiants