Terraform : les provisionners

Posted by

Terraform inclue la notion de provisionners afin de permettre l’exécution de commandes soit locales, soit exécutées à distance sur les VM déployées. Les provisionners doivent être utilisés en dernier recours car l’exécution des provisionners sort du cycle d’ordonnancement de Terraform.

Il existe de base trois provisionners, file, local-exec et remote-exec. Il existe cependant des provisionners third-party comme le provisionner puppet.

Il est possible de combiner plusieurs provisionners au sein d’une même ressource.

Un certain nombre d’action de post-installation peuvent être couvertes soit dans la création des images utilisées pour les déploiements soit via l’utilisation de cloud-init.

Local-Exec :
Permet d’exécuter une commande locale. Exemple :

resource "azurerm_linux_virtual_machine" "azvm01" {
  name                            = "azvm01"
  resource_group_name             = azurerm_resource_group.rg-dev.name
  location                        = var.location
  size                            = "Standard_B1ls"
  admin_username                  = var.lnxuser
  admin_password                  = var.lnxpwd
  disable_password_authentication = false
  network_interface_ids = [
    azurerm_network_interface.nic-azvm01.id,
  ]

  source_image_reference {
    publisher = "Canonical"
    offer     = "0001-com-ubuntu-server-focal"
    sku       = "20_04-lts"
    version   = "latest"
  }

  os_disk {
    storage_account_type = "Standard_LRS"
    caching              = "ReadWrite"
  }

  provisioner "local-exec" {
    command = "echo ${self.name} created with IP ${self.public_ip_address} >> azlogs.txt"
  }
}

Après avoir joué le plan, cela donne :

$ cat azlogs.txt
azvm01 created with IP 40.114.205.199


Remote-Exec :

Permet de lancer une commande à distance au provisionning de la ressource :

resource "azurerm_linux_virtual_machine" "azvm01" {
  name                            = "azvm01"
  resource_group_name             = azurerm_resource_group.rg-dev.name
  location                        = var.location
  size                            = "Standard_B1ls"
  admin_username                  = var.lnxuser
  admin_password                  = var.lnxpwd
  disable_password_authentication = false
  network_interface_ids = [
    azurerm_network_interface.nic-azvm01.id,
  ]

  source_image_reference {
    publisher = "Canonical"
    offer     = "0001-com-ubuntu-server-focal"
    sku       = "20_04-lts"
    version   = "latest"
  }

  os_disk {
    storage_account_type = "Standard_LRS"
    caching              = "ReadWrite"
  }

  connection {
    type     = "ssh"
    user     = self.admin_username
    password = self.admin_password
    host     = self.public_ip_address
  }

  provisioner "remote-exec" {
    inline = [
      "sudo apt-get -y update",
      "sudo apt-get -y dist-upgrade",
    ]
  }
}

File :

Permet de copier un fichier ou un répertoire au provisionning de la ressource :

resource "azurerm_linux_virtual_machine" "azvm01" {
  name                            = "azvm01"
  resource_group_name             = azurerm_resource_group.rg-dev.name
  location                        = var.location
  size                            = "Standard_B1ls"
  admin_username                  = var.lnxuser
  admin_password                  = var.lnxpwd
  disable_password_authentication = false
  network_interface_ids = [
    azurerm_network_interface.nic-azvm01.id,
  ]

  source_image_reference {
    publisher = "Canonical"
    offer     = "0001-com-ubuntu-server-focal"
    sku       = "20_04-lts"
    version   = "latest"
  }

  os_disk {
    storage_account_type = "Standard_LRS"
    caching              = "ReadWrite"
  }

  connection {
    type     = "ssh"
    user     = self.admin_username
    password = self.admin_password
    host     = self.public_ip_address
  }

  provisioner "file" {
    source      = "sshd_config"
    destination = "/etc/ssh/sshd_config"
  }
}

Comportement en cas d'échec :
Par défaut, si le provisionner échoue, l'instanciation de la ressource également. Ce comportement peut être modifié avec le paramètre on_failure qui a deux valeurs possibles, continue ou fail.

  provisioner "local-exec" {
    command = "echo ${self.name} created with IP ${self.public_ip_address} >> azlogs.txt"
    on_failure = continue
  }

Provisionner à la suppression :
Le paramètre when permet également d'indiquer qu'un provisionner doit être exécuté lorsque la ressource est détruite.

  provisioner "local-exec" {
    command = "echo ${self.name} with IP ${self.public_ip_address} destroyed >> azlogs.txt"
    when    = destroy
  }

Leave a Reply

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.