2

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

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

field1: value1
field2:
   field21: value21
   field22: value22

进入

field1=value1
field2.field21=value21
field2.field22=value22

使用 Helm 模板功能?

4

3 回答 3

4

您需要将您的值置于单独的Configmap.

值.yaml

fields:
  field1: value1
  field2:
    field21: value21
    field22: value22

configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: Configmap
data:
{{ range $key, $value := .Values.fields }}
  {{- if kindIs "map" $value -}}
  {{ $top:=$key }}
  {{- range $key, $value := $value }}
  {{ $top }}.{{ $key }}={{ $value }}
  {{- end -}}
  {{- else -}}
  {{ $key | indent 2}}={{ $value }}
  {{- end -}}
{{- end -}}

掌舵模板。-x 模板/configmap.yaml

---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: Configmap
data:
  field1=value1
  field2.field21=value21
  field2.field22=value22

我建议将此逻辑提取到_helpers.tpl文件中。如果您有更多嵌套配置,则需要添加更多逻辑。

于 2020-02-12T09:18:52.530 回答
3

作为一个编程问题,这是一个简单的递归调用。您可以使用 Gotext/template模板,例如函数。这里的一个技巧是它们只接受一个参数,因此您需要使用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 }}

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

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

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

{{/* in your ConfigMap proper */}}
{{ template "envify" (list "" .Values.fields .) }}
于 2020-02-12T10:56:35.307 回答
1

对同一模板的递归调用很简单。下面的代码片段正在工作。它应该将 values.yaml 转换为 configmap 数据作为属性。

{{- define "envify" -}}
{{- $prefix := index . 0 -}}
{{- $value := index . 1 -}}
{{- if kindIs "map" $value -}}
  {{- range $k, $v := $value -}}
    {{- if $prefix -}}
        {{- template "envify" (list (printf "%s.%s" $prefix $k) $v) -}}
    {{- else -}}
        {{- template "envify" (list (printf "%s" $k) $v) -}}
    {{- end -}}          
  {{- end -}}
{{- else -}}
{{ $prefix | indent 2 }}={{ $value }}
{{ end -}}
{{- end -}}
于 2020-11-23T10:46:38.930 回答