Helm 模板 - 如何在数组中使用“如果存在至少一个”?

Edg*_*gar 6 go-templates kubernetes-helm

我试图将 values.yaml 中的 env vars 列表变成一个 secret.yaml 文件,其中包含“secret”类型的 envs 列表。这个想法是只在至少一种类型等于“秘密”时才创建这个秘密文件。

例如:

值.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
Run Code Online (Sandbox Code Playgroud)

生成的 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
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用范围迭代、布尔变量和 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 -}}

Run Code Online (Sandbox Code Playgroud)

它会生成三个复制的 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"

Run Code Online (Sandbox Code Playgroud)

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

Edg*_*gar 2

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

基本上,我使用define创建了一个“模板函数”,它从values.yaml迭代环境列表,并编写一个仅包含类型属性与“秘密”一词匹配的环境的字符串。然后我使用 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 -}}%                                                                                                                                                                                                         

Run Code Online (Sandbox Code Playgroud)

这是一个示例输出:

$ 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
Run Code Online (Sandbox Code Playgroud)

奇迹般有效!;)