在 Helm 命名模板中保留缩进/空格

问题描述 投票:0回答:1

最近,我一直在重构大量较旧的 Helm 图表,并开始使用 命名模板 作为鼓励重用和减少常见复制粘贴的努力的一部分。

不断出现的一个挑战是保持缩进水平作为其中的一部分。考虑以下非常简单的命名模板:

{{- define "example.volumemounts.gcs" -}}
  {{- if not .Values.local -}}
- name: /example/gcs-creds
  value: gcs-key
  {{- end -}}
{{- end -}}

这里的想法是,如果给定值不是本地的,那么我们需要渲染一个在给定容器的

volumeMounts
下可用的部分,如下所示:

spec:
  ...
  podTemplate:
    ...
    spec:
      containers:
        - name: my-container
          ...
          volumeMounts:
            {{ template "example.volumemounts.gcs" .  }}
            - name: some-other-volume-mount
              value: test

我发现模板本身将正确遵循模板输出第一行的缩进级别,但第二行不会如下所示:

spec:
  ...
  podTemplate:
    ...
    spec:
      containers:
        - name: my-container
          ...
          volumeMounts:
            - name: /example/gcs-creds
  value: gcs-key
            - name: some-other-volume-mount
              value: test

处理此问题的首选方法是什么?我想尽可能减少空白/空行,但也要确保调用模板的基线缩进级别会影响渲染(即缩进更改将反映在输出中)。

我试图避免分别用

nindent
indent
装饰所有这些调用。只是想衡量是否有更好的方法来构建模板本身。

kubernetes-helm go-templates
1个回答
0
投票

您需要相当严格地使用

indent
;没有其他办法了。

Helm 使用的模板引擎对 YAML “一无所知”,因此当您使用

template
include
辅助模板时,模板的结果将直接作为字符串插入到输出中,而无需任何重新格式化。在您的示例中,包含
value:
的行以恰好两个空格开头,因此无论 YAML 上下文如何,输出中都会出现恰好两个空格。

我通常使用的模式是:

  1. 帮助程序模板内容是正确的 YAML,但从第一列开始。
  2. 包含模板的行是无缩进的,无论上下文如何,并且两侧都没有
    -
    空白控件。
  3. 包含模板时,请将 Helm 特定的
    include
    与正确的
    indent
    结合使用。

在你的例子中,

          volumeMounts:
{{ include "example.volumemounts.gcs" . | indent 12 }}
            - name: some-other-volume-mount
              value: test

如果要缩进该行,则需要修改这些规则以(2)在该行的开头包含一个

-
空白控件(这将删除空白和前面的换行符),然后(3)更改到
nindent
(这将重新插入该空格)。此调用之前可以有任意数量的空格,因此您甚至可以将调用放在同一行上。

metadata:
  labels: {{- include "example.labels" . | nindent 4 }}
spec:
  podTemplate:
    spec:
      containers:
        - volumeMounts:
            {{- include "example.volumemounts.gcs" . | nindent 12 }}

原则上,您可以使用

... | indent $n | trim
缩进辅助模板内容,然后删除第一行的前导空格。但是没有办法从上下文中推断出缩进量,你总是必须知道你需要什么值
indent

© www.soinside.com 2019 - 2024. All rights reserved.