helm-chart4,流程控制和变量

控制结构(模板说法中称为“动作”)提供了控制模板生成流程的能力。Helm的模板语言提供了以下控制结构:

if/ else用于创建条件块
with 指定范围
range,它提供了一个“for each”风格的循环

if else

示例:

{{ if PIPELINE }}
# Do something
{{ else if OTHER PIPELINE }}
# Do something else
{{ else }}
# Default case

值为false 的情况,(其他为true)

一个布尔型的假
一个数字零
一个空的字符串
一个nil(空或null)
一个空的集合(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 这种条件语句,会在原文处形成空行。这个时候,可以在 {{ }}的左右侧添加 ‘-’ 来删除空格和换行。

注意 ‘-’和其他指令中间有空格才会生效。
{{- 会删除左侧空格和换行,
-}} 也类似

所以当这样写的时候:

food: "pizza"
{{- if eq .Values.favorite.drink "coffee" -}}
mug: true

最后就会变成:

food: "pizza"mug:true

所以 -}} 这个使用的时候要小心。

也可以使用indent 函数,indent 2 表示缩进两个字符

{{indent 2 "mug:true"}}

with

with 相当于声明一下当前的变量上下文,有点类似于相对路径的参照路径。

示例:

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 }} #这里报错

{{- with .Values.favorite }} 和{{- end }} 之间的部分,context 被改为.Values.favorite。所以可以直接引用 .drink,而再引用 .Release 则会报错。

range

遍历其后的参数,类似go的range

假设 values.yaml 这样写:

favorite:
drink: coffee
food: pizza
pizzaToppings:
- mushrooms
- cheese
- peppers
- onions

则在yaml文件内可以这样循环:

apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
toppings: |-
{{- range .Values.pizzaToppings }}
- {{ . | title | quote }}

即循环 .Values.pizzaToppings 的值集

结果会是这样的:

Source: mychart/templates/configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
name: edgy-dragonfly-configmap
data:
toppings: |-  # 声明多行字符串
- "Mushrooms"
- "Cheese"
- "Peppers"
- "Onions"

YAML中的|-标记表示一个多行字符串。还可用于在清单中嵌入大块数据。

除了list和tuple之外,range还可以用于遍历具有键和值的集合(如map 或 dict)。

变量

这是 with 那里的那个错误示例:

{{- with .Values.favorite }}
drink: {{ .drink | default "tea" | quote }}
food: {{ .food | upper | quote }}
release: {{ .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 }} #变量引用

变量在循环中的使用:

apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
{{- range $key, $val := .Values.favorite }}
{{ $key }}: {{ $val | quote }}

结果:

Source: mychart/templates/configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
name: eager-rabbit-configmap
data:
myvalue: "Hello World"
drink: "coffee"
food: "pizza"

变量的作用域,跟写代码时候的作用域一致。
 
此外,有一个全局变量: $

.Release.name
$.Release.name

一般情况下,这两个的效果是一样的; 不过,在with作用域内,前者可能会失效,后者不会。

posted @ 2018-08-27 09:17  名白  阅读(1126)  评论(0)    收藏  举报