如何在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
相关产品推荐
相关产品推荐

