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
相关推荐
Nimsolax8 小时前
Linux网络传输层协议UDP
linux·网络·udp
维尔切8 小时前
Kafka 概述与安装部署整理
运维·分布式·kafka
dlhto8 小时前
Oracle Linux 9 的 MySQL 8.0 完整安装与远程连接配置
linux·mysql·oracle
AcrelGHP9 小时前
光储充微电网能量管理系统:构建绿色、高效、安全的能源未来
大数据·运维·人工智能
缘的猿9 小时前
kubectl 学习心得:从入门到实践的 K8s 命令行掌控之旅
云原生·容器·kubernetes
阿里云云原生10 小时前
用户说“App 卡死了”,你却查不到原因?可能是监控方式错了
云原生
带土111 小时前
3. vim上手
linux·编辑器·vim
prettyxian11 小时前
【linux】基础开发工具(2)vim
linux·vim