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

