控制結(jié)構(gòu)(模板說(shuō)法中稱為“動(dòng)作”)提供了控制模板生成流程的能力。Helm的模板語(yǔ)言提供了以下控制結(jié)構(gòu):
if/ else用于創(chuàng)建條件塊
with 指定范圍
range垢乙,它提供了一個(gè)“for each”風(fēng)格的循環(huán)
if else
示例:
{{ if PIPELINE }}
# Do something
{{ else if OTHER PIPELINE }}
# Do something else
{{ else }}
# Default case
{{ end }}
值為false 的情況,(其他為true)
一個(gè)布爾型的假
一個(gè)數(shù)字零
一個(gè)空的字符串
一個(gè)nil(空或null)
一個(gè)空的集合(map蓖租,slice,tuple蓖宦,dict,array)
ConfigMap 示例
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {{ .Values.favorite.drink | default "tea" | quote }}
food: {{ .Values.favorite.food | upper | quote }}
{{ if eq .Values.favorite.drink "coffee" }}mug: true{{ end }}
if 這種條件語(yǔ)句稠茂,會(huì)在原文處形成空行。這個(gè)時(shí)候,可以在 {{ }}的左右側(cè)添加 ‘-’ 來(lái)刪除空格和換行睬关。
注意 ‘-’和其他指令中間有空格才會(huì)生效。
{{- 會(huì)刪除左側(cè)空格和換行电爹,
-}} 也類似
所以當(dāng)這樣寫的時(shí)候:
food: "pizza"
{{- if eq .Values.favorite.drink "coffee" -}}
mug: true
{{- end -}}
最后就會(huì)變成:
food: "pizza"mug:true
所以 -}} 這個(gè)使用的時(shí)候要小心。
也可以使用indent 函數(shù)摇邦,indent 2 表示縮進(jìn)兩個(gè)字符
{{indent 2 "mug:true"}}
with
with 相當(dāng)于聲明一下當(dāng)前的變量上下文屎勘,有點(diǎn)類似于相對(duì)路徑的參照路徑。
示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
{{- with .Values.favorite }}
drink: {{ .drink | default "tea" | quote }}
food: {{ .food | upper | quote }}
release: {{ .Release.Name }}「攀#這里報(bào)錯(cuò)
{{- end }}
{{- with .Values.favorite }} 和{{- end }} 之間的部分,context 被改為.Values.favorite瓤摧。所以可以直接引用 .drink,而再引用 .Release 則會(huì)報(bào)錯(cuò)照弥。
range
遍歷其后的參數(shù),類似go的range
假設(shè) values.yaml 這樣寫:
favorite:
drink: coffee
food: pizza
pizzaToppings:
- mushrooms
- cheese
- peppers
- onions
則在yaml文件內(nèi)可以這樣循環(huán):
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
toppings: |-
{{- range .Values.pizzaToppings }}
- {{ . | title | quote }}
{{- end }}
即循環(huán) .Values.pizzaToppings 的值集
結(jié)果會(huì)是這樣的:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: edgy-dragonfly-configmap
data:
toppings: |- 〔怼8一幔 聲明多行字符串
- "Mushrooms"
- "Cheese"
- "Peppers"
- "Onions"
YAML中的|-標(biāo)記表示一個(gè)多行字符串。還可用于在清單中嵌入大塊數(shù)據(jù)鸥昏。
除了list和tuple之外塞俱,range還可以用于遍歷具有鍵和值的集合(如map 或 dict)障涯。
變量
這是 with 那里的那個(gè)錯(cuò)誤示例:
{{- with .Values.favorite }}
drink: {{ .drink | default "tea" | quote }}
food: {{ .food | upper | quote }}
release: {{ .Release.Name }}
{{- end }}
利用變量,將其改正:
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 }}
變量在循環(huán)中的使用:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
{{- range $key, $val := .Values.favorite }}
{{ $key }}: {{ $val | quote }}
{{- end}}
結(jié)果:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: eager-rabbit-configmap
data:
myvalue: "Hello World"
drink: "coffee"
food: "pizza"
變量的作用域,跟寫代碼時(shí)候的作用域一致。
此外都弹,有一個(gè)全局變量: $
.Release.name
$.Release.name
一般情況下匙姜,這兩個(gè)的效果是一樣的; 不過(guò)氮昧,在with作用域內(nèi),前者可能會(huì)失效霸琴,后者不會(huì)昭伸。