从 helm 辅助函数返回列表变量

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

我想在 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 列表传递到模板变量?

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

在 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 语法非常简单。

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