Helm模板渲染ConfigMap多行YAML解析报错如何修复
Helm ConfigMap模板多行配置YAML解析报错修复
问题根因
报错本质是多行变量插入时未做缩进处理:
- ConfigMap模板中使用
|定义块级多行文本时,要求块内所有行都保持统一的缩进层级 - 直接通过
{{ .Values.configmap }}插入变量时,Helm只会原样输出变量值,不会自动给多行内容的非首行添加对应层级的缩进 - 单行配置时只有一行内容,刚好落在正确缩进位置所以渲染正常;多行配置时第二行及后续行没有缩进,直接跑到块结构外部,破坏YAML整体结构,触发解析报错。
问题复现
原错误模板写法
apiVersion: v1 kind: ConfigMap metadata: name: {{ include "test.fullname" . }}-config-map data: brokerConf: | {{ .Values.configmap }}
可正常渲染的单行values配置
configmap: | key=values
触发报错的多行values配置
configmap: | key=values key2=values2
错误渲染结果
apiVersion: v1 kind: ConfigMap metadata: name: test-config-map data: brokerConf: | key=values key2=values2
第二行key2=values2没有缩进,不属于brokerConf的块内容,YAML解析时会把它识别成顶级字段,因找不到冒号分隔键值对直接报错。
完整报错信息
Error: YAML parse error on test/templates/config-map.yaml: error converting YAML to JSON: yaml: line 9: could not find expected ':' helm.go:84: [debug] error converting YAML to JSON: yaml: line 9: could not find expected ':' YAML parse error on v5-proxy/templates/config-map.yaml helm.sh/helm/v3/pkg/releaseutil.(*manifestFile).sort helm.sh/helm/v3/pkg/releaseutil/manifest_sorter.go:146 helm.sh/helm/v3/pkg/releaseutil.SortManifests helm.sh/helm/v3/pkg/releaseutil/manifest_sorter.go:106 helm.sh/helm/v3/pkg/action.(*Configuration).renderResources helm.sh/helm/v3/pkg/action/action.go:165
修复方案
使用Helm内置的缩进函数对插入的多行内容统一处理,两种写法等效,注意缩进值要匹配当前YAML层级(该场景下块内容需要相对于YAML顶层缩进4个空格):
- 写法一:使用
indent函数,模板中变量占位符不要留前置缩进
apiVersion: v1 kind: ConfigMap metadata: name: {{ include "test.fullname" . }}-config-map data: brokerConf: | {{ .Values.configmap | indent 4 }}
- 写法二:使用
nindent函数(自动在内容前添加换行),配合{{-清除模板占位符左侧多余空格
apiVersion: v1 kind: ConfigMap metadata: name: {{ include "test.fullname" . }}-config-map data: brokerConf: | {{- .Values.configmap | nindent 4 }}
修复后正确渲染结果
apiVersion: v1 kind: ConfigMap metadata: name: test-config-map data: brokerConf: | key=values key2=values2
所有配置行都保持正确缩进,YAML结构合法,可正常渲染部署。如果ConfigMap下的字段层级变化,同步调整indent/nindent后面的缩进数值,保证块内容和父字段的缩进差为2个空格即可。
内容的提问来源于stack exchange,提问作者fuyou001
相关产品推荐
相关产品推荐

