我想在 helm 中保存一些样板模板代码。 在我的values.yaml中,我必须定义同一个对象的字段:
schema
、schemas
,一次为单数,一次为列表。
在我的模板中,我不想关心这个。这就是为什么我将此字段合并为一个列表:
{{- $schemas := list -}}
{{- if .Values.schema -}}
{{- $schemas = list .Values.schema -}}
{{- end -}}
{{- if .Values.schemas -}}
{{- $schemas = .Values.schemas -}}
{{- end -}}
然后我就可以简单地循环了
$schemas
现在我不想将所有内容复制到每个模板中。我很乐意将其作为辅助函数来处理。
所以我尝试了这个:
{{- define "helper.schemas" -}}
{{- $schemas := list -}}
{{- if .Values.postgres.database.schema -}}
{{- $schemas = list .Values.postgres.database.schema -}}
{{- end -}}
{{- if .Values.postgres.database.schemas -}}
{{- $schemas = .Values.postgres.database.schemas -}}
{{- end -}}
{{- $schemas }}
{{- end -}}
.....
mytemplate.yaml
{{- range $indx, $schema := include "helper.schemas" . }}
...
这会导致
range can't iterate over [map[.. ..]]
如何将辅助函数作为 helm 列表传递到模板变量?
在 Go
text/template
语言中,define
d 辅助函数仅生成字符串。在核心语言中,template
操作将字符串写入模板的输出; Helm 有一个 include
扩展,它返回一个字符串,但它总是只返回一个字符串,而不返回任何其他内容。
原则上,您可以使用其他一些语法,例如将列表结果与 JSON 相互转换
{{- define "helper.schemas -}}
{{/* ... */}}
{{- toJson $schemas -}}
{{- end -}}
{{ $schemas := include "helper.schemas" . | fromJson }}
也许将其写成一行行可能会更容易复制和粘贴,但也许不是
{{ $schemas := .Values.schema | list | compact | default .Values.schemas }}
(获取
schema
;将其打包到单例列表中;从列表中删除 falsey [null] 值;如果结果为 falsey [空],则使用 schemas
代替。)
在实践中,我可能会避免对同一件事有两种不同的设置,而只使用列表类型的
schemas
设置,单值列表的 YAML 语法非常简单。