Преобразование yaml в файл свойств в шаблоне Helm

Я хотел бы преобразовать часть структуры в values.yaml в файл свойств на карте конфигурации.

Можно ли преобразовать структуру yaml, например:

field1: value1
field2:
   field21: value21
   field22: value22

в

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

с функциями шаблонов Helm?

4 ответа

Решение

Вам нужно будет привести свои значения в отдельный ключ и некоторые функции шаблона Sprig в вашемConfigmap.

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. Вам нужно будет добавить больше логики, если у вас больше вложенных конфигураций.

Ответов здесь мне было недостаточно, поэтому я взял их за основу и улучшал, пока не получил что-то, что работало.

Мне по-прежнему хотелось рекурсивного чтения любых свойств по какому-то ключу в моем файлеvalues.yaml, но я хотел, чтобы он был отформатирован для использования с dotenv.

Вот что я придумал:

значения.yaml

      config:
  database:
    name: my-db
    host: my-db-host
    port: 5432

Карта конфигурации

      data:
  .env: |-
    {{- include "envify" (list "" .Values.config . ) | nindent 4 }}

Шаблон:

      {{- 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 | upper) $v) -}}
    {{- else -}}
        {{- template "envify" (list (printf "%s" $k) $v) -}}
    {{- end -}}
  {{- end -}}
{{- else -}}
{{ $prefix }}={{ $value }}
{{ end -}}
{{- end -}}

Выход:

      data:
  .env: |-
    DATABASE_NAME=my-db
    DATABASE_HOST=my-db-host
    DATABASE_PORT=5432

Надеюсь, это кому-то поможет.

Как проблема программирования, это прямой рекурсивный вызов. Вы можете использовать Gotext/templateшаблоны, такие как функции. Единственный трюк здесь в том, что они принимают только один параметр, поэтому вам нужно использовать веточку 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 .) }}

Рекурсивный вызов того же шаблона прост. Приведенный ниже фрагмент работает. Он должен преобразовать 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 -}}
Другие вопросы по тегам