当我的 values.yaml 文件中有一行时:
condition: "eq .Release.Namespace dev"
我可以以某种方式在模板中对此进行评估吗?
{{- if .condition }}
status: "development"
{{- end }}
我已经尝试执行上述操作,但这不起作用,我还能做些什么来实现这一目标?
当我的 values.yaml 文件中有一行时:
condition: "eq .Release.Namespace dev"
我可以以某种方式在模板中对此进行评估吗?
{{- if .condition }}
status: "development"
{{- end }}
我已经尝试执行上述操作,但这不起作用,我还能做些什么来实现这一目标?
更好的做法是使用 Helm 值文件明确说明这些条件,即使它们是多余的。
# values.dev.yaml
status: development
# configmap.yaml
status: {{ .Values.status }}
helm install release-name . -f values.dev.yaml -n dev
不过,这在技术上是可行的。Helm 的扩展函数之一(不是核心 Go 文本/模板库或 Sprig 的一部分)是tpl
,它允许您评估任意字符串,就好像它是模板字符串一样。您需要将该值包装起来{{ ... }}
以强制将其作为表达式进行评估。但是,这确实有效,并helm template
输出正确的值:
apiVersion: v1
kind: ConfigMap
metadata:
name: demo
data:
{{/* This is the raw condition string from values.yaml */}}
condition: {{ .Values.condition }}
{{/* This calls `tpl` on that string, and dumps out the result */}}
evaluated: {{ tpl (printf "{{%s}}" .Values.condition) . }}
{{/* `tpl` produces a string out, but you can compare it */}}
{{- if eq "true" (tpl (printf "{{%s}}" .Values.condition) .) }}
status: development
{{- else }}
status: production
{{- end }}
我使用 Helm 模板的经验是,可以在模板中做一些非常复杂的事情,但是一旦你开始在那里编写严肃的代码和动态评估,你就会开始遇到正常的软件生命周期问题,例如很难单元- 测试此设置。