k8s的包管理工具helm3--流程控制语句和变量(3)

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
相关推荐
阿里云云原生28 分钟前
深入内核:拆解 OpenTelemetry eBPF 探针如何优雅地“透视”多语言微服务?
云原生
大树881 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠1 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质1 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush41 小时前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5202 小时前
Linux 11 动态监控指令top
linux
小宇宙Zz2 小时前
Maven依赖冲突
java·服务器·maven
Inhand陈工2 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智3 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
不会C语言的男孩3 小时前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言