[Azure] Exécutez des commandes dans une VM via Terraform

Après mes 2 premiers articles sur le déploiement de ressources dans Azure et l’utilisation d’un keyvault pour stocker les mots de passes, nous allons voir comment exécuter des commandes directement au moment du déploiement de la ressource.

Pour faire de la configuration de VM, vous pouvez par exemple utiliser des outils comme Ansible, DSC, etc. Avec Terraform, vous pouvez utiliser des Provisioners: https://www.terraform.io/docs/provisioners/index.html

Des exemples sont disponibles ici: https://github.com/terraform-providers/terraform-provider-azurerm/tree/master/examples/virtual-machines/provisioners/windows

Pour commencer, créez un dossier Files avec 2 fichiers à l’intérieur, FirstLogonCommands.xml et winrm.ps1. Ces 2 fichiers vont s’exécuter lors du premier lancement de la machine, pour configurer le WinRM, pour pouvoir s’y connecter à distance, via le Provider.

Il faut ensuite modifier le fichier 1-virtual-machine.tf et modifier la section os_profile_windows_config en ajoutant la partie winrm:

winrm {
      protocol = "http"
    }
    # Auto-Login's required to configure WinRM
    additional_unattend_config {
      pass         = "oobeSystem"
      component    = "Microsoft-Windows-Shell-Setup"
      setting_name = "AutoLogon"
      content      = "<AutoLogon><Password><Value>${var.admin_password}</Value></Password><Enabled>true</Enabled><LogonCount>1</LogonCount><Username>${var.admin_username}</Username></AutoLogon>"
    }
    additional_unattend_config {
      pass         = "oobeSystem"
      component    = "Microsoft-Windows-Shell-Setup"
      setting_name = "FirstLogonCommands"
      content      = "${file("./files/FirstLogonCommands.xml")}"
    }

Il faut ensuite ajouter le provisioner remote-exec pour exécuter à distance un script ou des commandes. Ici, en PowerShell, je vais installer le rôle Server Web:

provisioner "remote-exec" {
    connection {
      host     = "${azurerm_public_ip.windows_pip.ip_address}"
      type     = "winrm"
      port     = 5985
      https    = false
      timeout  = "5m"
      user     = "${var.admin_username}"
      password = "${var.admin_password}"
    }
    inline = [
      "powershell.exe -ExecutionPolicy Unrestricted -Command {Install-WindowsFeature -name Web-Server -IncludeManagementTools}",
    ]
}

Exécutez votre Terraform, et une fois que la VM est déployée, les scripts de démarrage exécutés, le provider réussi à se connecter et à exécuter la commande PowerShell:

Si vous accédez à l’IP de l’output de Terraform, vous devriez voir votre serveur Web IIS:

Le code complet se trouve ici:

https://github.com/Flodu31/Terraform/tree/master/Deploy_New_Environment_Provisioners

C’est ainsi que se termine ces quelques articles sur Terraform, si vous avez des questions, n’hésitez pas 🙂

4 Comments, RSS

  1. offsec 16 juillet 2019 @ 10 h 11 min

    @ssl @5986 @winrm 🙂

    • Florent 16 juillet 2019 @ 21 h 11 min

      Agree but a bit more difficult to just do a little configuration. Just remove the port in the NSG after and the security problem is not exposed anymore on Internet 😊

  2. Pierre B. 31 juillet 2019 @ 5 h 23 min

    Bonjour,
    Imaginons que j’ai configuré une extension « JoinDomain » sur la VM, les commandes s’exécuteront-elle avant/pendant/après ? si j’ai bien compris la mécanique ce sera avant, ce qui est for dommage.
    Ces instructions sont-elles capables d’intégrer un reboot et de continuer après ?

Laisser un commentaire