Kubernetes 如何基于嵌套值的存在有条件地呈现头盔模板

Kubernetes 如何基于嵌套值的存在有条件地呈现头盔模板,kubernetes,kubernetes-helm,Kubernetes,Kubernetes Helm,我有一个模板,用于呈现包含登录到我的服务器的凭据的机密。有一种部署配置,在这种配置中,这是不安全的,在这种情况下,我不想透露秘密。通常,my values.yaml包含auth.myapp.username和auth.myapp.password,但是当部署缺少凭据时,整个auth部分将不再存在 我的秘密模板如下所示: {{ if .Values.auth.myapp.username }} apiVersion: v1 kind: Secret metadata: name: myapp-

我有一个模板,用于呈现包含登录到我的服务器的凭据的机密。有一种部署配置,在这种配置中,这是不安全的,在这种情况下,我不想透露秘密。通常,my values.yaml包含auth.myapp.username和auth.myapp.password,但是当部署缺少凭据时,整个auth部分将不再存在

我的秘密模板如下所示:

{{ if .Values.auth.myapp.username }}
apiVersion: v1
kind: Secret
metadata:
  name: myapp-credentials-secret
type: Opaque
data:
  USERNAME: {{ .Values.auth.myapp.username | b64enc }}
  PASSWORD: {{ .Values.auth.myapp.password | b64enc }}
{{ end }}
但是,我在运行helm install时出错,因为“auth”值不存在,它无法从中查找myapp

我知道我可以通过不使用--strict标志来解决这个问题,但我无法控制这个问题,有没有一种正确的方法来预测嵌套值?

使用haskey函数:

{{ if haskey .Values "auth" }}
apiVersion: v1
kind: Secret
metadata:
  name: myapp-credentials-secret
type: Opaque
data:
  USERNAME: {{ .Values.auth.myapp.username | b64enc }}
  PASSWORD: {{ .Values.auth.myapp.password | b64enc }}
{{ end }}
如果给定的dict包含给定的键,则
hasKey
返回
true

hasKey $myDict "name1"

如果找不到键,则返回
false

您可以使用标准的
default
函数填充层次结构中不存在的层,并结合Sprig
dict
函数创建空字典:

{{- $auth := .Values.auth | default dict -}}
{{/* $auth is the "auth" object from the top-level values, or an empty
     dictionary if there was no such value */}}
这样,您就可以一次一级地逐步完成此结构:

{{- $auth := .Values.auth | default dict -}}
{{- $myapp := $auth.myapp | default dict -}}
{{- if and $myapp.username $myapp.password -}}
apiVersion: v1
kind: Secret
...
data:
  USERNAME: {{ $myapp.username | b64enc }}
  PASSWORD: {{ $myapp.password | b64enc }}
{{ end }}