如何通过Terraform的helm_release Provider将列表类型值传递给Helm Chart?
如何通过Terraform的helm_release Provider将列表类型值传递给Helm Chart?
我完全懂你现在卡在哪了——想把从JSON文件读出来的列表通过Terraform的helm_release传给Helm Chart,但直接用set块就报类型错误,因为set默认只认字符串,可你要传的是元组/列表对吧?下面给你两种贴合你场景的解决办法:
方法一:用set_list块传递列表(推荐)
Terraform的helm_release provider专门做了set_list块来处理数组/列表类型的参数,刚好匹配你的需求。你只需要把原来的set块换成set_list,指定参数名和对应的列表值就行:
resource "helm_release" "oauth2proxy" { name = "oauth2proxy" chart = "../charts/oauth2proxy" namespace = kubernetes_namespace.oauth2proxy.metadata.0.name # 替换成set_list来传递列表 set_list { name = "app_groups" value = local.app_groups } values = [ templatefile("../charts/oauth2proxy/oauth2proxy_values.yaml", { projectID = var.project clusterName = var.clusterName }) ] }
这样Terraform会自动把local.app_groups这个列表传递给Helm Chart的app_groups参数,不需要额外转类型,完全能满足你的需求。
方法二:直接在templatefile里传入列表(更简洁)
既然你已经在用templatefile生成values.yaml,其实可以直接把app_groups作为模板变量传进去,连set_list都省了,代码会更清爽:
首先修改templatefile的调用,把列表加入变量:
resource "helm_release" "oauth2proxy" { name = "oauth2proxy" chart = "../charts/oauth2proxy" namespace = kubernetes_namespace.oauth2proxy.metadata.0.name values = [ templatefile("../charts/oauth2proxy/oauth2proxy_values.yaml", { projectID = var.project clusterName = var.clusterName app_groups = local.app_groups # 把列表传给模板 }) ] }
然后在你的oauth2proxy_values.yaml模板里,直接用这个列表变量(要确保Chart的values里定义了app_groups是列表类型):
# oauth2proxy_values.yaml app_groups: ${jsonencode(app_groups)} # 其他配置项...
这样Helm就能直接拿到列表,你Deployment模板里的range循环也能正常跑起来了。
为什么原来的方法会报错?
你之前试的set { name = "app_groups[0]" }然后把整个列表赋值给它,其实是用法错了:
set块的value要求是字符串类型,但你传的是元组,所以直接触发类型不匹配的错误;- 就算你把列表转成字符串,
app_groups[0]也只会设置列表的第一个元素,根本不是你要的整个列表效果。
备注:内容来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

