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

Terraform合并两份YAML生成Helm values文件的更优实现方案

场景说明

假设存在两份独立的YAML配置文件,内容分别如下:

  • lambo.yaml:
- key: car
  value: "lambo"
  descriptors:
    unit: kmh
    topspeed: 300
  • toyota.yaml:
- key: car
  value: "bugatti"
  descriptors:
    unit: kmh
    topspeed: 400

期望将二者合并为如下结构的result.yaml,作为Helm Chart的values文件使用:

domain: supercardomain
descriptors:
  - key: supercars
    descriptors:
    - key: car
      value: "lambo"
      descriptors:
        unit: kmh
        topspeed: 300
    - key: car
      value: "bugatti"
      descriptors:
        unit: kmh
        topspeed: 400
背景约束

当前通过Terraform的helm_release资源部署应用,需要生成内容与上述result.yaml完全一致的K8s ConfigMap,落地需满足以下约束:

  • Helm原生不支持多values文件的数组合并,为产品已知默认行为
  • 需规避低复用性的硬编码方案,例如在values中拆分.Values.lambo、.Values.toyota结构后在Helm模板中拼接至ConfigMap的方案不符合要求
  • 不允许修改两份原有车辆配置的YAML结构
  • 不改动现有ConfigMap的模板逻辑,社区公开的各类Helm侧数组合并方案均已验证不可行
现有实现

当前采用字符串拼接方案落地:通过Terraform的format、indent函数拼接两个车辆配置的字符串类型变量,生成car_descriptor:

car_descriptor = indent(2, format("car:\ndescriptors:\n%s\n%s", var.lambo_descriptor, var.buggati_descriptor))

其中var.<car>_descriptor为对应车辆YAML配置的字符串形式,随后将该变量传入helm_release的values参数:

resource "helm_release" "my_helm_release" {
  name             = "my_helm_release"
  # 其余资源配置省略

  values = [
    var.car_descriptor
  ]
}

现有ConfigMap模板渲染逻辑如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: car-config
data:
  config.yaml: |
    domain: supercardomain
    descriptors:
    - key: supercars
      descriptors:
{{- if .Values.car.descriptors }}
{{ toYaml .Values.car.descriptors | indent 6 }}
{{- end }}

该方案可正常运行,但需要手动处理字符串格式化与缩进,逻辑繁琐、维护成本高。

诉求

寻找仅依赖Terraform/Helm原生能力、更简洁且符合DRY原则的实现方案,替代当前字符串拼接缩进的实现方式,同时也欢迎针对本问题表述的优化建议。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:57:17