Область видимости в шаблонах Helm.

История в которой я потерял день пытаясь понять разницу между “:=” и “=” в helm templates. Также про область видимости.

Пример

У нас создан helm chart, в values.yaml объявим список myBucket со следующими элементами apple, orange, lemon, potato.

myBucket:
  - apple
  - orange
  - lemon
  - potato

В шаблоне необходимо проверить корзину на наличие фруктов. Вначале я написал следующий код

---
{{- $isFruitInMyBucket := false }}
{{- range $bucketElement := .Values.myBucket }}
{{-   if eq "apple" $bucketElement }}
{{-     $isFruitInMyBucket := true }}
{{-   else if eq "orange" $bucketElement }}
{{-     $isFruitInMyBucket := true }}
{{-   else if eq "lemon"  $bucketElement }}
{{-     $isFruitInMyBucket := true }}
{{-   end }}
{{- end }}
someFruitsInBucket: {{ $isFruitInMyBucket }}

Результат работы шаблона.

helm template .
---
# Source: testchart/templates/testfruit.yaml
someFruitsInBucket: false

Начал разбираться и нашел следующее.

Область видимости, если переменная объявлена в некой области видимости (внутри цикла, условия) через “:=”, то будет объявлена новая переменная, доступная только внутри этой области видимости. Если вместо “:=” использовать “=”, то helm (скорее gotemplate) возмет эту переменную из родительской области видимости, изменить значение переменной, которое будет также сохранится и в родительской области видимости.

Переписываем шаблон правильным образом.

---
{{- $isFruitInMyBucket := false }}
{{- range $bucketElement := .Values.myBucket }}
{{-   if eq "apple" $bucketElement }}
{{-     $isFruitInMyBucket = true }}
{{-   else if eq "orange" $bucketElement }}
{{-     $isFruitInMyBucket = true }}
{{-   else if eq "lemon"  $bucketElement }}
{{-     $isFruitInMyBucket = true }}
{{-   end }}
{{- end }}
someFruitsInBucket: {{ $isFruitInMyBucket }}

Результат работы шаблона.

helm template .
---
# Source: testchart/templates/testfruit.yaml
someFruitsInBucket: true
comments powered by Disqus