--- page_title: Provisioners Without a Resource description: >- A terraform_data managed resource allows you to configure provisioners that are not directly associated with a single existing resource. --- # Provisioners Without a Resource If you need to run provisioners that aren't directly associated with a specific resource, you can associate them with a `terraform_data`. Instances of [`terraform_data`](/terraform/language/resources/terraform-data) are treated like normal resources, but they don't do anything. Like with any other resource type, you can configure [provisioners](/terraform/language/resources/provisioners/syntax) and [connection details](/terraform/language/resources/provisioners/connection) on a `terraform_data` resource. You can also use its `input` argument, `triggers_replace` argument, and any meta-arguments to control exactly where in the dependency graph its provisioners will run. ~> **Important:** Use provisioners as a last resort. There are better alternatives for most situations. Refer to [Declaring Provisioners](/terraform/language/resources/provisioners/syntax) for more details. ## Example usage ```hcl resource "aws_instance" "cluster" { count = 3 # ... } resource "terraform_data" "cluster" { # Replacement of any instance of the cluster requires re-provisioning triggers_replace = aws_instance.cluster[*].id # Bootstrap script can run on any instance of the cluster # So we just choose the first in this case connection { host = aws_instance.cluster[0].public_ip } provisioner "remote-exec" { # Bootstrap script called with private_ip of each node in the cluster inline = [ "bootstrap-cluster.sh ${join(" ", aws_instance.cluster[*].private_ip)}", ] } } ```