如何使用For循环在Terraform中生成多个自定义Map
问题描述
现有如下Map配置:
"${var.name}-4hr-backup" = { schedule = "@every 4h" template = { includeClusterResources = true includedNamespaces = "${var.included_namespaces}" includedResources = "${var.included_resource}" excludedNamespaces = "${var.excluded_namespaces}" excludedResources = "${var.excluded_resource}" storageLocation = "aws" snapshotVolumes = true ttl = "24h0m0s" } }
希望根据K8s集群的命名空间列表,遍历生成对应数量的Map配置。例如,当命名空间列表为namespace_4hr_backup = [a,b,c]时,生成如下配置:
a-4hr-backup = { schedule = "@every 4h" template = { includeClusterResources = true includedNamespaces = "a" includedResources = "${var.included_resource}" excludedNamespaces = "${var.excluded_namespaces}" excludedResources = "${var.excluded_resource}" storageLocation = "aws" snapshotVolumes = true ttl = "24h0m0s" } } b-4hr-backup = { schedule = "@every 4h" template = { includeClusterResources = true includedNamespaces = "b" includedResources = "${var.included_resource}" excludedNamespaces = "${var.excluded_namespaces}" excludedResources = "${var.excluded_resource}" storageLocation = "aws" snapshotVolumes = true ttl = "24h0m0s" } } c-4hr-backup = { schedule = "@every 4h" template = { includeClusterResources = true includedNamespaces = "c" includedResources = "${var.included_resource}" excludedNamespaces = "${var.excluded_namespaces}" excludedResources = "${var.excluded_resource}" storageLocation = "aws" snapshotVolumes = true ttl = "24h0m0s" } }
查看官方文档后对高级用法理解不深,仅能看懂基础示例,请问实现该需求的最佳方式是什么?
实现方案
从配置语法来看,你使用的是Terraform,这里最简洁高效的实现方式是用**for表达式**遍历命名空间列表,动态生成目标Map。
具体代码实现
假设你已定义好namespace_4hr_backup(命名空间列表)及其他共享变量,代码如下:
# 定义命名空间列表变量(若未定义) variable "namespace_4hr_backup" { type = list(string) default = ["a", "b", "c"] } # 动态生成备份配置Map locals { backup_configs = { for ns in var.namespace_4hr_backup : "${ns}-4hr-backup" => { schedule = "@every 4h" template = { includeClusterResources = true includedNamespaces = ns includedResources = var.included_resource excludedNamespaces = var.excluded_namespaces excludedResources = var.excluded_resource storageLocation = "aws" snapshotVolumes = true ttl = "24h0m0s" } } } }
关键逻辑说明
for ns in var.namespace_4hr_backup:遍历命名空间列表,ns代表当前循环的命名空间"${ns}-4hr-backup" => { ... }:以[命名空间]-4hr-backup作为Map的键,后面的对象为对应的值includedNamespaces = ns:将当前循环的命名空间直接赋值给该字段,替换原全局变量- 其余字段保持与原配置一致,复用已定义的共享变量
使用生成的配置
你可以直接引用local.backup_configs来使用这个动态生成的Map,例如在备份资源中:
resource "your_backup_resource" "main" { config = local.backup_configs }
内容的提问来源于stack exchange,提问作者Samuel Syed
相关产品推荐
相关产品推荐

