Условное включение файла helm в диаграмму

#kubernetes #helmfile

#kubernetes #kubernetes-helm

Вопрос:

Мы используем диаграммы helm для развертывания в kubernetes и helm для создания этих диаграмм. К сожалению, я не знаком с helm или шаблонами helm (и лишь умеренно знаком с kubernetes), поэтому, задавая вопрос ниже, я могу использовать неправильную терминологию (на самом деле я, возможно, уже делал это в этом параграфе), поэтому, пожалуйста, потерпите, пока я набираю скорость.

У меня есть шаблон helm, foo.yaml, который выглядит следующим образом:

 {{- define "env.variables" }}
  echo "--- Setting env variables ---"

  export foo={{ .Values.global_vars.foo }}
{{- end }}
apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: "{{ .Values.global_vars.bar }}-set-env-vars"
data:
  set-env-vars.sh: {{ include "env.variables" . | b64enc }}
  

Как вы можете видеть, он определяет скрипт, который создает некоторые переменные среды. Я работаю над требованием создавать только те переменные, для которых какое-либо условие истинно ( .Values.global_vars.baz == 1 )

Я полагаю, я мог бы добиться этого, выполнив что-то вроде:

 {{- define "env.variables" }}
  if [ {{ .Values.global_vars.baz }} = 1 ]
  then
    echo "--- Setting env variables ---"

    export foo={{ .Values.global_vars.foo }}
  fi
{{- end }}
apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: "{{ .Values.global_vars.bar }}-set-env-vars"
data:
  set-env-vars.sh: {{ include "env.variables" . | b64enc }}
  

но это не кажется очень элегантным способом сделать это. Могу ли я ввести условное выражение data , которое включает только сценарий, в котором выполняется условие. Что-то вроде этого:

 {{- define "env.variables" }}
  echo "--- Setting env variables ---"

  export foo={{ .Values.global_vars.foo }}
{{- end }}
{{- define "no.env.variables" }}
  echo "--- No env variables to set ---"
{{- end }}
apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: "{{ .Values.global_vars.bar }}-set-env-vars"
data:
  set-env-vars.sh: {{ if {{ .Values.global_vars.bar }} = 1 then include "env.variables" else include "no.env.variables" . | b64enc }}
  

Надеюсь, это имеет смысл. Это буквально моя первая экскурсия в helm, поэтому я ищу руководство для новичков.

Ответ №1:

Необычные {{ }} вещи в файлах helm — это шаблоны GO. У них есть несколько встроенных функций, одна из них — управляющие структуры, такие как if-else . Они позволяют вам отображать часть шаблона условно.

Вы можете добавить условие к env.variables именованному шаблону:

 {{ define "env.variables" }}
  {{ if eq .Values.global_vars.baz "1" }}
  echo "--- Setting env variables ---"

  export foo={{ .Values.global_vars.foo }}
  {{ else }}
  echo "--- No env variables to set ---"
  {{ end }}
{{ end }}
data:
  set-env-vars.sh: {{ include "env.variables" . | b64enc }}
  

или в set-env-vars.sh значение:

 {{- define "env.variables" }}
  echo "--- Setting env variables ---"

  export foo={{ .Values.global_vars.foo }}
{{- end }}
{{- define "no.env.variables" }}
  echo "--- No env variables to set ---"
{{- end }}
data:
  set-env-vars.sh: {{ if eq .Values.global_vars.baz "1" }} 
    {{- include "env.variables" . | b64enc }}
  {{- else }}
    {{- include "env.variables" . | b64enc }}
  {{- end }}
  

Эффект будет тот же.

Одной из запутанных вещей может быть if eq .Values.global_vars.baz "1" синтаксис. Это eq функция, а следующие значения являются ее аргументами (шаблоны GO не имеют оператора equals).

Комментарии:

1. Отличный ответ, спасибо. Я закончил на сегодня, но попробую это в понедельник утром. Просто хотел прийти сюда сейчас и подтвердить ваш ответ. Спасибо.

2. попробовал ваше предложение, сработало отлично, спасибо.