循环使用for或For_each |地形0.12

时间:2019-10-09 11:36:15

标签: terraform terraform-provider-gcp

我需要在一个网络的GCP中创建多个子网。我打算使用Terraform 0.12语法,如下所示:

project_name = [ 
    "order-dev",
    "ship-dev"
]

variable "project_name" {
  type        = list(string)
  description = "Name of the project"
}

resource "google_compute_subnetwork" "subnetwork" {

  name          = "${var.project_name}-subnetwork"
  ip_cidr_range = var.subnet_ip_cidr_range
  region        = var.region
  network       = google_compute_network.network.self_link
}

在这种情况下,是否仍然可以使用 for for_each 表达式,我知道可以使用element并执行此操作。但是,如果可能,想尝试其他方法吗?

2 个答案:

答案 0 :(得分:2)

尝试使用count元参数

在您的样品中,像这样

project_name = [ 
    "order-dev",
    "ship-dev"
]

variable "project_name" {
  type        = list(string)
  description = "Name of the project"
}

resource "google_compute_subnetwork" "subnetwork" {
  count         = length(var.project_name)
  name          = "${var.project_name[count.index]}-subnetwork"
  ip_cidr_range = var.subnet_ip_cidr_range
  region        = var.region
  network       = google_compute_network.network.self_link
}

另一种选择是for_each和键/值对,但是您只能访问一个值,我认为您不能像样本一样使用列表变量。

resource "google_compute_subnetwork" "subnetwork" {
  for_each = {
    order = "order-dev"
    ship = "ship-dev"
  }
  name          = "${key.value}-subnetwork"
  ip_cidr_range = var.subnet_ip_cidr_range
  region        = var.region
  network       = google_compute_network.network.self_link
}

资源:

https://www.terraform.io/docs/configuration/resources.html#count-multiple-resource-instances-by-count https://blog.gruntwork.io/terraform-tips-tricks-loops-if-statements-and-gotchas-f739bbae55f9 https://www.terraform.io/docs/configuration/resources.html#for_each-multiple-resource-instances-defined-by-a-map-or-set-of-strings

答案 1 :(得分:1)

variable "project_name" {
  type = set(string)
}

resource "google_compute_subnetwork" "subnetwork" {
  for_each = var.project_name

  name          = "${each.key}-subnetwork"
  ip_cidr_range = var.subnet_ip_cidr_range
  region        = var.region
  network       = google_compute_network.network.self_link
}