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。