是否可以在舵图中定义使用if / else条件的变量?

时间:2019-08-22 00:54:44

标签: kubernetes-helm

在我的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””错误,有人知道如何实现吗?谢谢!

2 个答案:

答案 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的支持模板库,该模板includesternary函数,其作用类似于内联“ if”语句。对于你的例子,你可以写

{{- $env := ternary .Values.localEnv .Values.prodEnv .Values.isLocal -}}

(也可以考虑只为每种环境编写完全独立的Helm值文件,并使用helm install -f prod.yaml安装图表,而不是尝试将所有可能的环境封装在一个文件中。)