【问题标题】:Looping using for or For_each | Terraform 0.12使用 for 或 For_each 循环 |地形 0.12
【发布时间】:2020-02-06 17:42:32
【问题描述】:

我需要在一个网络中的 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
}

在这种情况下无论如何要使用 forfor_each 表达式,我知道使用元素并这样做。但如果可能的话,想尝试不同的方法吗?

【问题讨论】:

    标签: terraform terraform-provider-gcp


    【解决方案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
    }
    

    【讨论】:

    • 我有一个后续问题,如果我想在循环中包含 `subnet_ip_cidr_range' 怎么办
    • @Sunil Stack Overflow 不支持同一个问题中的后续问题,所以我建议为此提出一个新问题,以便您可以充分解释问题并允许人们给出完整的答案,而不是被这里的评论系统限制。
    【解决方案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

    【讨论】:

    • 这是很棒的信息@Dude001,我使用如下:resource "google_compute_subnetwork" "subnetwork2" { for_each = toset(var.project_name_1) name = "${each.value}-subnetwork" ip_cidr_range = var.subnet_ip_cidr_range region = var.region network = google_compute_network.network.self_link }
    猜你喜欢
    • 2019-09-26
    • 2011-06-12
    • 2022-01-19
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 2011-12-20
    • 2020-01-06
    • 1970-01-01
    相关资源
    最近更新 更多