如何遍历Terraform中的嵌套对象列表
我正在创建TF模块,它下载指定的yaml文件,然后使用yaml作为k8s configmaps中数据字段的源。我有一个工作解决方案,可以使用一个数据键值对(yaml文件)创建多个configmap,但还需要为每个configmap添加对多个键值对(yaml文件)的支持 main.tf如何遍历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
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外观的一个好方法是我在这段代码中也有一个示例
块。不需要这个本地块,但它说明了如何创建URLlocals{}
- 将您的
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
}
}