有条件地在图表中包含 helmfile

Conditionally include a helmfile in a chart

我们使用 helm 图表部署到 kubernetes 并使用 helm 生成这些图表。不幸的是,我不熟悉 helm 或 helm 模板(并且对 kubernetes 只略微熟悉)所以在问下面的问题时我可能会使用不正确的术语(事实上我可能已经在本段中做了)所以请耐心等待我得到跟上速度。

我有一个 helm 模板,foo.yaml,类似于以下内容:

{{- define "env.variables" }}
  echo "--- Setting env variables ---"

  export foo={{ .Values.global_vars.foo }}
{{- end }}
apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: "{{ .Values.global_vars.bar }}-set-env-vars"
data:
  set-env-vars.sh: {{ include "env.variables" . | b64enc }}

如您所见,它定义了一个创建一些环境变量的脚本。我正在研究一个要求,只创建那些满足某些条件的变量 (.Values.global_vars.baz == 1)

我想我可以通过做类似的事情来实现:

{{- define "env.variables" }}
  if [ {{ .Values.global_vars.baz }} = 1 ]
  then
    echo "--- Setting env variables ---"

    export foo={{ .Values.global_vars.foo }}
  fi
{{- end }}
apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: "{{ .Values.global_vars.bar }}-set-env-vars"
data:
  set-env-vars.sh: {{ include "env.variables" . | b64enc }}

但这并不是一种非常优雅的方式。我可以将条件表达式放入 data 中,只包含满足条件的脚本吗?像这样:

{{- define "env.variables" }}
  echo "--- Setting env variables ---"

  export foo={{ .Values.global_vars.foo }}
{{- end }}
{{- define "no.env.variables" }}
  echo "--- No env variables to set ---"
{{- end }}
apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: "{{ .Values.global_vars.bar }}-set-env-vars"
data:
  set-env-vars.sh: {{ if {{ .Values.global_vars.bar }} = 1 then include "env.variables" else include "no.env.variables" . | b64enc }}

希望这是有道理的。这实际上是我第一次接触 helm,所以我正在寻找一些菜鸟指导。

helm 文件中花哨的 {{ }} 东西是 GO templates。它们有几个 built-in 特征,其中之一是控制结构,例如 if-else。它们允许您有条件地呈现部分模板。

您可以在 env.variables named template 中添加条件:

{{ define "env.variables" }}
  {{ if eq .Values.global_vars.baz "1" }}
  echo "--- Setting env variables ---"

  export foo={{ .Values.global_vars.foo }}
  {{ else }}
  echo "--- No env variables to set ---"
  {{ end }}
{{ end }}
data:
  set-env-vars.sh: {{ include "env.variables" . | b64enc }}

set-env-vars.sh 值:

{{- define "env.variables" }}
  echo "--- Setting env variables ---"

  export foo={{ .Values.global_vars.foo }}
{{- end }}
{{- define "no.env.variables" }}
  echo "--- No env variables to set ---"
{{- end }}
data:
  set-env-vars.sh: {{ if eq .Values.global_vars.baz "1" }} 
    {{- include "env.variables" . | b64enc }}
  {{- else }}
    {{- include "env.variables" . | b64enc }}
  {{- end }}

效果是一样的

一个令人困惑的事情可能是 if eq .Values.global_vars.baz "1" 语法。 eq 是一个函数,接下来的值是它的参数(GO 模板没有等号运算符)。