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

如何在Terraform的helm_release中用dynamic set块设置Helm数组类型Values

在Terraform的helm_release中使用Helm Chart的apps配置

你可以通过两种方式在Terraform的helm_release资源中复用你的Helm values配置:直接传入结构化变量,或者用dynamic块逐个生成set参数,具体如下:

方式一:直接传入结构化变量(推荐)

这种方式最简洁,直接将匹配Helm values结构的Terraform变量传入helm_release的values参数:

1. 定义Terraform变量

先定义一个和你Helm values中apps结构一致的变量:

variable "helm_apps" {
  type = list(object({
    name   = string
    uri    = string
    labels = map(string)
  }))
  description = "Helm Chart应用列表配置"
  default = [
    {
      name   = "acc1"
      uri    = "https://google.com"
      labels = {
        env  = "acc1"
        name = "test1"
      }
    },
    {
      name   = "acc2"
      uri    = "https://google.com"
      labels = {
        env  = "acc2"
        name = "test2"
      }
    }
  ]
}

2. 在helm_release中使用变量

通过yamlencode将变量转为YAML格式,传入Helm values:

resource "helm_release" "my_app_chart" {
  name       = "my-app"
  repository = "https://your-helm-repo-url"
  chart      = "your-chart-name"
  version    = "1.0.0"

  values = [
    yamlencode({
      apps = var.helm_apps
    })
  ]
}

如果需要结合基础的values文件,也可以这样写:

resource "helm_release" "my_app_chart" {
  name       = "my-app"
  repository = "https://your-helm-repo-url"
  chart      = "your-chart-name"
  version    = "1.0.0"

  values = [
    file("${path.module}/base-values.yaml"), # 加载基础配置
    yamlencode({
      apps = var.helm_apps # 覆盖或补充apps配置
    })
  ]
}

方式二:用dynamic set块逐个配置

如果你的场景需要单独设置每个app的字段(比如需要动态调整部分参数),可以用dynamic "set"块生成对应的set参数:

resource "helm_release" "my_app_chart" {
  name       = "my-app"
  repository = "https://your-helm-repo-url"
  chart      = "your-chart-name"
  version    = "1.0.0"

  # 加载基础values文件
  values = [
    file("${path.module}/base-values.yaml")
  ]

  # 动态设置每个app的name
  dynamic "set" {
    for_each = var.helm_apps
    content {
      name  = "apps[${set.key}].name"
      value = set.value.name
    }
  }

  # 动态设置每个app的uri
  dynamic "set" {
    for_each = var.helm_apps
    content {
      name  = "apps[${set.key}].uri"
      value = set.value.uri
    }
  }

  # 动态设置每个app的labels
  dynamic "set" {
    for_each = flatten([
      for app_idx, app in var.helm_apps : [
        for label_key, label_val in app.labels : {
          app_idx   = app_idx
          label_key = label_key
          label_val = label_val
        }
      ]
    ])
    content {
      name  = "apps[${set.value.app_idx}].labels.${set.value.label_key}"
      value = set.value.label_val
    }
  }
}

注意事项

  • 优先选择方式一,更简洁易维护,只有在需要单独控制每个字段时才用方式二。
  • 使用dynamic "set"时,注意apps[${set.key}]中的索引是列表的下标,确保和Helm values中的顺序对应。
  • 可以根据实际需求调整变量的默认值,或者通过Terraform变量文件传入自定义配置。

内容的提问来源于stack exchange,提问作者Sunil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 02:20:35