Variables#

https://www.terraform.io/language/values/variables

Variable Syntax#

variable "name_label" {

  type = string

  description = "value"

  default = "value"

  sensitive = true

}

to reference the variable var.<name_label>

Note

我们可以使用 terraform console 去测试variable. https://www.terraform.io/cli/commands/console

Data Types#

https://www.terraform.io/language/expressions/types

Primitive Types#

  • String

  • number

  • boolean

variable "aws_secret_key" {
  type        = string
  description = "aws secret key"
  sensitive   = true
}

variable "enable_dns_hostnames" {
  type        = bool
  description = "enable dns hostname"
  default     = true
}

variable "volume_size" {
  type        = number
  description = "volume size in gibibytes"
  default     = 10
}

to reference the values in terraform code, just var.<name_label> , like var.aws_secret_key

> var.aws_secret_key
(sensitive)
> var.enable_dns_hostnames
true
> var.volume_size
10

Collections Types#

  • List (list里的所有数据的数据类型必须是一样的,比如 list(string), list(number) )

variable "aws_regions" {

  type = list(string)

  description = "Region to use for AWS"

  default = ["us-east-1", "us-east-2", "us-west-1", "us-west-2"]

}

to reference collection values:

var.<name_labe>[<index>] index will start 0.

> var.aws_regions
tolist([
  "eu-central-1",
  "us-east-1",
  "us-east-2",
])
> var.aws_regions[1]
"us-east-1"
> var.aws_regions[0]
"eu-central-1"
  • map , a group of values identified by named labels, 数据类型需要一致.

variable "aws_instance_sizes" {

  type        = map(string)
  description = "instance sizes"
  default = {

    small  = "t2.micro"
    medium = "t2.small"
    large  = "t2.large"
  }
}

to reference var.<name_label>.<key_name> or var.<name_label>["key_name"]

> var.aws_instance_sizes
tomap({
  "large" = "t2.large"
  "medium" = "t2.small"
  "small" = "t2.micro"
})
>

> var.aws_instance_sizes.large
"t2.large"
> var.aws_instance_sizes["large"]
"t2.large"
>

类型不一致会进行类型转换

variable "student1" {
  type        = map(string)
  description = "student information"
  default = {
    name = "xxxx"
    age  = 20
  }
}
> var.student1
tomap({
  "age" = "20"
  "name" = "xxxx"
})
> var.student1.age
"20"

Structural Types#

  • Tuple,对应List,不同之处是Tuple里的数据元素可以是不同的数据类型

variable "tuple_test" {

  type = tuple

  description = "tuple test"

  default = ["a", 15, true]

}
$ terraform console
>

> var.tuple_test
[
  "a",
  15,
  true,
]
> var.tuple_test[0]
"a"
> var.tuple_test[1]
15
> var.tuple_test[2]
true
>
  • object,对应Map,但是数值的类型可以不同

variable "db_port" {
  type = object({
    external = number
    internal = number
    protocol = string
  })

  default = {
    external = 5432
    internal = 5433
    protocol = "tcp"
  }

}
$ terraform console
>

> var.db_port
{
  "external" = 5432
  "internal" = 5433
  "protocol" = "tcp"
}
> var.db_port.external
5432
> var.db_port["internal"]
5433
>

Supply variable values#

  • default value

  • -var flag

  • -var-file flag

  • tf var files

    • terraform.tfvars

    • terraform.tfvars.json

    • .auto.tfvars

    • .auto.tfvars.json

  • Environment variable name starts with TF_VAR_

tf-vars

Demo#

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.16"
    }
  }

  required_version = ">= 1.2.0"
}

variable "aws_region" {
  type    = string
  default = "eu-central-1"
}

variable "aws_access_key" {

  type        = string
  description = "aws access key"
  sensitive   = true
}

variable "aws_secret_key" {

  type        = string
  description = "aws secret key"
  sensitive   = true
}

variable "enable_dns_hostnames" {

  type        = bool
  description = "enable dns hostname"
  default     = true
}


provider "aws" {
  access_key = var.aws_access_key
  secret_key = var.aws_secret_key
  region     = var.aws_region
}

resource "aws_vpc" "vpc" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_hostnames = var.enable_dns_hostnames
  tags = {
    Name = "my-vpc-demo"
  }
}

use -var#

terraform plan -var=aws_access_key="xxxxxxxxx" -var=aws_secret_key="xxxxxxxx"

use Environment vars#

for Linux and Mac

export TF_VAR_aws_access_key=xxxxxxxxxxxxxxxx
export TF_VAR_aws_secret_key=xxxxxxxxxxxxxxxx

for windows powershell

$env:TF_VAR_aws_access_key="xxxxxxxxxxxxxxxx"
$env:TF_VAR_aws_secret_key="xxxxxxxxxxxxxxxx"

use tfvars files#

create a file terraform.tfvars

aws_access_key="xxxxxxxxxxxxxxxx"
aws_secret_key="xxxxxxxxxxxxxxxx"