1. range 循环
许多编程语言都支持使用 for
循环,foreach
循环或类似的功能机制进行循环。在 Helm 的模板语言中,遍历集合的方式是使用 range
操作。
首先,让我们在我们的 values.yaml
文件中添加一份披萨配料列表:
favorite:
drink: coffee
food: pizza
pizzaToppings:
- mushrooms
- cheese
- peppers
- onions
现在我们有一个列表(模板中称为 slice)pizzaToppings。我们可以修改我们的模板,将这个列表打印到我们的 ConfigMap 中:
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 }}
{{- end }}
toppings: |-
{{- range .Values.pizzaToppings }}
- {{ . | title | quote }}
{{- end }}
让我们仔细看看 toppings
:list。该 range 函数将遍历 pizzaToppings 列表。但现在发生了一些有趣的事. 就像 with
sets 的范围 .
,range
操作子也是一样。每次通过循环时,.
都设置为当前比萨饼顶部。也就是第一次 .
设定 mushrooms。第二个迭代它设置为 cheese
,依此类推。
我们可以直接向管道发送 .
的值,所以当我们这样做时 {{ . | title | quote }}
,它会发送 .
到 title(标题 case 函数),然后发送到 quote
。如果我们运行这个模板,输出将是:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: edgy-dragonfly-configmap
data:
myvalue: "Hello World"
drink: "coffee"
food: "PIZZA"
toppings: |-
- "Mushrooms"
- "Cheese"
- "Peppers"
- "Onions"
现在,在这个例子中,我们碰到了一些棘手的事情。该 toppings: |-
行声明了一个多行字符串。所以我们的 toppings list 实际上不是 YAML 清单。这是一个很大的字符串。我们为什么要这样做?因为 ConfigMaps 中的数据 data
由键 / 值对组成,其中键和值都是简单的字符串。要理解这种情况,请查看 Kubernetes ConfigMap 文档.。但对我们来说,这个细节并不重要。
[!TIP|style:flat] YAML 中的
|-
标记表示一个多行字符串。这可以是一种有用的技术,用于在清单中嵌入大块数据,如此处所示。
有时能快速在模板中创建一个列表,然后遍历该列表是很有用的。Helm 模板有一个功能可以使这个变得简单:tuple
。在计算机科学中,元组是类固定大小的列表类集合,但是具有任意数据类型。这粗略地表达了 tuple 的使用方式。
sizes: |-
{{- range tuple "small" "medium" "large" }}
- {{ . }}
{{- end }}
sizes: |-
- small
- medium
- large
除了 list 和 tuple 之外,range
还可以用于遍历具有键和值的集合(如map
或 dict
)。当在下一节我们介绍模板变量时,将看到如何做到这一点。
[!TIP|style:flat] 在
with
中访问.Release
、.Chart
以及include
模板时,可以通过$
来访问变量,详情访问 变量