【问题标题】:Convert yaml to property file in helm template将 yaml 转换为 helm 模板中的属性文件
【发布时间】:2020-05-27 18:25:35
【问题描述】:

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

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

field1: value1
field2:
   field21: value21
   field22: value22

进入

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

使用 Helm 模板功能?

【问题讨论】:

    标签: kubernetes-helm sprig-template-functions


    【解决方案1】:

    您需要将您的值放在单独的键下,并在您的 Configmap 中添加一些 Sprig Template Functions

    values.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 文件中。如果您有更多嵌套配置,则需要添加更多逻辑。

    【讨论】:

      【解决方案2】:

      作为一个编程问题,这是一个简单的递归调用。您可以使用 Go text/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 .) }}
      

      【讨论】:

        【解决方案3】:

        对同一模板的递归调用很简单。 下面的 sn-p 正在工作。它应该将 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 -}}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-15
          • 2021-06-13
          • 2020-10-07
          • 1970-01-01
          • 2019-10-31
          • 2021-10-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多