You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 15:15:34