将 yaml 转换为 helm 模板中的属性文件

abi*_*net 5 kubernetes-helm sprig-template-functions

我想将values.yaml 中的结构的一部分转换为配置映射中的属性文件。

是否可以转换 yaml 结构,例如:

field1: value1
field2:
   field21: value21
   field22: value22
Run Code Online (Sandbox Code Playgroud)

进入

field1=value1
field2.field21=value21
field2.field22=value22
Run Code Online (Sandbox Code Playgroud)

具有 Helm 模板功能?

Dav*_*aze 3

作为一个编程问题,这是一个简单的递归调用。text/template您可以像函数一样使用 Go模板。这里的一个技巧是它们只接受一个参数,因此您需要使用sprig list函数将多个值打包到该参数中,并使用该函数将值取回。text/template index

{{- define "envify" -}}
{{- $prefix := index . 0 -}}
{{- $value := index . 1 -}}
{{- if kindIs "map" $value -}}
  {{- range $k, $v := $value -}}
    {{- template "envify" (list (printf "%s.%s" $prefix $k) $v) -}}
  {{- end -}}
{{- else -}}
{{ $prefix }}={{ $value }}
{{ end -}}

data:
{{ template "envify" (list "" .Values.fields) | indent 2 }}
Run Code Online (Sandbox Code Playgroud)

这适用于任意深度的嵌套值。

如果您引用标准 Helm 变量(.Release.Values、 ...),这也会变得很棘手,因为该.变量被重用于单个模板参数(它也在循环内被重用range)。我倾向于将其作为附加模板参数显式传递。

{{- $top := index . 2 -}}
# from the {{ $top.Chart.Name }} Helm chart

{{/* in your ConfigMap proper */}}
{{ template "envify" (list "" .Values.fields .) }}
Run Code Online (Sandbox Code Playgroud)