在我的values.yaml中,我有:
isLocal: false
localEnv:
url: abcd
prodEnv:
url: defg
然后我有一个service.yaml:
{{- if .Values.isLocal }}
{{- $env := .Values.localEnv }}
{{- else}}
{{- $env := .Values.prodEnv }}
{{- end}}
url: {{ $env.url}}
不幸的是,我收到“未定义的变量“ $ env””错误,有人知道如何实现吗?谢谢!
答案 0 :(得分:5)
另一种方法是在启动 if/else
块之前创建变量。例如:
{{- $env := .Values.prodEnv -}}
{{ if .Values.isLocal }}
{{- $env = .Values.localEnv -}}
{{ end}}
请注意,我未在 :=
块内使用了 if
运算符,因为该变量已经创建。
然后
url: {{ $env.url}}
答案 1 :(得分:1)
The Go text/template
documentation注释:
变量的范围扩展到声明它的控制结构(“ if”,“ with”或“ range”)的“ end”动作。...
因此,$env
的声明在{{ if }}...{{ end }}
块的末尾超出了范围,这没什么用。
Helm还包括(几乎全部)称为Sprig的支持模板库,该模板includes和ternary
函数,其作用类似于内联“ if”语句。对于你的例子,你可以写
{{- $env := ternary .Values.localEnv .Values.prodEnv .Values.isLocal -}}
(也可以考虑只为每种环境编写完全独立的Helm值文件,并使用helm install -f prod.yaml
安装图表,而不是尝试将所有可能的环境封装在一个文件中。)