舵图中的 if 子句

Ric*_*ano 4 if-statement kubernetes kubernetes-helm

如何在舵图中检查变量是否为布尔值“true”?我在 Values.yaml 中有一个参数设置为:

myParameter: true
Run Code Online (Sandbox Code Playgroud)

我不太明白以下之间的区别:

{{- if .Values.service.myParameter }}
Run Code Online (Sandbox Code Playgroud)

{{- if eq .Values.service.myParameter "true" }}
Run Code Online (Sandbox Code Playgroud)

如果参数设置为布尔值“true”,我希望该流程进入 if 子句

cod*_*diz 12

您可以使用以下片段来检查布尔值

      {{if (default .Values.seLinux true)}}
      securityContext:
        seLinuxOptions:
          user: system_u
      {{ end }}
Run Code Online (Sandbox Code Playgroud)

然后值文件将包含以下片段

seLinux: true
Run Code Online (Sandbox Code Playgroud)

请让我知道这可不可以帮你。


Dav*_*aze 6

Gotext/template文档解释了该if语句认为“真实”的内容:

空 ["false"] 值为 false、0、任何 nil 指针或接口值,以及任何长度为零的数组、切片、映射或字符串。

YAML 值是类型化的,通常的规则是空值truefalse布尔值:

boolean: true
string: other text, but not "true", "false", or "null"
also a string: 'true'
Run Code Online (Sandbox Code Playgroud)

在您的示例中:

{{- if .Values.service.myParameter }}...{{ end }}
Run Code Online (Sandbox Code Playgroud)

只要myParameter存在(不是 Go nil)并且不是零、文字false或空字符串,就会评估为真。

{{- if eq .Values.service.myParameter "true" }}...{{ end }}
Run Code Online (Sandbox Code Playgroud)

只要myParameter恰好是字符串 "true",而不是布尔值,就会评估为真true。(事实上​​,我认为如果它是一个布尔值,你会从模板引擎中得到一个类型错误。)


Key*_*mon 6

我们有一些模板引擎,用于将布尔值呈现为字符串的值,但在其他地方我们传递布尔值。

因此,我们的图表必须支持布尔值true| false或字符串"true"|"false"

但是 helm 模板(我猜是 golang)不断将 a 转换"true"为布尔值,但不是"false",同时布尔运算符将任何字符串视为true...此外,eq如果比较 bool 和字符串,则会失败,因此必须将其转换。

最简单的方法是将值设置为空字符串,在if https://golang.org/pkg/text/template/#hdr-Actions中计算结果为 false ,因此:

rbac:
  enabled: ""
Run Code Online (Sandbox Code Playgroud)

经过大量测试,我得出了这个表达式:

    value: |
      {{ .Values.rbac.enabled }}
    toString: |
      {{ toString .Values.rbac.enabled   }}
    evaluated: |
      {{ and (not (eq (toString .Values.rbac.enabled) `"false"`)) .Values.rbac.enabled }}
    {{- if and (not (eq (toString .Values.rbac.enabled) `"false"`)) .Values.rbac.enabled }}
    isTrue: yeah
    {{- end }}
Run Code Online (Sandbox Code Playgroud)

因此,这将检查该值的字符串版本是否不是 string "false",如果不是,则评估该值。

它适用于所有组合:

    for i in true '"true"' false '"false"'; do helm template charts/foo/ --show-only templates/rbac.yaml --set "rbac.enabled=$i"; done
    ---
    # Source: foo/templates/rbac.yaml
    value: |
      true
    toString: |
      true
    evaluated: |
      true
    isTrue: yeah
    ---
    # Source: foo/templates/rbac.yaml
    value: |
      "true"
    toString: |
      "true"
    evaluated: |
      "true"
    isTrue: yeah
    ---
    # Source: foo/templates/rbac.yaml
    value: |
      false
    toString: |
      false
    evaluated: |
      false
    ---
    # Source: foo/templates/rbac.yaml
    value: |
      "false"
    toString: |
      "false"
    evaluated: |
      false
Run Code Online (Sandbox Code Playgroud)