使用for_each时如何跳过或避免json中的重复键

im9ewurl  于 2022-12-24  发布在  其他
关注(0)|答案(3)|浏览(114)

我正在尝试从一个有重复键的JSON文件生成Terraform资源。有什么方法可以避免重复吗?
下面是JSON示例

{
  "my-ptr-zone": {
    "21-10": {
      "zone"  : "21.10.in-addr.arpa"
    },

    "21-10": {
      "zone"  : "21.10.in-addr.arpa"
    }
  }
}

两把钥匙在这里是一样的。
这是资源

resource "aws_route53_zone" "my-ptr-zone" {
  for_each = var.my-ptr-zone
  name     = each.value.zone
}

有没有办法在循环时跳过重复项?
我已经尝试避免在JSON文件中从源代码生成重复值,但这是另一个挑战。

ftf50wuq

ftf50wuq1#

如果您想在Map中为每个唯一键只生成一个资源,请让Terraform生成一个键的 * 集合 *,然后循环这些键。
请考虑使用hashicorp/random提供程序的以下示例。

locals {
  my-ptr-zone = {
    "21-10" = {
      zone = "21.10.in-addr.arpa"
    }
    "21-10" = {
      zone = "21.10.in-addr.arpa"
    }
  }
}

resource "random_id" "example" {
  for_each = toset(keys(local.my-ptr-zone))
  byte_length = 8
}

使用terraform plan进行规划,您将看到terraform只想生成一个资源。

# random_id.example["21-10"] will be created
+ resource "random_id" "example" {
  + b64_std     = (known after apply)
  + b64_url     = (known after apply)
  + byte_length = 8
  + dec         = (known after apply)
  + hex         = (known after apply)
  + id          = (known after apply)
}

Plan: 1 to add, 0 to change, 0 to destroy.

将其中一个键更改为不同的值,terraform将希望创建两个资源。

# random_id.example["21-10"] will be created
...

# random_id.example["21-11"] will be created
...

Plan: 2 to add, 0 to change, 0 to destroy.

如果你对其他的唯一性感兴趣(例如,只有zone的唯一值),同样的方法可以被应用......生成一个你想要唯一的东西的 * 集合 *,然后在这个集合上迭代。

oewdyzsn

oewdyzsn2#

一个简单的方法是在map上运行merge两次。
JSON文件:

{
  "my-ptr-zone": {
    "21-10": {
      "zone"  : "21.10.in-addr.arpa"
    },

    "21-10": {
      "zone"  : "21.10.in-addr.arpa"
    }
  }
}

TF代码:

locals {
  data  = jsondecode(file("data.json"))
  zones = merge(local.data.my-ptr-zone, local.data.my-ptr-zone)
}

output "zones" {
  value = local.zones
}

# This will now be a unique resource
resource "aws_route53_zone" "my-ptr-zone" {
  for_each = local.zones
  name     = each.value.zone
}

输出:

Outputs:

zones = {
  "21-10" = {
    "zone" = "21.10.in-addr.arpa"
  }
}
vltsax25

vltsax253#

Terraform的jsondecode函数对单个对象中重复的属性名的React是丢弃除特定名称的最后一个定义之外的所有定义。
在您的问题中显示的示例中,所示JSON文档的jsondecode将生成以下Terraform值:

{
  "my-ptr-zone" = {
    "21-10" = {
      "zone" = "21.10.in-addr.arpa"
    }
  }
}

相关问题