如何在 Helm 函数中从模板返回地图对象?

Don*_*mmy 4 yaml go kubernetes-helm

我有一个函数想在另一个函数中调用。我希望它返回地图,但它返回toString地图的表示形式。它函数内部的实际映射,但不是函数外部的映射。

{{- define "app.getSubKey" -}}
  {{- $name := .source }}
  {{- range $key, $value := .keys }}
    {{- if kindIs "int" $value }}
      {{- $name = index $name (int $value) }}
    {{- else }}
      {{- $name = index $name $value }}
    {{- end }}
  {{- end }}
  {{- if kindIs "string" $name }}
    {{- trim $name }}
  {{- else }}
    {{ $name }}
  {{- end }}
{{- end }}
Run Code Online (Sandbox Code Playgroud)

当我在下面的 YAML 上使用 调用这个函数时{{- include "app.getSubKey" (dict "source" .Values.vars "keys" (list 0)) }},函数内部$name是一个映射(我曾经kindOf检查过这个),但在它外部是某种字符串。我如何才能将其作为地图返回?

vars:
  - name: something
    value: blah
Run Code Online (Sandbox Code Playgroud)

Maf*_*for 10

准确地说:您的app.getSubKey不是一个函数,它是一个命名模板,因此,它不会返回任何内容。另一方面,include是一个函数。它将模板名称及其上下文作为参数,并将渲染的模板作为字符串返回。include您无法更改函数返回值的类型。

话虽如此,我看到两个选择:

  • 如果您的目标是从调用中获取格式正确的 YAML include "app.getSubKey"(仍为字符串),请在命名模板中使用 toYaml 函数,即:
{{- define "app.getSubKey" -}}
  ...
  {{- else }}
    {{- $name | toYaml | nindent 0 }}
  {{- end }}
{{- end }}
Run Code Online (Sandbox Code Playgroud)

nindent 0需要正确左对齐 YAML

  • 如果你想获取一个实际的字典(用于进一步处理),你需要将从回调返回的字符串转换include为一个对象(toYaml命名模板中的仍然是必需的):
  {{- $d := dict "source" .Values.vars "keys" (list 0) | include "app.getSubKey" | fromYaml -}}
Run Code Online (Sandbox Code Playgroud)

fromYaml函数没有文档记录,因此使用它可能有点冒险。我在官方文档中找到的唯一痕迹是在库图表页面上的示例中。

顺便说一句,逻辑似乎不正确:对于包含多个元素的列表,app.getSubKey它将失败。keys


如果app.getSubKey返回一个数组,则必须使用fromYamlArray“解码”数据。