Helm 当变量子键不存在时回退到默认的下一个变量

Helm when variable child key does not exist fallback to default next variable

使用 Helm v3 时,以下模板出现错误:

Error: INSTALLATION FAILED: template: rabbitmq/templates/secrets.yaml:4:31: executing "rabbitmq/templates/secrets.yaml" at <.Values.global.rabbitmq.password>: nil pointer evaluating interface {}.rabbitmq

rabbitmq/templates/secrets.yaml 的内容:

{{- $def := index .Values "default" -}}
apiVersion: v1
data:
  rabbitmq-password: {{ $def.global.rabbitmq.password | default $def.RABBITMQ_PASSWORD | b64enc | quote }}
  rabbitmq-erlang-cookie: {{ randAlphaNum 20 | b64enc | quote }}
kind: Secret
metadata:
  name: rabbitmq-password
type: Opaque

这在 .Values.global.{} 存在时有效。 然而,当 .Values.global 不存在时,它不会像我期望的那样退回到 $def.RABBITMQ_PASSWORD

在您的代码中,变量 $def 始终是 .Values.default(即 values.yaml 文件中顶级键 default: 下的任何内容)。这可能不是你想要的。

我在这里发现成功的模式是为层次结构的每个级别设置一个变量,如果它不存在则默认为一个空字典。这将使您可以进行递归查找。

我猜,当你说 $def.global 时,你实际上是指顶级 .Values.global 对象,它在 Helm 子图上下文中具有特殊含义。所以你可以像这样安全地进行这些查找:

{{- $def := .Values.default | default dict }}
{{- $global := .Values.global | default dict }}
{{- $rabbitmq := $global.rabbitmq | default dict }}
rabbitmq-password: {{ $rabbitmq.password | default $def.RABBITMQ_PASSWORD | b64enc | quote }}