Змінні
Маючи функції, конвеєри, обʼєкти та структури управління, ми можемо перейти до однієї з основних ідей у багатьох мовах програмування: змінних. У шаблонах вони використовуються рідше. Але ми побачимо, як їх можна використовувати для спрощення коду та для кращого використання with і range.
У попередньому прикладі ми побачили, що цей код не працює:
{{- with .Values.favorite }}
drink: {{ .drink | default "tea" | quote }}
food: {{ .food | upper | quote }}
release: {{ .Release.Name }}
{{- end }}
Release.Name не знаходиться в межах області видимості, обмеженої блоком with. Один зі способів обійти проблеми з областю видимості — присвоїти обʼєкти змінним, до яких можна отримати доступ без врахування поточної області видимості.
У шаблонах Helm змінна є іменованим посиланням на інший обʼєкт. Вона має формат $name. Змінні присвоюються за допомогою спеціального оператора присвоєння: :=. Ми можемо переписати вищезазначене, використовуючи змінну для Release.Name.
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
{{- $relname := .Release.Name -}}
{{- with .Values.favorite }}
drink: {{ .drink | default "tea" | quote }}
food: {{ .food | upper | quote }}
release: {{ $relname }}
{{- end }}
Зверніть увагу, що перед тим як почати блок with, ми присвоюємо $relname := .Release.Name. Тепер всередині блоку with змінна $relname все ще вказує на імʼя релізу.
Запуск цього коду дасть наступний результат:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: viable-badger-configmap
data:
myvalue: "Hello World"
drink: "coffee"
food: "PIZZA"
release: viable-badger
Змінні особливо корисні в циклах range. Їх можна використовувати для спископодібних обʼєктів, щоб захопити як індекс, так і значення:
toppings: |-
{{- range $index, $topping := .Values.pizzaToppings }}
{{ $index }}: {{ $topping }}
{{- end }}
Зверніть увагу, що range йде першим, потім змінні, потім оператор присвоєння, а потім список. Це присвоїть ціле число (починаючи з нуля) змінній $index і значення змінній $topping. Запуск цього коду дасть:
toppings: |-
0: mushrooms
1: cheese
2: peppers
3: onions
Для структур даних, які мають як ключ, так і значення, ми можемо використовувати range, щоб отримати обидва. Наприклад, ми можемо перебрати .Values.favorite таким чином:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
{{- range $key, $val := .Values.favorite }}
{{ $key }}: {{ $val | quote }}
{{- end }}
Тепер на першій ітерації $key буде drink, а $val буде coffee, а на другій $key буде food, а $val буде pizza. Запуск цього коду створить:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: eager-rabbit-configmap
data:
myvalue: "Hello World"
drink: "coffee"
food: "pizza"
Змінні зазвичай не є "глобальними". Вони мають область видимості в межах блоку, в якому вони оголошені. Раніше ми присвоїли $relname на верхньому рівні шаблону. Ця змінна буде видима для всього шаблону. Але в нашому останньому прикладі змінні $key і $val будуть видимі лише всередині блоку {{ range... }}{{ end }}.
Однак є одна змінна, яка завжди є глобальною — $, ця змінна завжди буде вказувати на кореневий контекст. Це може бути дуже корисно, коли ви перебираєте в діапазоні і вам потрібно знати імʼя релізу чарту.
Приклад, що ілюструє це:
{{- range .Values.tlsSecrets }}
---
apiVersion: v1
kind: Secret
metadata:
name: {{ .name }}
labels:
# Багато шаблонів Helm використовували б `.` тут, але це не спрацює,
# однак `$` спрацює тут
app.kubernetes.io/name: {{ template "fullname" $ }}
# Я не можу звертатися до .Chart.Name, але можу використовувати $.Chart.Name
helm.sh/chart: "{{ $.Chart.Name }}-{{ $.Chart.Version }}"
app.kubernetes.io/instance: "{{ $.Release.Name }}"
# Значення з appVersion у Chart.yaml
app.kubernetes.io/version: "{{ $.Chart.AppVersion }}"
app.kubernetes.io/managed-by: "{{ $.Release.Service }}"
type: kubernetes.io/tls
data:
tls.crt: {{ .certificate }}
tls.key: {{ .key }}
{{- end }}
До цього часу ми розглянули лише один шаблон, оголошений в одному файлі. Але одна з потужних можливостей мови шаблонів Helm — це можливість оголошувати кілька шаблонів і використовувати їх разом. Ми перейдемо до цього в наступному розділі.