【问题标题】:Evaluate condition from value file in Helm template从 Helm 模板中的值文件评估条件
【发布时间】:2021-07-01 14:53:07
【问题描述】:
当我的 values.yaml 文件中有一行时:
condition: "eq .Release.Namespace dev"
我可以在模板中以某种方式对此进行评估吗?
{{- if .condition }}
status: "development"
{{- end }}
我已尝试执行上述操作,但不起作用,我还能做些什么来实现这一点吗?
【问题讨论】:
标签:
kubernetes-helm
sprig-template-functions
【解决方案1】:
更好的做法是使用 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 模板的经验是,可能在模板中做一些相当复杂的事情,但是一旦你开始在那里编写严肃的代码和动态评估,你就会开始进入普通软件生命周期问题,例如很难对此设置进行单元测试。