Helm技术问题:能否在template函数中搭配nindent与toYaml使用?
Helm模板中结合template/include与indent函数的正确用法
首先明确:可以在模板调用时结合indent/nindent函数,但你的写法存在两个关键问题,导致nindent未生效。
问题分析
template函数参数传递错误
template函数的第二个参数需要传递上下文对象(通常是.),而你传入的是include "my-chart.fullname" .的结果(即fullname字符串),这会导致模板无法正确访问chart的变量,渲染结果不符合预期。不必要的
toYaml调用
如果你的my-chart.nodeaffinity模板已经直接输出YAML格式的配置片段,再用toYaml会把这个YAML字符串转成YAML的字符串字面量(比如带引号或多行标记),此时nindent只会给整个字符串块加缩进,而非给YAML的每一行内容加缩进,看起来就像nindent没生效。
正确示例
场景1:模板直接输出YAML片段(最常用)
假设你的nodeaffinity模板定义如下(内部已处理YAML结构,并使用fullname):
{{- define "my-chart.nodeaffinity" -}} nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: app operator: In values: - {{ include "my-chart.fullname" . }} {{- end -}}
在部署文件中调用时,用include获取模板内容,直接加nindent即可:
spec: {{ include "my-chart.nodeaffinity" . | nindent 4 }}
这样渲染后,模板的YAML内容会自动缩进4格,嵌入到spec下。
场景2:模板返回Go数据结构(少见)
如果模板返回的是Go字典/结构体而非YAML字符串,才需要用toYaml转换:
{{- define "my-chart.nodeaffinity" -}} {{- dict "fullname" (include "my-chart.fullname" .) -}} {{- end -}}
调用时:
spec: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: app operator: In values: {{ include "my-chart.nodeaffinity" . | toYaml | nindent 12 }}
核心总结
- 优先用
include代替template,因为include返回字符串,支持管道链式处理(比如接nindent)。 - 仅当模板返回Go数据结构时才用
toYaml,直接输出YAML片段的模板不需要这个步骤。 - 模板调用时务必传递正确的上下文(
.),确保模板内部能访问chart的变量和其他模板。
内容的提问来源于stack exchange,提问作者Nicolas Chinaglia
相关产品推荐
相关产品推荐

