values.yaml的Configmap中的Helm模板



我正在寻求帮助来创建一个通用的configmap。可以支持多种服务的Yaml。

的值。yaml (THIS WORKS)

value1:  val1
genericConfigMapProperties:
application.properties: |-
prop1=prop1value
prop2=prop2value

configmap.yaml

apiVersion: 1
kind: ConfigMap
...
...
data:
{{ (toYaml .Values.genericConfigMapProperties)  . | ident 4 }}

模板{{ (toYaml .Values.genericConfigMapProperties) . | ident 4 }}几乎是完美的。正确呈现application.properties:

data:
application.properties: |-
prop1=prop1value
prop2=prop2value

的值。yaml(这行不通)

value1:  val1
genericConfigMapProperties:
cmValue1: {{ .Values.value1 | default "default val1" | quote }}
application.properties: |-
prop1=prop1value
prop2=prop2value

它得到错误渲染cmValue1。我期待着这个答案:

data:
cmValue1: val1
application.properties: |-
prop1=prop1value
prop2=prop2value

错误:

Error: failed to parse values.yaml: error converting YAML to JSON: yaml: invalid map key: map[interface {}]interface {}{".Values.value1 | default "default val1" | quote":interface {}(nill)}
helm.go:88: [debug]  error converting YAML to JSON: yaml: invalid map key: map[interface {}]interface {}{".Values.value1 | default "default val1" | quote":interface {}(nill)}
failed to parse values.yaml

我需要什么额外的helm模板代码来支持cmValue1渲染?

谢谢。

Helm不支持二次渲染,但是您可以使用yaml锚来实现此功能,或者间接使用命名模板.

方案A:锚

values.yaml

value1: &value1 val1
genericConfigMapProperties:
cmValue1: *value1
application.properties: |-
prop1=prop1value
prop2=prop2value

模板/configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
name: test
data: 
config.yaml: |
{{- toYaml $.Values.genericConfigMapProperties | nindent 4 }}

输出
apiVersion: v1
kind: ConfigMap
metadata:
name: test
data: 
config.yaml: |
application.properties: |-
prop1=prop1value
prop2=prop2value
cmValue1: val1

方案B:命名模板

values.yaml

value1: val1

模板/_helpers.tpl

{{/*
cmValue template
*/}}
{{- define "genericConfigMapProperties" -}}
cmValue1: {{ .Values.value1 | default "default val1" | quote }}
application.properties: |-
prop1=prop1value
prop2=prop2value
{{- end -}}

模板/configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
name: test
data: 
config.yaml: |
{{- include "genericConfigMapProperties" . | nindent 4 }}

输出
apiVersion: v1
kind: ConfigMap
metadata:
name: test
data: 
config.yaml: |
cmValue1: "val1"
application.properties: |-
prop1=prop1value
prop2=prop2value

感谢您的回复。

我从bitnami通用模板中找到了这个很棒的解决方案。它几乎可以在任何地方使用。

https://github.com/bitnami/charts/blob/master/bitnami/common/templates/_tplvalues.tpl

复制模板文件:

{{/* vim: set filetype=mustache: */}}
{{/*
Renders a value that contains template.
Usage:
{{ include "common.tplvalues.render" ( dict "value" .Values.path.to.the.Value "context" $) }}
*/}}
{{- define "common.tplvalues.render" -}}
{{- if typeIs "string" .value }}
{{- tpl .value .context }}
{{- else }}
{{- tpl (.value | toYaml) .context }}
{{- end }}
{{- end -}}

使用它来模板configmap中的任何值。Yaml或部署。Yaml或其他地方…

values.yaml:

configMapProperties:
cmValue1: "val1"
application.properties: |-
prop1=prop1value
prop2=prop2value

configmap.yaml

data:
{{- if .Values.configMapProperties }}
{{- include "common.tplvalues.render" ( dict "value" .Values.configMapProperties "context" $ ) | nindent 2 }}
{{- end }}

最新更新