Управление, когда дочерний ключ переменной не существует, возвращается к следующей переменной по умолчанию

#kubernetes-helm #helm3

#кубернетес-рулевой #helm3

Вопрос:

При использовании Helm v3 следующий шаблон выходит из строя с ошибкой:

 Error: INSTALLATION FAILED: template: rabbitmq/templates/secrets.yaml:4:31: executing "rabbitmq/templates/secrets.yaml" at lt;.Values.global.rabbitmq.passwordgt;: 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 когда его не существует, он не возвращается, как я ожидал бы.

Ответ №1:

В вашем коде переменная $def всегда .Values.default (то есть все, что находится под ключом верхнего уровня default: в values.yaml файле). Вероятно, это не то, чего ты хочешь.

Шаблон, который я нашел здесь успешным, заключается в том, чтобы установить переменную для каждого уровня иерархии, по умолчанию используя пустой словарь, если он не существует. Это позволит вам выполнять рекурсивный поиск.

Я предполагаю, что , когда вы говорите $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 }}