Terraform,变量详解

1、定义变量

建立 variables.tf文件,定义变量名为:aws_region。使用default关键字设置默认值:ap-southeast-1。默认值是可选的。若是未设
置默认值,则该变量是必需的。服务器

# variables.tf

variable "aws_region" {
  default = "ap-southeast-1"
}

注意:该文件能够命名为任何名称,由于Terraform加载目录下以*.tf结尾的全部文件。架构

2、使用变量

经过使用占位符 ${}和var关键字引用定义的变量名。app

provider "aws" {
  region     = "${var.aws_region}"
}

3、分配变量

分配变量有多种方法。以变量的优先级考虑,从高到底的顺序主要的方法以下:
Terraform,变量详解ide

3.一、命令行

能够直接在命令行中使用 -var 标志设置变量 。在该Terraform检查配置的任何命令接受该标志,如apply 和 plan。命令行

terraform apply \
  -var 'aws_region=ap-southeast-1'

注意:以这种方式设置变量不会保存它们,而且在执行命令时必须重复输入它们。版本控制

3.二、文件变量

若是想保留变量或者变量是一个固定的值,能够考虑建立后缀为 *.tfvars的文件。文件内容以下:code

# terraform.tfvars

aws_region = "ap-southeast-1"

对于当前目录中匹配 terraform.tfvars 或 *.auto.tfvars 存在的全部文件,Terraform会自动加载它们以填充变量。若是文件名为其余名称,则能够-var-file直接使用该标志指定文件。这些文件与Terraform配置文件的语法相同。与Terraform配置文件同样,这些文件也能够是JSON。orm

terraform apply -var-file="xxx.tfvars"

注意:不建议将用户名和密码保存到版本控制中,可是能够建立一个本地秘钥变量文件用-var-file加载。blog

-var-file 可使用屡次,指定不一样的变量文件。例如:ci

terraform apply \
  -var-file="secret.tfvars" \
  -var-file="production.tfvars"

3.三、环境变量

Terraform将读取前缀为TFVAR*的环境变量。例如,TF_VAR_aws_region 能够将变量设置为设置aws_region变量。

注意:环境变量只能填充字符串类型的变量。列表和映射类型变量必须经过其余机制之一进行填充。

3.四、默认值

若是没有使用以上任何方法传入变量值,则会采用默认值。

最后须要注意如下几点:

  • 模块内命名惟一
  • 变量间能够引用
  • 不能循环引用

4、高级类型

4.一、列表(Lists)

# 隐式的定义
variable "cidrs" { default = [] }

# 显示的定义
variable "cidrs" { type = list }

terraform.tfvars 文件内容:

cidrs = [ "10.0.0.0/16", "10.1.0.0/16" ]

4.二、字典(Map)

为了合理分配资源,针对不一样的运行环境,咱们想建立不一样类型的服务器实例。例如:dev环境咱们只须要用t2.micro,prod环境咱们能够配置高一点,使用t2.large。

variable "instance_types" {
  type = "map"
  default = {
    "dev"   = "t2.micro"
    "prod"  = "t2.large"
  }
}

variable "env" {
  default = "dev"
}

resource "aws_instance" "example" {
  instance_type = "${var.instance_types[var.env]}" 
}

在命令行中传值:

terraform apply -var 'instance_types={ dev = "t2.micro", prod = "t2.large" }'

在terraform.tfvars 文件定义值:

instance_types = {
  "dev"  = "t2.micro"
  "prod" = "t2.large"
}

完整示例:

provider "aws" {
  region = "ap-southeast-1"
}

variable "instance_types" {
  type = "map"
  default = {
    "dev"   = "t2.micro"
    "prod"   = "t2.large"
  }
}

variable "env" {
  default = "dev"
}

resource "aws_instance" "example-instance" {
  ami           = "ami-061eb2b23f9f8839c"
  instance_type = "${var.instance_types[var.env]}" 

  tags = {
      Name = "Example by ChangSha Union"
  }
}

output "instance_type" {
  value = "${aws_instance.example-instance.instance_type}"
}

若是您喜欢这篇文章,请考虑关注我。

长沙DevOps联盟 - 关注容器技术,K8S,自动化部署,基础设施架构。
Terraform,变量详解

相关文章
相关标签/搜索