【问题标题】:Helm template - how to use "if exists at least one of" in array?Helm模板 - 如何在数组中使用“如果至少存在一个”?
【发布时间】:2019-08-07 20:17:21
【问题描述】:

我正在尝试将 values.yaml 中的 env var 列表变成一个 secret.yaml 文件,其中包含“secret”类型的 env 列表。我们的想法是仅在至少有一种类型等于“secret”时才创建此机密文件。

例如:

values.yaml

env:
  - name: PLAIN_TEXT_ENV_VAR1
    type: plain
    value: text value
  - name: PLAIN_TEXT_ENV_VAR2
    type: plain
    value: text value
  - name: TOP_SECRET_ENV_VAR_1
    type: secret
  - name: TOP_SECRET_ENV_VAR_2
    type: secret
  - name: TOP_SECRET_ENV_VAR_3
    type: secret

产生的 secret.yaml

kind: Secret
metadata:
  name: test
data:
    TOP_SECRET_ENV_VAR_1: change_me
    TOP_SECRET_ENV_VAR_2: change_me
    TOP_SECRET_ENV_VAR_3: change_me

我已经尝试使用范围来迭代、布尔变量和 if 语句创建一些流控制,但是在我将其更改为另一个值后,go 模板似乎忽略了我的 ifs。 现在我的秘密模板如下所示。

{{ $flowcontrol := true -}}
{{ if $flowcontrol -}}
{{ range $env := $.Values.env -}}
{{ if eq $env.type "secret" -}}
apiVersion: v1
kind: Secret
metadata:
  name: testsecret
data:
    {{- range $env := $.Values.env }}
        {{- if eq $env.type "secret" }}
    {{ $env.name }}: "change_me" 
        {{- end }}
    {{- end }}
{{ $flowcontrol := false }}
{{ end -}}
{{ end -}}
{{ end -}}

它会生成三个复制的 secret.yaml 文件,其中包含 3 个变量:

$ helm template . 
---
# Source: teste/templates/secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: testsecret
data:
    TOP_SECRET_ENV_VAR_1: "change_me"
    TOP_SECRET_ENV_VAR_2: "change_me"
    TOP_SECRET_ENV_VAR_3: "change_me"

apiVersion: v1
kind: Secret
metadata:
  name: testsecret
data:
    TOP_SECRET_ENV_VAR_1: "change_me"
    TOP_SECRET_ENV_VAR_2: "change_me"
    TOP_SECRET_ENV_VAR_3: "change_me"

apiVersion: v1
kind: Secret
metadata:
  name: testsecret
data:
    TOP_SECRET_ENV_VAR_1: "change_me"
    TOP_SECRET_ENV_VAR_2: "change_me"
    TOP_SECRET_ENV_VAR_3: "change_me"

如何控制流程:如果列表的第一项满足条件,则仅在之后的另一部分中迭代同一列表的其余部分?

【问题讨论】:

    标签: kubernetes-helm go-templates


    【解决方案1】:

    我已经成功创建了这个功能! :D

    基本上,我使用 define 创建了一个“模板函数”,它从 values.yaml 迭代 env 列表并写入一个字符串,该字符串仅包含 type 属性与单词“secret”匹配的 env。 然后我使用 include 调用该函数并将其输出分配给一个变量。

    如果变量长度大于 0(意味着它不是空字符串),则创建秘密文件,然后我使用相同的字符串填充数据属性。

    这是包含函数和秘密模板的代码:

    {{- define "get-secrets-from-env-list" -}}
        {{- $allenv := index . 0 -}}
        {{- range $i, $scrts := $allenv -}}
            {{- if eq $scrts.type "secret" -}}
                {{- nindent 0 $scrts.name -}}: {{ "change_me" | b64enc -}}
            {{- end -}}
        {{- end -}}
    {{- end -}}
    
    {{ $secrets := include "get-secrets-from-env-list" (list .Values.env ) }}
    
    {{- if gt (len $secrets) 0 -}}
    apiVersion: v1
    kind: Secret
    type: Opaque
    metadata:
      name: {{ include "awesome-chart.fullname" $ }}
      labels:
        app.kubernetes.io/name: {{ include "awesome-chart.name" $ }}
        helm.sh/chart: {{ include "awesome-chart.chart" $ }}
        app.kubernetes.io/instance: {{ $.Release.Name }}
        app.kubernetes.io/managed-by: {{ $.Release.Service }}
    data:
        {{- nindent 2 $secrets -}}
    {{- end -}}%                                                                                                                                                                                                         
    
    

    这是一个示例输出:

    $ helm template .          
    ---
    # Source: awesome-chart/templates/secret.yaml
    apiVersion: v1
    kind: Secret
    type: Opaque
    metadata:
      name: my-app
      labels:
        app.kubernetes.io/name: awesome-chart
        helm.sh/chart: awesome-chart
        app.kubernetes.io/instance: release-name
        app.kubernetes.io/managed-by: Tiller
    data:
    
      TOP_SECRET_ENV_VAR_1: Y2hhbmdlX21l
      TOP_SECRET_ENV_VAR_2: Y2hhbmdlX21l
      TOP_SECRET_ENV_VAR_3: Y2hhbmdlX21l
    

    像魅力一样工作! ;)

    【讨论】:

    • 知道data: 和第一个TOP_SECRET... 之间这个额外的换行符是从哪里来的吗?
    • @Syffys 我不知道为什么会有这个换行符。正如你所看到的,我已经使用了像这里{{- nindent 2 $secrets -}} 这样的模板,并且还使用了整个定义的“get-secrets-from-env-list”函数。好消息是 k8s 忽略了这一新行进入清单。这很烦人,但有效。你可以查看整个模板@github:github.com/edgar-anascimento/awesome-chart
    • 额外的空间是由于这一行:{{ $secrets := include "get-secrets-from-env-list" (list .Values.env ) }} 你可以这样做 {{ - $secrets := 包括 "get-secrets-from-env-list" (list .Values.env ) -}}
    • @AnthonyPerot 实际上也不是。我尝试了您的建议,但没有任何改变。
    猜你喜欢
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    相关资源
    最近更新 更多