Область видимости в шаблонах 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