helm3中的流程控制语句主要包括条件判断语句(if else)、作用域控制语句(with)、循环控制语句(range)。
一、helm3的流程控制语句
1. if/else语句
if/else语句用于条件判断,通过不同的条件设置完成不同的功能。
语法
bash
{{- if 条件1 }}
....
{{- else if 条件2 }}
....
{{- else }}
....
{{- end }}
示例
创建values.yaml文件
yml
[root@k8s-master m1]# cat chart5/values.yaml
replics: 3
container_name: nginx
container_port: 80
ingress:
enabled: true
创建templates/configmap.yaml文件
yml
[root@k8s-master m1]# cat chart5/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}
data:
{{- if .Values.ingress.enabled }}
ingress: "正在配置ingress..."
replicCount: {{ .Values.replics }}
containerName: {{ .Values.container_name }}
containerPort: {{ .Values.container_port }}
{{- else }}
ingress: "不配置ingress..."
{{- end }}
部署chart
yml
# Source: chart5/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: chart5
data:
ingress: "正在配置ingress..."
replicCount: 3
containerName: nginx
containerPort: 80
2.with语句
with语句用来改变当前的作用域,避免重复书写冗余的前缀
语法
bash
{{- with 嵌套对象 }} # 比如.Values.config就是嵌套对象
...
{{- end }}
在整个with语句的范围内,所有的嵌套对象都不需要再加相同的前缀。直接用.表示了之前的.Values.config对象。
示例
创建values.yaml文件
yml
[root@k8s-master m1]# cat chart5/values.yaml
config:
database:
username: "user01"
password: "123456"
port: 3306
创建templates/configmap.yaml文件
yml
[root@k8s-master m1]# cat chart5/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}
data:
{{- with .Values.config.database }}
username: {{ .username }} # .表示.Values.config.database对象
password: {{ .password | b64enc}}
port: {{ .port }}
{{- end }}
部署chart
yml
# Source: chart5/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: chart5
data:
username: user01
password: MTIzNDU2
port: 3306
3.range语句
range语句循环遍历集合并输出,range遍历对象时,在range语句的作用域内,由于指定了对象,后续以.表示
语法
yml
{{- range 要遍历的对象 }}
....
{{-end }}
示例
创建一个对象
yml
[root@master m1]# cat chart1/values.yaml
# 定义一个数组
people:
- sex
- age
- height
- hobby
创建一个yaml文件
bash
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}
data:
people: |- # |- 表示后续为一个多行的字符串
{{- range .Values.people }}
- {{ . }} # .表示values.yaml文件中的people对象,循环遍历people对象的内容,即sex,age...
{{- end }}
{{ range (list "aa" "bb" "cc") }}
- {{ . }} # .指列表,aa,bb,cc
{{- end }}
~
运行查看结果
yml
# Source: chart1/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: chart1
data:
people: |-
- sex
- age
- height
- hobby
- aa
- bb
- cc
二、helm3中变量的使用
helm3中变量的使用包括**变量的定义和变量的使用。**通过在with语句和range语句中引入变量,可以简化编码内容。
1. 变量的定义
语法
其中变量的值可以是对象,列表,字典等。
yml
$ 变量名 := 变量值
示例
在yml文件中分别给变量赋值字符串,列表和字典
yml
data:
{{- $variable1 := "aaa" }}
{{- $variable2 := list "aaa" "bb" "cc" }}
{{- $variable3 := dict "key1" "aa" "key2" "bb" }}
value1: {{ $variable1 }}
value2: {{ $variable2 | quote }}
value3: {{ $variable3 | quote }}
# 输出
data:
value1: aaa
value2: "[aaa bb cc]"
value3: "map[key1:aa key2:bb]"
2.变量解决对象作用域的问题
在with语句中,由于通过{``{- with 对象 }}指定了对象的作用域,导致with语句的作用范围内,无法调用父级别的对象,通过引入变量可以解决该问题。在with语句外,将父级别的对象赋值给变量,然后再with语句内调用变量。
示例
在该yml文件中,
.Release.Name为父级别的对象,无法直接在with语句中调用,会报错。通过name变量在with语句外进行赋值,然后再调用
yml
[root@k8s-master m1]# cat chart5/values.yaml
config:
database:
username: "user01"
password: "123456"
port: 3306
[root@k8s-master m1]# cat chart5/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}
data:
{{- $name := .Release.Name }}
{{- with .Values.config.database }}
username: {{ .username }}
password: {{ .password }}
port: {{ .port }}
name: {{ $name }}
{{- end }}
输出结果
yml
# Source: chart5/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: chart5
data:
username: user01
password: 123456
port: 3306
name: chart5
3.变量在列表或元组中的使用
通过range循环遍历列表或元组,变量可以获取到列表中每个元素的索引和值。
示例
在values.yaml中定义一个列表
yml
[root@k8s-master m1]# cat chart5/values.yaml
database:
- username
- password
- port
在templates/configmap.yaml中通过index和database变量分别获取索引和值
yml
[root@k8s-master m1]# cat chart5/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}
data:
database: |-
{{- range $index,$database := .Values.database }}
{{ $index }}:{{ $database }}
{{- end }}
输出结果
yml
# Source: chart5/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: chart5
data:
database: |-
0:username
1:password
2:port
4.变量在字典中的使用
通过range语句循环遍历字典,变量可以获取到字典中每个键值对的key和value值。
示例
在values.yaml中定义一个字典database
yml
[root@k8s-master m1]# cat chart5/values.yaml
config:
database:
username: "user01"
password: "123456"
port: 3306
在templates/configmap.yaml中通过key和database变量分别获取索引和值
yml
[root@k8s-master m1]# vim chart5/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}
data:
database: |-
{{- range $key,$database := .Values.config.database }}
{{ $key }}:{{ $database }}
{{- end }}
输出结果
bash
# Source: chart5/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: chart5
data:
database: |-
password:123456
port:3306
username:user01