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

Helm技术问题:能否在template函数中搭配nindent与toYaml使用?

Helm模板中结合template/include与indent函数的正确用法

首先明确:可以在模板调用时结合indent/nindent函数,但你的写法存在两个关键问题,导致nindent未生效。

问题分析

  1. template函数参数传递错误
    template函数的第二个参数需要传递上下文对象(通常是.),而你传入的是include "my-chart.fullname" .的结果(即fullname字符串),这会导致模板无法正确访问chart的变量,渲染结果不符合预期。

  2. 不必要的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:10:38