Змінні
Маючи функції, конвеєри, обʼєкти та структури управління, ми можемо перейти до однієї з основних ідей у багатьох мовах програмування: змінних. У шаблонах вони використовуються рідше. Але ми побачимо, як їх можна використовувати для спрощення коду та для кращого використання 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 — це можливість оголошувати кілька шаблонів і використовувати їх разом. Ми перейдемо до цього в наступному розділі.