Terrafrom Tutorials – remote-exec provisioner using AWS & Azure providers

the remote-exec provisioner in Terraform is used to execute commands remotely on a target resource after it’s been created. This is often used for post-deployment configuration or initialization tasks on virtual machines, containers, or other infrastructure resources.

Here’s a general example of how you can use the remote-exec provisioner:


resource "aws_instance" "example" {
  ami           = "ami-12345678"  # Replace with your desired AMI ID
  instance_type = "t2.micro"
}

provisioner "remote-exec" {
  inline = [
    "echo This is a remote command.",
    "echo You can execute multiple commands here.",
    "echo Remember that each command is executed independently.",
  ]
}


The remote-exec provisioner requires a connection block to specify how Terraform will connect to the remote resource. The connection block can be defined in the same resource block as the remote-exec provisioner, or it can be defined in a separate resource block.

The remote-exec provisioner has the following arguments:

  • inline: A list of commands to be executed. The provisioner uses a default shell unless you specify a shell as the first command (eg., #!/bin/bash).
  • script: A path to a local script that will be copied to the remote resource and then executed.
  • scripts: A list of paths to local scripts that will be copied to the remote resource and then executed, one after the other.
  • timeout: The maximum amount of time to wait for the commands to complete, in seconds.
  • on_failure: The action to take if the commands fail. Valid values are “continue” and “fail”.

resource "aws_instance" "example" {
  ...
}

resource "null_resource" "bootstrap" {
  depends_on = ["aws_instance.example"]

  provisioner "remote-exec" {
    connection {
      instance_id = aws_instance.example.id
      user = "ubuntu"
    }

    inline = ["sudo apt-get update", "sudo apt-get install -y terraform"]
    timeout = 600
    on_failure = "fail"
  }
}

Remote Exec in Windows


  provisioner "remote-exec" {
    on_failure = "continue"
    inline = [
      "powershell.exe -NonInteractive -NoProfile -ExecutionPolicy Bypass -Command \"Write-Output 'Hello from Terraform'\"",
    ]
  }

  connection {
    type        = "winrm"
    user        = "Administrator"
    password    = "your_password"
    host        = self.public_ip_address
    https       = false
    port        = 5985
    timeout     = "10m"
  }
}

  connection {
    type     = "winrm"
    user     = "Administrator"
    password = "your_password"
    host     = self.public_ip_address
    https    = false
    port     = 5985
    timeout  = "10m"
  }

  provisioner "remote-exec" {
    on_failure = "continue"
    inline = [
      "cmd /c echo Hello from Terraform"
    ]
  }

provider "azurerm" {
  features {}
}

resource "azurerm_virtual_machine" "example" {
  # ... other VM configuration ...

  connection {
    type        = "winrm"
    user        = "Administrator"
    password    = "your_password"
    host        = self.public_ip_address
    https       = false
    port        = 5985
    timeout     = "10m"
  }
}

resource "null_resource" "example" {
  triggers = {
    instance_id = azurerm_virtual_machine.example.id
  }

  provisioner "local-exec" {
    command = "echo Remote execution completed"
  }

  provisioner "remote-exec" {
    on_failure = "continue"
    inline = [
      "powershell.exe -NonInteractive -NoProfile -ExecutionPolicy Bypass -Command \"Write-Output 'Hello from Terraform'\"",
    ]
  }

  depends_on = [azurerm_virtual_machine.example]
}

Rajesh Kumar
Follow me