我正在创建TF模块,它下载指定的yaml文件,然后使用yaml作为k8s配置映射中数据字段的源。我有一个工作解决方案,可以用一个数据键值对(yaml文件(创建多个配置映射,但也需要为每个配置映射添加对多个键值对(yaml文件(的支持。
主.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循环做很多工作。以下是我在给定变量约束的情况下得出的结论。
-
将
variables.tf
更新为原始问题中所需的状态。该解决方案使用该输入作为要求 -
将您的
http
资源更新为此。请注意,这将使您的初始terraform plan
失败,因为这些是伪URL,Terraform在构建此资源时会尝试发出请求。测试url外观的一个好方法是我在这个片段中也有一个示例locals {}
块。这个locals块是不需要的,但说明了URL是如何创建的。
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 }
- 将
kubernetes_config_map
资源更新为:
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
}
}
请注意,在每种情况下都使用了for循环,在http
的情况下,它是与for嵌套的for_each。