【问题标题】: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 }}

我已尝试执行上述操作,但不起作用,我还能做些什么来实现这一点吗?

【问题讨论】:

  • values.yaml 应该包含,而不是逻辑。

标签: 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 模板的经验是,可能在模板中做一些相当复杂的事情,但是一旦你开始在那里编写严肃的代码和动态评估,你就会开始进入普通软件生命周期问题,例如很难对此设置进行单元测试。

【讨论】: