Что нас ждет в Terraform 0.12

Пока все ждут нового терраформа, давайте разберемся чего его все так ждут.
Первое что нас ждут это нормальные переменные. Теперь место того чтобы везде писать "${data.aws_ami.ubuntu_14_04.image_id}" можно будет просто написать

resource "aws_instance" "foo" {
  ami = data.aws_ami.ubuntu_14_04.image_id
  instance_type = "t2.micro"
}  

Никаких кавычек и скобок. Наконец-то.

Второе - splat оператор раньше работал только для ресурсов у которых был count. Сейчас будет работать и для обычных массивов. Чтобы было проще ввели новый синтаксис, который логично обьясняет что вообще тут происходит
Было


output "instance_names" {
	value = google_compute_instance.main.*.name
}

Стало:


output "instance_names" {
	value = google_compute_instance.main[*].name
}

То есть сразу понятно что из списка main мы вычитываем и подставляем атрибуты name.

И мы понемногу приближаемся в for операторам.

output "instance_names" {
	value = [
	for instance in google_compute_instance.main:
	instance.name
	]
}

Вроде и туфтень, но позволяет делать такие вот штуки:

output "ips_with_list_in_brackets" {
  value = [
    for instance in aws_instance.ubuntu:
    (instance.public_ip != "" ? [instance.private_ip, instance.public_ip] : [instance.private_ip])
  ]
}

Пошли интерироваться дальше - следующее новшество это динамические блоки:

resource "aws_security_group" "vault" {
  name        = "vault"
  description = "Ingress for Vault"
  vpc_id      = aws_vpc.my_vpc.id

  dynamic "ingress" {
    iterator = port
    for_each = var.ingress_ports
    content {
      from_port   = port.value
      to_port     = port.value
      protocol    = "tcp"
      cidr_blocks = ["0.0.0.0/0"]
    }
  }
}

Вместо того чтобы делать несколько правил мы просто берем массив var.ingress_ports и итерируемся по ним. Наконец-то однотипные ресурсы станут немного меньше.

Дальше - возможность нормально перекидывать переменные между модулями.
Раньше вам надо было делать тысячу строк и продумывать что именно вы хотите передать наружу или внутрь. Сейчас достаточно просто передать объект.
Пример:

output "vpc" {
  value = aws_vpc.my_vpc
}

На выходе мы получим хорошинький объектик типа хэш

vpc = {
  "arn" = "arn:aws:ec2:us-west-2:753646501470:vpc/vpc-0a1d5a09545df5d29"
  "assign_generated_ipv6_cidr_block" = false
  "cidr_block" = "172.16.0.0/16"
  "default_network_acl_id" = "acl-0d43c530585af11f6"
  "default_route_table_id" = "rtb-07cbd1dc962def19f"
  "default_security_group_id" = "sg-095119122ea1bf847"
  "dhcp_options_id" = "dopt-11683568"
  "enable_classiclink" = false
  "enable_classiclink_dns_support" = false
  "enable_dns_hostnames" = false
  "enable_dns_support" = true
  "id" = "vpc-0a1d5a09545df5d29"
  "instance_tenancy" = "default"
  "ipv6_association_id" = ""
  "ipv6_cidr_block" = ""
  "main_route_table_id" = "rtb-07cbd1dc962def19f"
  "owner_id" = "753646501470"
  "tags" = {
    "Name" = "tf-0.12-rvt-example-vpc"
  }
}

И сможем передать его, например, в другой модуль. Ура. Свершилось. Джва года ждал эту игру.

В общем, изменения хорошие и позволят нам избавиться от гигантского количества костылей и затычек. Ждём стабильную версию и обновляемся :)