最近,我一直在重构大量较旧的 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
装饰所有这些调用。只是想衡量是否有更好的方法来构建模板本身。
您需要相当严格地使用
indent
;没有其他办法了。
Helm 使用的模板引擎对 YAML “一无所知”,因此当您使用
template
或 include
辅助模板时,模板的结果将直接作为字符串插入到输出中,而无需任何重新格式化。在您的示例中,包含 value:
的行以恰好两个空格开头,因此无论 YAML 上下文如何,输出中都会出现恰好两个空格。
我通常使用的模式是:
-
空白控件。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
。