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