213 Dec. 29, 2024, 6:19 a.m.

Шпаргалка по шаблонам HELM

Задача: сформировать данные по возможным сценариям использования шаблонизатора HELM.

Переменные

Объявление перменных

{{ .Values.varName }}

Для сложных манифестов рекомендуется использовать $ чтобы HELM брал переменную точно из файла с переменными:

{{ $.Values.varName }}

Создание переменных в коде

{{- $env := "some value" }}

Вывод перменных из определенного ключа с помощью (index)

В values.yaml объявляется

ENVIRONMENT: dev
varName:
  dev: test
  prod: prod

В коде описывается

{{ index $.Values.varName $env }} # test

Пример вывода переменной из более сложного values.yaml

В values.yaml объявляется

varName:
  dev:
    var0: test 
    var1: someValue
  prod:
    var0: prod
    var1: someValue

# Альтернативная запись

varName:
  dev:
    - {var0: test, var1: someValue ...}
  prod:
    - {var0: prod, var1: someValue ...}

В коде описывается

{{ ( index $.Values.varName $env).var0 }}
{{ ( index $.Values.varName $env).var1 }}

Создание переменных по-умолчанию

{{- $myVar := default (index $.Values.SOMEVAR $env) $.Values.CUSTOM }}

Формирование переменных (printf)

{{- $label := default (printf "prefix-%s-postfix-%s-sometext" $.Values.NAME $.Values.SOME) $.Value.CUSTOM }}
# prefix-<$.Values.NAME>-postfix-<$.Values.SOME>-sometext

Переменные и словари

Объявление

{{- $VAR := dict "item" $.Values.VAR1 "name" $.Values.VAR "prefix" $.Values.VAR3 }}

Обработка в коде:

{{- range .item }}
<...>
{{- end }}

Условия (if)

Базовое правило

Для проверки наличия переменной делается так:

{{- if $.Values.someValue }}
OK
{{- else }}
NOT OK
{{- end }}

Сравнение переменных

{{- if eq $.Values.someValue "test" }}
  result 1
{{- else if eq $.Values.someValue "dev" }}
  result 2
{{- else }}
  empty
{{- end }}

Сравнение для определенного ключа с помощью (index)

(см. статью по циклам или переменным)

Сложное правило, проверка наличия переменной и если оно есть поиск в белом списке

{{- if  (or (not $.Values.VAR ) (contains not $.Values.VAR (printf "%s" $.Values.WHITELIST))) }}

Альтернативный пример

{{- if  (or (not $.Values.VAR) (contains  (printf "%s" not $.Values.VAR) (join "," $.Values.WHITELIST))) }}

Циклы (for)

Базовый цикл

Для того чтобы была воможность использовать цикл в цикле можно определять count и index:

{{- range $index, $value := $.values.varName }}

{{- end }}

где:

  • $index - это номер итерации цикла, начинается с 0. Название может быть отличным от предложенного;
  • $value - на каждой итерации в эту перменную заносятся данные. В коде используется так {{ $values }}, вместо {{ . }};

Вывод в цикле переменных для определенного ключа

Перменная для массива:

varName:
  dev:
    - {name: test, value: some ...}
    - {name: test, value: some ...}
    - ...

В коде описывается

{{- range $index, $value := index $.Values.varName $env }}
  {{ $value.name }}
  {{ $value.value }}
{{- end }}

Обработка нескольких списков по ключу (index)

Объявляется переменная

VAR:
  default
    - {name: test, value: some ...}
    - {name: test, value: some ...}
    - ...
  all
    - {name: test, value: some ...}
    - {name: test, value: some ...}
    - ...
  dev:
    - {name: test, value: some ...}
    - {name: test, value: some ...}
    - ...

В коде описывается

{{- range $listIndex , $array := (list (index $.Values.VAR "default") (index $.Values.VAR "all") (index $.Values.VAR $env)) }}
{{- range $index, $value := $array }}
<...>
{{- end }}
{{- end }}

*индекс каждого цикла начинается с 0, чтобы не было дубликтов рекомендуется использовать $listIndex и $index совместно