@ -1,23 +1,22 @@
---
page_title: Provisioners Without a Resource
description: >-
A null_ resource allows you to configure provisioners that are not directly
associated with a single existing resource.
A terraform_data managed resource allows you to configure provisioners that
are not directly a ssociated with a single existing resource.
---
# Provisioners Without a Resource
[null]: https://registry.terraform.io/providers/hashicorp/null/latest/docs/resources/resource
If you need to run provisioners that aren't directly associated with a specific
resource, you can associate them with a `null_resource`.
Instances of [`null_resource`][null] are treated like normal resources, but they
don't do anything. Like with any other resource, you can configure
[provisioners](/language/resources/provisioners/syntax) and [connection
details](/language/resources/provisioners/connection) on a `null_resource`. You can also
use its `triggers` argument and any meta-arguments to control exactly where in
the dependency graph its provisioners will run.
Instances of [`terraform_data`](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](/language/resources/provisioners/syntax)
and [connection details](/language/resources/provisioners/connection) on a
`terraform_data` resource. You can also use its `triggers` 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](/language/resources/provisioners/syntax) for more details.
@ -31,16 +30,14 @@ resource "aws_instance" "cluster" {
# ...
}
resource "null_resource" "cluster" {
# Changes to any instance of the cluster requires re-provisioning
triggers = {
cluster_instance_ids = "${join(",", aws_instance.cluster.*.id)}"
}
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 = "${element(aws_instance.cluster.*.public_ip, 0)}"
host = aws_instance.cluster.[0].public_ip
}
provisioner "remote-exec" {
@ -51,12 +48,3 @@ resource "null_resource" "cluster" {
}
}
```
## Argument Reference
In addition to meta-arguments supported by all resources, `null_resource`
supports the following specific arguments:
- `triggers` - A map of values which should cause this set of provisioners to
re-run. Values are meant to be interpolated references to variables or
attributes of other resources.