github.com/terramate-io/tf@v0.0.0-20230830114523-fce866b4dfcd/website/docs/language/resources/provisioners/null_resource.mdx (about) 1 --- 2 page_title: Provisioners Without a Resource 3 description: >- 4 A terraform_data managed resource allows you to configure provisioners that 5 are not directly associated with a single existing resource. 6 --- 7 8 # Provisioners Without a Resource 9 10 If you need to run provisioners that aren't directly associated with a specific 11 resource, you can associate them with a `terraform_data`. 12 13 Instances of [`terraform_data`](/terraform/language/resources/terraform-data) are treated 14 like normal resources, but they don't do anything. Like with any other resource 15 type, you can configure [provisioners](/terraform/language/resources/provisioners/syntax) 16 and [connection details](/terraform/language/resources/provisioners/connection) on a 17 `terraform_data` resource. You can also use its `input` argument, `triggers_replace` argument, and any 18 meta-arguments to control exactly where in the dependency graph its 19 provisioners will run. 20 21 ~> **Important:** Use provisioners as a last resort. There are better alternatives for most situations. Refer to 22 [Declaring Provisioners](/terraform/language/resources/provisioners/syntax) for more details. 23 24 ## Example usage 25 26 ```hcl 27 resource "aws_instance" "cluster" { 28 count = 3 29 30 # ... 31 } 32 33 resource "terraform_data" "cluster" { 34 # Replacement of any instance of the cluster requires re-provisioning 35 triggers_replace = aws_instance.cluster.[*].id 36 37 # Bootstrap script can run on any instance of the cluster 38 # So we just choose the first in this case 39 connection { 40 host = aws_instance.cluster.[0].public_ip 41 } 42 43 provisioner "remote-exec" { 44 # Bootstrap script called with private_ip of each node in the cluster 45 inline = [ 46 "bootstrap-cluster.sh ${join(" ", aws_instance.cluster.*.private_ip)}", 47 ] 48 } 49 } 50 ```