如何通过Terraform+Terragrunt为Jaeger Helm Chart配置spark.extraEnv参数
问题描述
需要通过Terraform搭配Terragrunt为Jaeger的Helm Chart的values.yaml添加额外环境变量,原values.yaml对应配置如下:
spark: extraEnv: []
期望最终生成的配置如下:
spark: extraEnv: - name: JAVA_OPTS value: "-Xms4g -Xmx4g"
错误配置与报错
原Terraform动态块写法
dynamic "set" { for_each = var.extraEnv content { name = "spark.extraEnv [${set.key}]" value = set.value } }
变量定义
variable "extraEnv" { type = map }
Terragrunt传值
extraEnv = { "JAVA_OPTS" = "-Xms4g -Xmx4g" }
报错信息
Error: failed parsing key "spark.extraEnv [JAVA_OPTS]" with value -Xms4g -Xmx4g, error parsing index: strconv.Atoi: parsing "JAVA_OPTS": invalid syntax on main.tf line 16, in resource "helm_release" "jaeger": 16: resource "helm_release" "jaeger" {
问题原因
spark.extraEnv是列表类型,Helm的set参数要求列表路径的方括号内必须传入数字索引,原写法直接传入字符串类型的环境变量名,导致字符串转整数失败触发报错。
解决方案
方案1:使用dynamic set块实现
1. 修改变量定义为对象列表
variable "spark_extraEnv" { type = list(object({ name = string value = string })) default = [] }
2. 调整dynamic块逻辑,按索引拼接配置路径
# 注入环境变量名 dynamic "set" { for_each = var.spark_extraEnv content { name = "spark.extraEnv[${set.index}].name" value = set.value.name } } # 注入环境变量值 dynamic "set" { for_each = var.spark_extraEnv content { name = "spark.extraEnv[${set.index}].value" value = set.value.value } }
3. Terragrunt传值
spark_extraEnv = [ { name = "JAVA_OPTS" value = "-Xms4g -Xmx4g" } ]
方案2:使用yamlencode合并values(更简洁,已验证可用)
不需要编写dynamic块,直接通过yamlencode生成额外配置和原有values合并即可:
调整helm_release资源的values参数
values = [ file("${path.module}/values.yaml"), yamlencode({ spark = { extraEnv = var.spark_extraEnv } }) ]
变量定义和Terragrunt传值和方案1完全一致,该方式代码更简洁,不容易出现路径拼接错误,更推荐使用。
内容的提问来源于stack exchange,提问作者RMNTRVN
相关产品推荐
相关产品推荐

