Helm模板如何实现Values取值路径中appName字段的动态替换
实现方案
你遇到的问题本质上是两个常见的Go模板(Helm底层使用的模板引擎)使用误区,按以下步骤修改即可实现需求:
错误点说明
- Go模板不支持嵌套的
{{ }}语法,所以{{.Values.{{ $arg1 }}.properties.x }}的写法本身不符合语法规范,动态取map的指定key必须使用内置的index函数 include函数仅支持传入2个参数:模板名称、单个上下文对象,你原有调用时传入3个参数的写法是无效的,额外的参数会被模板引擎忽略
最优实现方式
1. 修改模板调用逻辑
将根上下文和动态应用名通过dict打包为单个对象传入模板,示例:
{{- include "pod-test" (dict "Root" . "AppName" "app-name") | indent 2 }}
2. 修改pod-test模板定义
使用index函数动态取值,完整示例:
{{- define "pod-test" -}} {{- $root := .Root -}} {{- $appName := .AppName -}} {{- /* 动态获取对应应用的配置,支持多层级key直接传入index参数 */ -}} {{- $appProps := index $root.Values $appName "properties" -}} {{- if eq $appProps.name "m1" }} x: {{ $appProps.x }} {{- end }} {{- end -}}
可选兼容优化
如果存在应用名对应的配置不存在的场景,可以增加合法性判断避免渲染报错:
{{- define "pod-test" -}} {{- $root := .Root -}} {{- $appName := .AppName -}} {{- if hasKey $root.Values $appName -}} {{- $appProps := index $root.Values $appName "properties" -}} {{- if eq $appProps.name "m1" }} x: {{ $appProps.x }} {{- end }} {{- end -}} {{- end -}}
内容的提问来源于stack exchange,提问作者user6389
相关产品推荐
相关产品推荐

