Преобразование 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 -}}