如何遍历Terraform中的嵌套对象列表

如何遍历Terraform中的嵌套对象列表,terraform,terraform-provider-kubernetes,Terraform,Terraform Provider Kubernetes,我正在创建TF模块,它下载指定的yaml文件,然后使用yaml作为k8s configmaps中数据字段的源。我有一个工作解决方案,可以使用一个数据键值对(yaml文件)创建多个configmap,但还需要为每个configmap添加对多个键值对(yaml文件)的支持 main.tf data "http" "config-map" { for_each = var.cloud-configmap url = format("https

我正在创建TF模块,它下载指定的yaml文件,然后使用yaml作为k8s configmaps中数据字段的源。我有一个工作解决方案,可以使用一个数据键值对(yaml文件)创建多个configmap,但还需要为每个configmap添加对多个键值对(yaml文件)的支持

main.tf

data "http" "config-map" {
  for_each = var.cloud-configmap

  url = format("https://%s", each.value.url)

  request_headers = {
    Accept = "text/plain"
  }
}

resource "kubernetes_config_map" "configmap" {
  for_each = var.cloud-configmap

  metadata {
    name = each.value.name
    namespace = each.value.namespace
  }

  data = {
    "${each.value.data-keyname}" = data.http.config-map[each.key].body
  }
}
变量.tf

variable "cloud-configmap" {
  type = map(object({
    url = string
    name = string
    namespace = string
    data-keyname = string
  }))
  default = {
    "cm1" = {
      url = "someurl.com/file1.yaml"
      name = "cm-name"
      namespace = "test"
      data-keyname = "file1.yml"
    },
    "cm2" = {
      url = "someurl.com/file2.yaml"
      name = "cm-name2"
      namespace = "default"
      data-keyname = "file2.yml"
    }
  }
}
这段代码到目前为止仍在运行,但我想将variables.tf文件更改为:

variable "cloud-configmap" {
  type = map(object({
    name = string
    namespace = string
    cm-files = list(object({
      url = string
      data-keyname = string 
    }))
  }))
  default = {
    "cm1" = {
      name = "cm-name"
      namespace = "testnamespace"
      cm-files = [{
        url = "someurl.com/file1.yaml"
        data-keyname = "file1.yml"
      },
      {
        url = "someurl.com/file2.yaml"
        data-keyname = "file2.yml"
      }]
    },
    "cm2" = {
      name = "cm-name2"
      namespace = "default"
      cm-files = [{
        url = "someurl.com/file3.yaml"
        data-keyname = "file3.yml"
      },
      {
        url = "someurl.com/file4.yaml"
        data-keyname = "file4.yml"
      }]
    }
  }
}

在这个更改之后,我不知道如何遍历嵌套的对象列表cm文件来创建数据字段中具有多个键值对的configmap。任何帮助或指点都将不胜感激

在本例中,您将对嵌套for循环进行大量操作。以下是我在给定变量约束的情况下得出的结论

  • 变量.tf
    更新到原始问题中所需的状态。此解决方案将该输入用作需求

  • 将您的
    http
    资源更新到此位置。注意,这将使您的初始
    地形计划失败,因为这些是虚拟URL,地形在构建此资源时尝试发出请求。
    测试URL外观的一个好方法是我在这段代码中也有一个示例
    locals{}
    块。不需要这个本地块,但它说明了如何创建URL

  • 将您的
    kubernetes\u config\u映射更新为:

请注意,在每种情况下都使用for循环,在
http
情况下,每个for都与for嵌套。

谢谢,这非常有帮助,而且都很有效。。刚刚将最后一行调整为:cm-file.data-keyname=>data.http.config-map[cm-file.url].body,以获取configmap中yaml文件的正文。
data "http" "config-map" {
  for_each = toset(flatten([
    for cm in var.cloud-configmap : [
      for cm-file in cm.cm-files :
        cm-file.url
    ]
  ]))

  url = format("https://%s", each.key)

  request_headers = {
    Accept = "text/plain"
  }
}

# EXAMPLE showing how the URLs are created
locals {
  urls = toset(flatten([
    for cm in var.cloud-configmap : [
      for cm-file in cm.cm-files :
        format("https://%s", cm-file.url)
    ]
  ]))
}
output "urls" { value = local.urls }
resource "kubernetes_config_map" "configmap" {
  for_each = var.cloud-configmap

  metadata {
    name = each.value.name
    namespace = each.value.namespace
  }

  data = {
    for cm-file in each.value.cm-files :
      cm-file.url => cm-file.data-keyname
  }
}