2014-07-28 19:43:00 +02:00
---
layout: "docs"
page_title: "Configuring Variables"
sidebar_current: "docs-config-variables"
2014-10-22 05:21:56 +02:00
description: |-
Variables define the parameterization of Terraform configurations. Variables can be overridden via the CLI. Variable usage is covered in more detail in the getting started guide. This page covers configuration syntax for variables.
2014-07-28 19:43:00 +02:00
---
# Variable Configuration
Variables define the parameterization of Terraform configurations.
Variables can be overridden via the CLI. Variable usage is
covered in more detail in the
[getting started guide ](/intro/getting-started/variables.html ).
This page covers configuration syntax for variables.
This page assumes you're familiar with the
[configuration syntax ](/docs/configuration/syntax.html )
already.
## Example
A variable configuration looks like the following:
```
2016-01-21 20:33:16 +01:00
variable "key" {
2016-07-12 00:37:51 +02:00
type = "string"
2016-01-21 20:33:16 +01:00
}
2014-07-28 19:43:00 +02:00
variable "images" {
2016-07-12 00:37:51 +02:00
type = "map"
2016-01-21 20:33:16 +01:00
2016-07-12 00:37:51 +02:00
default = {
us-east-1 = "image-1234"
us-west-2 = "image-4567"
}
}
variable "zones" {
default = ["us-east-1a", "us-east-1b"]
2014-07-28 19:43:00 +02:00
}
```
2014-08-07 09:19:56 +02:00
## Description
2014-07-28 19:43:00 +02:00
2016-07-12 00:37:51 +02:00
The `variable` block configures a single input variable for
2014-07-28 19:43:00 +02:00
a Terraform configuration. Multiple variables blocks can be used to
add multiple variables.
2016-01-21 20:33:16 +01:00
The `name` given to the variable block is the name used to
2014-07-28 19:43:00 +02:00
set the variable via the CLI as well as reference the variable
throughout the Terraform configuration.
Within the block (the `{ }` ) is configuration for the variable.
These are the parameters that can be set:
2016-01-21 20:33:16 +01:00
* `type` (optional) - If set this defines the type of the variable.
2016-07-12 00:37:51 +02:00
Valid values are `string` , `list` , and `map` . If this field is omitted, the
variable type will be inferred based on the `default` . If no `default` is
provided, the type is assumed to be `string` .
* `default` (optional) - This sets a default value for the variable.
If no default is provided, the variable is considered required and
Terraform will error if it is not set. The default value can be any of the
data types Terraform supports. This is covered in more detail below.
2014-07-28 19:43:00 +02:00
* `description` (optional) - A human-friendly description for
the variable. This is primarily for documentation for users
using your Terraform configuration. A future version of Terraform
will expose these descriptions as part of some Terraform CLI
command.
------
2016-07-12 00:37:51 +02:00
**Default values** can be strings, lists, or maps. If a default is specified,
it must match the declared type of the variable.
2014-07-28 19:43:00 +02:00
String values are simple and represent a basic key to value
mapping where the key is the variable name. An example is:
```
variable "key" {
2016-07-12 00:37:51 +02:00
type = "string"
default = "value"
2014-07-28 19:43:00 +02:00
}
```
A map allows a key to contain a lookup table. This is useful
for some values that change depending on some external pivot.
A common use case for this is mapping cloud images to regions.
An example:
```
variable "images" {
2016-07-12 00:37:51 +02:00
type = "map"
default = {
us-east-1 = "image-1234"
us-west-2 = "image-4567"
}
}
```
A list can also be useful to store certain variables. For example:
2016-01-21 20:33:16 +01:00
2016-07-12 00:37:51 +02:00
```
variable "users" {
type = "list"
default = ["admin", "ubuntu"]
2014-07-28 19:43:00 +02:00
}
```
2016-07-12 00:37:51 +02:00
The usage of maps, list, strings, etc. is documented fully in the
2014-07-28 19:43:00 +02:00
[interpolation syntax ](/docs/configuration/interpolation.html )
page.
2016-03-02 00:08:57 +01:00
## Syntax
The full syntax is:
```
variable NAME {
2016-07-12 00:37:51 +02:00
[type = TYPE]
[default = DEFAULT]
[description = DESCRIPTION]
2016-03-02 00:08:57 +01:00
}
```
where `DEFAULT` is:
```
VALUE
2016-07-12 00:37:51 +02:00
[
VALUE,
...
]
2016-03-02 00:08:57 +01:00
{
2016-07-12 00:37:51 +02:00
KEY = VALUE
...
2016-03-02 00:08:57 +01:00
}
```
2015-04-22 06:37:03 +02:00
## Environment Variables
Environment variables can be used to set the value of a variable.
The key of the environment variable must be `TF_VAR_name` and the value
is the value of the variable.
For example, given the configuration below:
```
variable "image" {}
```
The variable can be set via an environment variable:
```
$ TF_VAR_image=foo terraform apply
2016-07-12 00:37:51 +02:00
```
Maps and lists can be specified using environment variables as well using
[HCL ](/docs/configuration/syntax.html#HCL ) syntax in the value.
Given the variable declarations:
```
variable "somelist" {
type = "list"
}
```
The variable could be set like so:
```
$ TF_VAR_somelist='["ami-abc123", "ami-bcd234"]' terraform plan
```
Similarly, for a map declared like:
```
variable "somemap" {
type = "map"
}
```
The value can be set like this:
```
$ TF_VAR_somemap='{foo = "bar", baz = "qux"}' terraform plan
2015-04-22 06:37:03 +02:00
```
2016-03-02 00:08:57 +01:00
## Variable Files
2014-07-28 19:43:00 +02:00
2016-07-12 00:37:51 +02:00
< a id = "variable-files" > < / a >
2016-03-02 00:08:57 +01:00
Variables can be collected in files and passed all at once using the
2016-04-29 15:06:36 +02:00
`-var-file=foo.tfvars` flag. The format for variables in `.tfvars`
2016-07-12 00:37:51 +02:00
files is [HCL ](/docs/configuration/syntax.html#HCL ), with top level key/value
pairs:
2016-05-25 17:38:32 +02:00
2016-04-29 15:06:36 +02:00
```
foo = "bar"
xyz = "abc"
2016-07-12 00:37:51 +02:00
somelist = [
"one",
"two",
]
somemap = {
foo = "bar"
bax = "qux"
}
2016-04-29 15:06:36 +02:00
```
2016-03-02 00:08:57 +01:00
The flag can be used multiple times per command invocation:
2014-07-28 19:43:00 +02:00
```
2016-03-02 00:08:57 +01:00
terraform apply -var-file=foo.tfvars -var-file=bar.tfvars
2014-07-28 19:43:00 +02:00
```
2016-07-12 00:37:51 +02:00
**Note** If a variable is defined in more than one file passed, the last
variable file (reading left to right) will be the definition used. Put more
2016-03-02 00:08:57 +01:00
simply, the last time a variable is defined is the one which will be used.
2016-04-29 15:06:36 +02:00
### Precedence example:
2014-07-28 19:43:00 +02:00
2016-03-02 00:08:57 +01:00
Both these files have the variable `baz` defined:
_foo.tfvars_
```
2016-04-29 15:06:36 +02:00
baz = "foo"
2014-07-28 19:43:00 +02:00
```
2016-03-02 00:08:57 +01:00
_bar.tfvars_
```
2016-04-29 15:06:36 +02:00
baz = "bar"
2014-07-28 19:43:00 +02:00
```
2016-03-02 00:08:57 +01:00
When they are passed in the following order:
```
terraform apply -var-file=foo.tfvars -var-file=bar.tfvars
```
The result will be that `baz` will contain the value `bar` because `bar.tfvars`
has the last definition loaded.