Terraform 0.12 复习

Terraform的0.12版本已正式发布。

2019年5月23日,正式宣布发布Terraform 0.12版本。

最近开始学习使用 Terraform,我在 0.12-rc1 版本上进行了实现,但由于网络上存在许多 0.11 的资料,
我想重新确认一下 0.11 版本和 0.12 版本之间的差异。

0.12升级

Terraform 0.12增加了0.12升级子命令,可以进行从0.11.14版本的语法替换。如果出现警告消息,则需要手动进行修正。

主要更改項目

一流的表达方式

双引号和展开式变得不再需要了。
– 0.11 ami = “#{var.name}”
– 0.12 ami = var.name

双引号和展开式不再必要。
– 0.11 ami = “#{var.name}”
– 0.12 ami = var.name

不再需要使用双引号和展开式。
– 0.11 ami = “#{var.name}”
– 0.12 ami = var.name

不用再使用双引号和展开式了。
– 0.11 ami = “#{var.name}”
– 0.12 ami = var.name

双引号和展开式不再是必要的。
– 0.11 ami = “#{var.name}”
– 0.12 ami = var.name

对于和对每一个

for循环已经可用。

cidr_blocks = [
  for num in var.subnet_numbers:
  cidrsubnet(data.aws_vpc.example.cidr_block, 8, num)
]

广义的散列操作符

以前,只有多个存在的资源才能使用,但现在它可以用于任何列表。

output "instance_ip_addrs" {
  value = google_compute_instance.example.network_interface.*.address
}

条件运算符的改进和有条件的省略参数

条件运算符不再仅限于原始类型的使用,而可以在表达式中使用。

locals {
  first_id = length(azurerm_virtual_machine.example) > 0 ? azurerm_virtual_machine.example[0].id : ""

  buckets = (var.env == "dev" ? [var.build_bucket, var.qa_bucket] : [var.prod_bucket])
}

富有价值的类型

在0.11之前,只能在列表和映射中使用简单的值,如字符串和数字。但现在可以将列表的元素设置为列表等其他格式。

module "subnets" {
  source = "./subnets"

  parent_vpc_id = "vpc-abcd1234"
  networks = {
    production_a = {
      network_number    = 1
      availability_zone = "us-east-1a"
    }
    production_b = {
      network_number    = 2
      availability_zone = "us-east-1b"
    }
    staging_a = {
      network_number    = 1
      availability_zone = "us-east-1a"
    }
  }
}

可靠的 JSON 语法

    • HCLの全ての機能がJSONでサポートされたので、HCLとJSONが完全に1:1になった

 

    • エラーメッセージが改善された

 

    JSONでコメントできる用になった
{
  "variable": {
    "example": {
      "//": "This property is ignored",
      "default": "foo"
    }
  }
}

引用作为一等值。

在Terraform控制台中可以获取本地变量。

locals {
  region = "ap-northeast-1"
}
$ terraform console 
> local.region
ap-northeast-1 (0.11: unknown values referenced, can't compute value)

输出部分的描述发生了变化。

需要指定outputs。

output "ecs_instance_profile_name" {
  value = aws_iam_instance_profile.ecs_instance_profile.name
}
data "terraform_remote_state" "iam_ecs_instance" {
  backend = "s3"
  config = {
    bucket = "terraform-tfstate"
    key    = "iam_ecs_instance.tfstate"
    region = "ap-northeast-1"
  }
}

0.11 can be paraphrased in Chinese as “零点一一”.

resource "aws_ecs_task_definition" "task" {
  family                = "${var.name}"
  container_definitions = ...
  task_role_arn = "#{data.terraform_remote_state.iam_ecs_instance.ecs_task_role_arn}"
  network_mode  = "bridge"
}

0.12 can be paraphrased as:
零点一二 yī èr)

resource "aws_ecs_task_definition" "task" {
  family                = var.name
  container_definitions = ...
  task_role_arn = data.terraform_remote_state.iam_ecs_instance.outputs.ecs_task_role_arn
  network_mode  = "bridge"
}

最后 / 最终

由于我实际上从未使用过0.11版本进行操作,并且我在Terraform的使用经验也较短,所以可能存在一些不足之处。但我希望今后能够继续努力学习和使用Terraform。

广告
将在 10 秒后关闭
bannerAds