繁体   English   中英

用于值的 Configmap 中的 Helm 模板。yaml

[英]Helm Templating in Configmap for values.yaml

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

values.yaml (这工作)

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 }} {{ (toYaml.Values.genericConfigMapProperties). | ident 4 }} {{ (toYaml.Values.genericConfigMapProperties). | ident 4 }}几乎是完美的。 它正确呈现application.properties

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

values.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 锚来实现这个 function,或者间接使用命名模板

A计划:锚

值。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 }}

output

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

计划 B:命名模板

值。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 }}

output

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 或 deployment.yaml 或其他任何地方的任何值...

值。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 }}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM