0

当我的 values.yaml 文件中有一行时:

condition: "eq .Release.Namespace dev"

我可以以某种方式在模板中对此进行评估吗?

{{- if .condition  }}
status: "development"
{{- end }}

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

4

1 回答 1

3

更好的做法是使用 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 模板的经验是,可以在模板中做一些非常复杂的事情,但是一旦你开始在那里编写严肃的代码和动态评估,你就会开始遇到正常的软件生命周期问题,例如很难单元- 测试此设置。

于 2021-07-01T15:09:06.587 回答