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 还可以用于遍历具有键和值的集合(如mapdict)。当在下一节我们介绍模板变量时,将看到如何做到这一点。

[!TIP|style:flat] 在 with 中访问 .Release.Chart 以及 include 模板时,可以通过 $ 来访问变量,详情访问 变量

Copyright © 温玉 2021 | 浙ICP备2020032454号 all right reserved,powered by Gitbook该文件修订时间: 2022-01-08 03:09:47

results matching ""

    No results matching ""