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 }