繁体   English   中英

Terraform:使用 for_each 和条件进行地图迭代的本地列表

[英]Terraform: Local list of maps iteration with for_each and conditionals

我想在一个变量中定义一个映射列表,这样我就可以在多个资源上使用for_each ,并根据键值进行条件判断。

例如,我有这个locals.tf文件,我在其中定义了地图列表

locals {
  networking = [
    {
      name = "first"
      domain = "first.${local.dns_name}"
      port = 8080
      group = "eighties"

    },
    {
      name = "second"
      domain = "second.${local.dns_name}"
      port = 8081
      group = "eighties"
    },
    {
      name = "third"
      domain = "third.${local.dns_name}"
      port = 9090
      group = "nineties"
    },
    {
      name = "fourth"
      port = 9091
      group = "nineties"
    }
  ]
}

在我的其他文件中,我可以使用for_eachfor参数循环遍历地图列表:

resource "google_dns_record_set" "dns_records" {
  for_each     = { 
    for k in local.networking: k.domain => k
    if k.domain != null
  }
  name         = each.value.domain
  type         = "A"
  ttl          = 300
  managed_zone = var.managed_zone
  project      = var.dns_project
  rrdatas      = [google_compute_global_address.default-forwarding-address.address]
}

鉴于此设置,我可能会讨论两种不同的情况:

  1. 由于第四张地图的域密钥不存在,Terraform 就停止了。

如果第四张地图中不存在,是否可以跳过资源创建? 或者干脆跳过错误。

Error: Unsupported attribute on dns-record.tf line 4, in resource "google_dns_record_set" "dns_records": 4: if k.domain.= null This object does not have an attribute named "domain".

  1. 如果我将 k.group 的k.domain值和条件更改为类似k.group k.group == "eighties"这样我可以针对特定组,我会收到此重复错误。

Two different items produced the key "eighties" in this 'for' expression. If duplicates are expected, use the ellipsis (...) after the value expression to enable grouping by key.

这个错误是否可以通过当前设置进行管理,或者我应该放弃地图列表的想法?

您可以检查domain是否存在,如下所示:

{ 
    for k in local.networking: k.domain => k
    if contains(keys(k), "domain")
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM