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.",
]
}
provider "aws" { | |
profile = "default" | |
region = "us-west-2" | |
} | |
resource "aws_key_pair" "example" { | |
key_name = "examplekey" | |
public_key = file("~/.ssh/terraform.pub") | |
} | |
resource "aws_instance" "example" { | |
key_name = aws_key_pair.example.key_name | |
ami = "ami-04590e7389a6e577c" | |
instance_type = "t2.micro" | |
connection { | |
type = "ssh" | |
user = "ec2-user" | |
private_key = file("~/.ssh/terraform") | |
host = self.public_ip | |
} | |
provisioner "remote-exec" { | |
inline = [ | |
"sudo amazon-linux-extras enable nginx1.12", | |
"sudo yum -y install nginx", | |
"sudo systemctl start nginx" | |
] | |
} | |
} |
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]
}










I’m a DevOps/SRE/DevSecOps/Cloud Expert passionate about sharing knowledge and experiences. I am working at Cotocus. I blog tech insights at DevOps School, travel stories at Holiday Landmark, stock market tips at Stocks Mantra, health and fitness guidance at My Medic Plus, product reviews at I reviewed , and SEO strategies at Wizbrand.
Please find my social handles as below;
Rajesh Kumar Personal Website
Rajesh Kumar at YOUTUBE
Rajesh Kumar at INSTAGRAM
Rajesh Kumar at X
Rajesh Kumar at FACEBOOK
Rajesh Kumar at LINKEDIN
Rajesh Kumar at PINTEREST
Rajesh Kumar at QUORA
Rajesh Kumar at WIZBRAND