Je voudrais convertir une partie de la structure dans values.yaml en fichier de propriétés dans une carte de configuration.
Est-il possible de convertir une structure yaml comme:
field1=value1 field2.field21=value21 field2.field22=value22
dans
field1: value1 field2: field21: value21 field22: value22
avec les fonctions de création de modèles Helm?
3 Réponses :
Vous devrez apporter vos valeurs sous une clé distincte et certaines fonctions de modèle Sprig dans votre Configmap
.
values.yaml
--- # Source: mychart/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: Configmap data: field1=value1 field2.field21=value21 field2.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 -}}
modèle de barre. -x modèles / configmap.yaml
fields: field1: value1 field2: field21: value21 field22: value22
Je suggère d'extraire cette logique dans le fichier _helpers.tpl . Vous devrez ajouter plus de logique si vous avez plus de configurations imbriquées.
En tant que problème de programmation, il s'agit d'un simple appel récursif. Vous pouvez utiliser des text/template
Go comme des fonctions. La seule astuce ici est qu'ils ne prennent qu'un seul paramètre, vous devez donc utiliser la fonction de list
brins pour regrouper plusieurs valeurs dans ce paramètre, et la fonction d' index
text/template
pour récupérer les valeurs.
{{- $top := index . 2 -}} # from the {{ $top.Chart.Name }} Helm chart {{/* in your ConfigMap proper */}} {{ template "envify" (list "" .Values.fields .) }}
Cela fonctionnera avec des valeurs imbriquées arbitrairement profondes.
Si vous faites référence à des variables Helm standard ( .Release
, .Values
, ...), cela devient également délicat car le .
variable est réutilisée pour le paramètre de modèle unique (elle est également réutilisée dans la boucle de range
). J'ai tendance à le passer explicitement comme paramètre de modèle supplémentaire.
{{- 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 }}
L'appel récursif au même modèle est simple. L'extrait ci-dessous fonctionne. Il doit convertir values.yaml en données configmap en tant que propriété.
{{- 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 -}}