變數
掌握了函式、管道、物件和控制結構後,我們可以轉向許多程式語言中更基本的概念:變數。在範本中,它們的使用頻率較低。但我們將看到如何使用它們來簡化程式碼,以及更好地利用 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:
# Many helm templates would use `.` below, but that will not work,
# however `$` will work here
app.kubernetes.io/name: {{ template "fullname" $ }}
# I cannot reference .Chart.Name, but I can do $.Chart.Name
helm.sh/chart: "{{ $.Chart.Name }}-{{ $.Chart.Version }}"
app.kubernetes.io/instance: "{{ $.Release.Name }}"
# Value from appVersion in 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 範本語言的強大功能之一是它能夠聲明多個範本並一起使用它們。我們將在下一節中討論這個問題。