Terraform教程03 - variables


Variables的作用

  • 隐藏一些密码之类的敏感信息
  • 用于可能会变更的信息,比如,前面创建EC2的时候,AMI的ID就会根据region不同而发生变化
  • 使得代码可被重用

使用变量的三个步骤

  • 通过不同方式定义变量值:在terraform.tfvars文件中/环境变量/命令行/交互方式
  • 在真正的.tf文件中声明对应的变量(可以声明默认值)
  • 在后续通过变量名获取其值

通过交互/命令行方式获取变量值

注意:以下这两种方式在实际项目中不会使用

交互方式

variable "cidr_block" {
  description = "cidr block for the subnet"
}

resource "aws_subnet" "subnet1" {
  vpc_id = xxxx
  cidr_block = var.cidr_block
}

这样在运行terraform apply的时候,terraform就会弹出一个窗口,要求输入变量值。

命令行方式

如果不想使用交互方式,也可以在命令行直接提供参数:

terraform apply -var "cidr_block=10.0.1.0/24"

或者:

export TF_VAR_cidr_block="10.0.1.0/24"
terraform apply

指定默认值

variable "cidr_block" {
  description = "cidr block for the subnet"
  default = "10.0.22.0/24"
}

有了默认值之后,这个变量就变为可选了。如果不提供该变量值,Terraform就会从默认值中获取。

声明类型

variable "cidr_block" {
  description = "cidr block for the subnet"
  type = string
}

Terraform中的变量类型包括:

  • string
  • boolean
  • number
  • list
  • map

通过环境变量设置

Provider认可的默认环境变量

针对不同的provider,它们会自动读取一些环境变量,

比如AWS支持如下的默认环境变量:

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • AWS_REGION

Jenkins支持如下的默认环境变量:

  • JENKINS_URL
  • JENKINS_USERNAME
  • JENKINS_PASSWORD
  • JENKINS_CA_CERT

自定义环境变量

对于自定义的环境变量,可以这样为其赋值:

export TF_VAR_filename="/tmp/demo.txt"

注意,上面的环境变量必须以 TF_VAR_ 作为前缀。

通过配置文件使用Variables

terraform.tfvars

这个文件非常特殊,文件名是固定的,terraform会自动从中读取相关信息。 除了这个文件之外,还有这些文件也会被terraform自动读取:

  • terraform.tfvars.json
  • *.auto.tfvars
  • *.auto.tfvars.json

首先确认在 .gitignore 中添加 terraform.tfvars。

然后更新terraform.tfvars的内容:

AWS_ACCESS_KEY = "XXXXXXXXXXXX"
AWS_SECRET_KEY = "XXXXXXXXXXXX"
AWS_region = "eu-west-1"

之后就可以直接使用这些变量了:

variable "AWS_ACCESS_KEY" {
  description = "AWS_ACCESS_KEY"
  type = string
}
variable "AWS_SECRET_KEY" {
  description = "AWS_SECRET_KEY"
  type = string
}
variable "AWS_REGION" {
  description = "AWS_REGION"
  type = string
}

provider "aws" {
  access_key = "${var.AWS_ACCESS_KEY}"
  secret_key = "${var.AWS_SECRET_KEY}"
  region = "${var.AWS_REGION}"
}

使用不同类型的变量

在terraform.tfvars:

subnet_prefix = [{cidr_block = "10.0.1.0/24", name = "prod_subnet"}, {cidr_block = "10.0.2.0/24", name = "dev_subnet"}]

在后续使用中,可以:

var.subnet_prefix[0].cidr_block
var.subnet_prefix[0].name

在其他文件中定义变量

当然,也可以在其他文件中定义变量,比如在demo.tfvars中:

AWS_ACCESS_KEY = "XXXXXXXXXXXX"
AWS_SECRET_KEY = "XXXXXXXXXXXX"
AWS_region = "eu-west-1"

在运行apply命令时需要指明读取变量的文件名:

terraform apply -var-file demo.tfvars

locals

在Terraform中,还可以定义一个“局部变量/locals”,这种变量只能在当前模块中使用。而variable则是“全局”性的。

locals {
  resource_group = "lcoding-grp"
  location = "UK South"
}

文章作者: 逻思
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 逻思 !
  目录