我正在寻求帮助来创建一个通用的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 }}