首页 > 其他分享 >第四章.helm3内置函数详解

第四章.helm3内置函数详解

时间:2023-03-09 16:24:26浏览次数:44  
标签:返回 configmap helm3 内置 函数 mychart yaml 详解 字符串

一.helm3的内置函数简单介绍

1.常用的helm3内置函数
(1).quote 或 squote函数
(2). upper 和 lower 函数
(3). repeat 函数
(4). default 函数
(5). lookup 函数


2.函数的使用格式
 格式1: 函数名 arg1 arg2 ...,  然而在实际的使用中,我们更偏向于使用管道符 | 来将参数传递给函数
 格式2: arg1 | 函数名          这样使用可以使结构看起来更加直观,并且可以方便使用多个函数对数据进行链式处理。


3.各内置函数使用的演示
1).环境准备 k8s集群
# kubectl get node
NAME   STATUS   ROLES                  AGE    VERSION
m1     Ready    control-plane,master   252d   v1.20.4
m2     Ready    control-plane,master   252d   v1.20.4
m3     Ready    control-plane,master   252d   v1.20.4
n1     Ready    <none>                 251d   v1.20.4

2).创建一个chart包       (用helm3发布创建一个configmap,创建的k8s集群中,发布其他应用也一样)
# helm create mychart       #创建一个chart包,chart包名为: mychart      
# cd mychart/
# ls
charts  Chart.yaml  templates  values.yaml
# cd templates/
# ls
deployment.yaml  _helpers.tpl  hpa.yaml  ingress.yaml  NOTES.txt  serviceaccount.yaml  service.yaml  tests
# rm -rf *                     #全部删除

3).编写自己需要的yaml文件,使用上面的各个内置函数演示
(1). quote和squote函数        通过向quote或squote函数中传递一个参数,即可为这个参数(调用的变量值)添加一个双引号(quote)或单引号(squote)
# vim /root/mychart/values.yaml       #定义变量和赋值
name: test
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件,调用values.yaml的变量,并使用相应函数加双引号或单引号
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:
  value1: {{ quote .Values.name }}   #调用的变量值添加一个双引号(quote)
  value2: {{ squote .Values.name }}  #调用的变量值添加一个单引号(squote)
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
NAME: myconfigmap1
LAST DEPLOYED: Sat Nov 26 11:23:56 2022
NAMESPACE: default
STATUS: pending-install
REVISION: 1
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  value1: "test"   #调用的变量值添加一个双引号(quote)
  value2: 'test'   #调用的变量值添加一个单引号(squote)
函数的使用格式:
 通过前面的示例可以看到,函数的用法是: 函数名 arg1 arg2 ...,然而在实际的使用中,我们更偏向于使用管道符 | 来将参数传递给函数
 也就是这种格式:arg1 | 函数名   这样使用可以使结构看起来更加直观,并且可以方便使用多个函数对数据进行链式处理。
使用格式2演示:(效果一样)
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件,调用values.yaml的变量,并使用相应函数加双引号或单引号
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:                 
  value1: {{ .Values.name | quote }}   #调用的变量值添加一个双引号(quote)
  value2: {{ .Values.name | squote }}  #调用的变量值添加一个单引号(squote)
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
NAME: myconfigmap1
LAST DEPLOYED: Sat Nov 26 11:33:42 2022
NAMESPACE: default
STATUS: pending-install
REVISION: 1
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  value1: "test"   #调用的变量值添加一个双引号(quote)
  value2: 'test'    #调用的变量值添加一个单引号(squote)

(2). upper 和 lower 函数        使用 upper 和 lower 函数可以分别将字符串转换为大写(upper)和小写字母(lower)的样式
# vim /root/mychart/values.yaml       #定义变量和赋值
name1: test
name2: TEST
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件,调用values.yaml的变量,并使用相应函数
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:                 
  value1: {{ .Values.name1 | upper | quote }}   #调用的变量值,转成大写(upper)且添加一个双引号(quote)
  value2: {{ .Values.name2 | lower | squote }}  #调用的变量值,转成小写(lower)且添加一个单引号(squote)
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
NAME: myconfigmap1
LAST DEPLOYED: Sat Nov 26 11:41:43 2022
NAMESPACE: default
STATUS: pending-install
REVISION: 1
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  value1: "TEST"   #调用的变量值,转成大写(upper)且添加一个双引号(quote)
  value2: 'test'      #调用的变量值,转成小写(lower)且添加一个单引号(squote)

(3). repeat 函数         使用repeat 函数可以将指定字符串重复输出指定的次数,repeat 函数可以带有一个参数,用于设置重复多少次。
# vim /root/mychart/values.yaml       #定义变量和赋值
name1: test
name2: TEST
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件,调用values.yaml的变量,并使用相应函数
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:                 
  value1: {{ .Values.name1 | repeat 3 | quote }}    #调用的变量值,输出重复3次且添加一个双引号(quote)
  value2: {{ .Values.name2 | repeat 2 | squote }}   #调用的变量值,输出重复2次且添加一个单引号(squote)
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
NAME: myconfigmap1
LAST DEPLOYED: Sat Nov 26 11:50:43 2022
NAMESPACE: default
STATUS: pending-install
REVISION: 1
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  value1: "testtesttest"    #调用的变量值,输出重复3次且添加一个双引号(quote)
  value2: 'TESTTEST'       #调用的变量值,输出重复2次且添加一个单引号(squote)
  
(4). default 函数         使用default函数指定一个默认值,这样当引入的值不存在时,就可以使用这个默认值
# vim /root/mychart/values.yaml       #定义变量和赋值
name1: test
name2: TEST
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件,调用values.yaml的变量,并使用相应函数
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:
  value1: {{ .Values.location | default "beijing" | quote }}    #调用的变量值,引用的变量location不存在时使用定义的默认值且添加一个双引号(quote)
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
NAME: myconfigmap1
LAST DEPLOYED: Sat Nov 26 11:57:57 2022
NAMESPACE: default
STATUS: pending-install
REVISION: 1
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  value1: "beijing"    #调用的变量值,引用的值不存在时使用定义的默认值且添加一个双引号(quote)

(5). lookup 函数         使用lookup 函数用于在当前的k8s集群中获取一些资源的信息,功能有些类似于 kubectl get ...
函数的格式如下:  
lookup "apiVersion" "kind" "namespace" "name"   其中"namespace"和"name" 都是可选的,或可以指定为空字符串"",函数执行完成后会返回特定的资源
常用格式和kubect命令相互对应关系:
kubectl命令	                                   lookup 函数
kubectl get pod mypod -n mynamespace	              lookup "v1" "Pod" "mynamespace" "mypod"
kubectl get pods -n mynamespace	                          lookup "v1" "Pod" "mynamespace" ""
kubectl get pods --all-namespaces	                          lookup "v1" "Pod" "" ""
kubectl get namespace mynamespace	                  lookup "v1" "Namespace" "" "mynamespace"
kubectl get namespaces                                          lookup "v1" "Namespace" "" "" 
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件,调用values.yaml的变量,并使用相应函数
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:                 
  value1: {{ lookup "v1" "Namespace" "" ""  | quote }}    #相当于: kubectl get namespaces,并加上双引号(quote ) 
# helm install myconfigmap1 ./mychart/        #需要安装后才能查看到相应信息
# helm get manifest myconfigmap1    #安装成功后,用helm get manifest release名 命令可以查看已经发布到k8s中的release信息
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  value1: "map[apiVersion:v1 items:[map[apiVersion:v1 kind:Namespace metadata:map[creationTimestamp:2022-03-18T15:53:41Z managedFields:[map[apiVersion:v1 fieldsType:FieldsV1 fieldsV1:map[f:status:map[f:phase:map[]]] manager:kube-apiserver operation:Update time:2022-03-18T15:53:41Z]] name:default resourceVersion:191 uid:70c41e0d-bd8b-4c5e-b6c2-ee685bb2490a] spec:map[finalizers:[kubernetes]] status:map[phase:Active]] map[apiVersion:v1 kind:Namespace metadata:map[creationTimestamp:2022-03-18T15:53:39Z managedFields:[map[apiVersion:v1 fieldsType:FieldsV1 fieldsV1:map[f:status:map[f:phase:map[]]] manager:kube-apiserver operation:Update time:2022-03-18T15:53:39Z]] name:kube-node-lease resourceVersion:19 uid:c1881771-e7ba-4073-a932-6dd9318f7f54] spec:map[finalizers:[kubernetes]] status:map[phase:Active]] map[apiVersion:v1 kind:Namespace metadata:map[creationTimestamp:2022-03-18T15:53:39Z managedFields:[map[apiVersion:v1 fieldsType:FieldsV1 fieldsV1:map[f:status:map[f:phase:map[]]] manager:kube-apiserver operation:Update time:2022-03-18T15:53:39Z]] name:kube-public resourceVersion:16 uid:84dac68e-0478-403a-bcb1-1f69a3040fe2] spec:map[finalizers:[kubernetes]] status:map[phase:Active]] map[apiVersion:v1 kind:Namespace metadata:map[creationTimestamp:2022-03-18T15:53:39Z managedFields:[map[apiVersion:v1 fieldsType:FieldsV1 fieldsV1:map[f:status:map[f:phase:map[]]] manager:kube-apiserver operation:Update time:2022-03-18T15:53:39Z]] name:kube-system resourceVersion:5 uid:7bf52f03-8834-4f53-b2b2-0464d764e4a0] spec:map[finalizers:[kubernetes]] status:map[phase:Active]]] kind:NamespaceList metadata:map[resourceVersion:51991]]"    #相当于: kubectl get namespaces,并加上双引号(quote )
# helm uninstall myconfigmap1      #删除安装的release,清空环境

二、helm3的逻辑和流控制函数

1.常见的逻辑和流控制函数
eq:     用于判断两个参数是否相等,如果等于则为 true,不等于则为 false。
ne:     用于判断两个参数是否不相等,如果不等于则为 true,等于则为 false。
lt :         lt 函数用于判断第一个参数是否小于第二个参数,如果小于则为 true,如果大于则为 false。
le:      判断第一个参数是否小于等于第二个参数,如果成立则为 true,如果不成立则为 false。
gt:         gt 函数用于判断第一个参数是否大于第二个参数,如果大于则为 true,如果小于则为 false。
ge:     判断第一个参数是否大于等于第二个参数,如果成立则为 true,如果不成立则为 false。
and:    返回两个参数的逻辑与结果(布尔值),也就是说如果两个参数为真,则结果为 true。否认哪怕一个为假,则返回false
or:      判断两个参数的逻辑或的关系,两个参数中有一个为真,则为真。返回第一个不为空的参数或者是返回后一个参数
not:     用于对参数的布尔值取反,如果参数是正常参数(非空),正常为true,取反后就为false,参数是空的,正常是false,取反后是true
default: 用来设置一个默认值,在参数的值为空的情况下,则会使用默认值
empty:  用于判断给定值是否为空,如果为空则返回true
coalesce:用于扫描一个给定的列表,并返回第一个非空的值。
ternary: 接受两个参数和一个 test 值,如果test 的布尔值为 true,则返回第一个参数的值,如果test 的布尔值为false,则返回第二个参数的值


2.常用逻辑和流控制函数使用的演示
1).环境准备 k8s集群
# kubectl get node
NAME   STATUS   ROLES                  AGE    VERSION
m1     Ready    control-plane,master   252d   v1.20.4
m2     Ready    control-plane,master   252d   v1.20.4
m3     Ready    control-plane,master   252d   v1.20.4
n1     Ready    <none>                 251d   v1.20.4

2).创建一个chart包       (用helm3发布创建一个configmap,创建的k8s集群中,发布其他应用也一样)
# helm create mychart       #创建一个chart包,chart包名为: mychart      
# cd mychart/
# ls
charts  Chart.yaml  templates  values.yaml
# cd templates/
# ls
deployment.yaml  _helpers.tpl  hpa.yaml  ingress.yaml  NOTES.txt  serviceaccount.yaml  service.yaml  tests
# rm -rf *                     #全部删除

3).编写自己需要的yaml文件,使用上面的各个内置函数演示
(1). eq函数、ne函数        
分别含义如下:
eq函数:     用于判断两个参数是否相等,如果等于则为 true,不等于则为 false。
ne函数:     用于判断两个参数是否不相等,如果不等于则为 true,等于则为 false。
# vim /root/mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:
  value1: {{ eq 2 2 }}    #使用eq函数判断两个参数是否相等,相等返回true,不等返回false
  value2: {{ eq 2 1 }}    #使用eq函数判断两个参数是否相等,相等返回true,不等返回false
  value3: {{ ne 2 1 }}    #使用nq函数判断两个参数是否不相等,不相等返回true,相等则返回false
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  value1: true    #使用eq函数判断两个参数是否相等,相等返回true,不等返回false
  value2: false    #使用eq函数判断两个参数是否相等,相等返回true,不等返回false
  value3: true    #使用eq函数判断两个参数是否不相等,不相等返回true,相等则返回false

(2). lt函数、le函数、gt函数、ge函数        
分别含义如下:
lt :         lt 函数用于判断第一个参数是否小于第二个参数,如果小于则为 true,如果大于则为 false。
le:         le判断第一个参数是否小于等于第二个参数,如果成立则为 true,如果不成立则为 false。
gt:         gt函数用于判断第一个参数是否大于第二个参数,如果大于则为 true,如果小于则为 false。
ge:        ge判断第一个参数是否大于等于第二个参数,如果成立则为 true,如果不成立则为 false。
# vim /root/mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:
  value1: {{ lt 1 2 }}    #lt函数用于判断第一个参数是否小于第二个参数,如果小于则为true,如果大于则为false
  value2: {{ le 2 1 }}    #le判断第一个参数是否小于等于第二个参数,如果成立则为true,如果不成立则为false
  value3: {{ gt 1 2 }}    #gt函数用于判断第一个参数是否大于第二个参数,如果大于则为 true,如果小于则为false
  value4: {{ ge 2 2 }}    #ge判断第一个参数是否大于等于第二个参数,如果成立则为true,如果不成立则为false
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  value1: true    #lt函数用于判断第一个参数是否小于第二个参数,如果小于则为true,如果大于则为false
  value2: false    #le判断第一个参数是否小于等于第二个参数,如果成立则为true,如果不成立则为false
  value3: false    #gt函数用于判断第一个参数是否大于第二个参数,如果大于则为 true,如果小于则为false
  value4: true    #ge判断第一个参数是否大于等于第二个参数,如果成立则为true,如果不成立则为false

(3). and函数        如果两个参数都返回为真,则结果为true,否认哪怕一个为假,则返回false
# vim /root/mychart/values.yaml       #定义变量和赋值
name1: true
name2: false
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件,调用values.yaml的变量,并使用相应函数加双引号
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:                 
  value1: {{ and .Values.name1 .Values.name2  | quote }}    #如果两个参数都返回为真,则结果为true,否认哪怕一个为假,则返回false
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  value1: "false"    #如果两个参数都返回为真,则结果为true,否认哪怕一个为假,则返回false,并加上双引号(quote )
修改成两个都是true:
# vim /root/mychart/values.yaml       #定义变量和赋值
name1: true
name2: true
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件,调用values.yaml的变量,并使用相应函数加双引号或单引号
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:                 
  value1: {{ and .Values.name1 .Values.name2  | quote }}    #如果两个参数都返回为真,则结果为true,否认哪怕一个为假,则返回false,并加上双引号(quote ) 
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  value1: "true"    #如果两个参数都返回为真,则结果为true,否认哪怕一个为假,则返回false,并加上双引号(quote )

(4). or函数        判断两个参数的逻辑或的关系,两个参数中有一个为真,则为真,会返回第一个不为空的参数或者是返回后一个参数
什么是空类型?主要有以下几种:
整型:0
字符串: ""
列表: []
字典: {}
布尔: false
以及所有的nil (或 null)

# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件,并使用相应函数加双引号
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:                 
  value1: {{ or 1 "" 2 | quote }}    #返回1,返回第一个不为空的参数或者是返回后一个参数,并加上双引号(quote ) 
  value2: {{ or 1 2 "" | quote }}    #返回1,返回第一个不为空的参数或者是返回后一个参数,并加上双引号(quote ) 
  value3: {{ or "" 2 3 | quote }}    #返回2,返回第一个不为空的参数或者是返回后一个参数,并加上双引号(quote ) 
  value4: {{ or "" "" 3 | quote }}   #返回3,返回第一个不为空的参数或者是返回后一个参数,并加上双引号(quote ) 
  value5: {{ or "" "" "" | quote }}  #返回空,返回第一个不为空的参数或者是返回后一个参数,并加上双引号(quote ) 
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  value1: "1"    #返回1,返回第一个不为空的参数或者是返回后一个参数,并加上双引号(quote ) 
  value2: "1"    #返回1,返回第一个不为空的参数或者是返回后一个参数,并加上双引号(quote ) 
  value3: "2"    #返回2,返回第一个不为空的参数或者是返回后一个参数,并加上双引号(quote ) 
  value4: "3"   #返回3,返回第一个不为空的参数或者是返回后一个参数,并加上双引号(quote ) 
  value5: ""    #返回空,返回第一个不为空的参数或者是返回后一个参数,并加上双引号(quote )

(5). not函数        用于对参数的布尔值取反,如果参数是正常参数(非空),正常为true,取反后就为false,参数是空的,正常是false,取反后是true
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件,并使用相应函数加双引号
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:                 
  type1: {{ not 2 | quote }}     #用于对参数的布尔值取反,并加上双引号(quote ) 
  type2: {{ not "" | quote }}    #用于对参数的布尔值取反,并加上双引号(quote ) 
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  type1: "false"     #用于对参数的布尔值取反,并加上双引号(quote ) 
  type2: "true"     #用于对参数的布尔值取反,并加上双引号(quote )

(6). default 函数         使用default函数指定一个默认值,这样当引入的值不存在时,就可以使用这个默认值
# vim /root/mychart/values.yaml       #定义变量和赋值
name1: test
name2: TEST
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件,调用values.yaml的变量,并使用相应函数
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:
  value1: {{ .Values.address | default "bj" | quote }}    #调用的变量值,引用的变量location不存在时使用定义的默认值且添加一个双引号(quote)
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
NAME: myconfigmap1
LAST DEPLOYED: Sat Nov 26 11:57:57 2022
NAMESPACE: default
STATUS: pending-install
REVISION: 1
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  value1: "bj"    #调用的变量值,引用的值不存在时使用定义的默认值且添加一个双引号(quote)

(7). empty函数        用于判断给定值是否为空,如果为空则返回true,不为空返回false
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:
  type1: {{ 0 | empty }}       #用于判断给定值是否为空,如果为空则返回true,0是空值
  type2: {{ 1 | empty }}       #用于判断给定值是否为空,如果为空则返回true 
  type3: {{ "" | empty }}      #用于判断给定值是否为空,如果为空则返回true,""是空值
  type4: {{ false | empty }}   #用于判断给定值是否为空,如果为空则返回true,false是空值
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  type1: true        #用于判断给定值是否为空,如果为空则返回true
  type2: false       #用于判断给定值是否为空,如果为空则返回true 
  type3: true       #用于判断给定值是否为空,如果为空则返回true 
  type4: true       #用于判断给定值是否为空,如果为空则返回true

(8). coalesce函数        用于扫描一个给定的列表,并返回第一个非空的值
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:                 
  type1: {{ coalesce 0 1 2 }}                    #用于扫描一个给定的列表,并返回第一个非空的值
  type2: {{ coalesce "" false "Test" }}       #用于扫描一个给定的列表,并返回第一个非空的值
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  type1: 1                 #用于扫描一个给定的列表,并返回第一个非空的值
  type2: Test            #用于扫描一个给定的列表,并返回第一个非空的值

(9). ternary函数   接受两个参数和一个test 值,如果test 的布尔值为true,则返回第一个参数的值,如果test 的布尔值为false,则返回第二个参数的值
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:                 
  type1: {{ ternary "First" "Second" true }}   #接受两个参数和一个 test值,如果test的布尔值为true,则返回第一个参数的值
  type2: {{ ternary "First" "Second" false }}  #接受两个参数和一个 test值,如果test的布尔值为false,则返回第二个参数的值
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  type1: First      #接受两个参数和一个test值,如果test的布尔值为true,则返回第一个参数的值,如果test的布尔值为false,则返回第二个参数的值 
  type2: Second  #接受两个参数和一个test值,如果test的布尔值为true,则返回第一个参数的值,如果test的布尔值为false,则返回第二个参数的值

三、helm3的字符串函数

1.常用helm3的字符串函数
(1). print 和 println函数 
(2). printf函数
(3). trim函数、trimAll 函数、trimPrefix函数 和 trimSuffix函数
(4). lower函数、upper函数、title函数 和 untitle函数
(5). snakecase函数、camelcase函数 和 kebabcase函数
(6). swapcase函数
(7). substr函数
(8). trunc函数
(9). abbrev函数
(10). randAlphaNum函数、randAlpha函数、randNumeric函数 和 randAscii 函数
(11). contains函数 
(12). hasPrefix函数 和 hasSuffix函数 
(13).repeat函数、nospace函数 和 initials 函数
(14). wrapWith函数
(15). quote函数 和 squote 函数
(16). replace函数
(17). shuffle函数
(18). indent函数和 nindent函数
(19). plural 函数


2.常用helm3字符串函数使用的演示
1).环境准备 k8s集群
# kubectl get node
NAME   STATUS   ROLES                  AGE    VERSION
m1     Ready    control-plane,master   252d   v1.20.4
m2     Ready    control-plane,master   252d   v1.20.4
m3     Ready    control-plane,master   252d   v1.20.4
n1     Ready    <none>                 251d   v1.20.4

2).创建一个chart包       (用helm3发布创建一个configmap,创建的k8s集群中,发布其他应用也一样)
# helm create mychart       #创建一个chart包,chart包名为: mychart      
# cd mychart/
# ls
charts  Chart.yaml  templates  values.yaml
# cd templates/
# ls
deployment.yaml  _helpers.tpl  hpa.yaml  ingress.yaml  NOTES.txt  serviceaccount.yaml  service.yaml  tests
# rm -rf *                     #全部删除

3).编写自己需要的yaml文件,使用上面的各个内置函数演示
(1). print 和 println函数        print 和 println 函数用于将所有的参数按照字符串进行输出
 与print 不同的是,println 会在每个字符串后面添加一个空格,并且会在输出的末尾添加一个换行符。如果参数中包含非字符串类型,那么输出的时候会转成字符串类型。当相邻两个参数不是字符串时,会在它们中间添加一个空格
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:                 
  type1: {{ print "this is" "test" "message" }}  
  type2: {{ println "this is" "test" "message" }} 
  type3: {{ print "this is" 2 3 "message" }}       
  #print 和 println 函数用于将所有的参数按照字符串进行输出
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  type1: this istestmessage        #print打印出来的,不会在字符串之间添加空格
  type2: this is test message      
                                    #println打印出来的,会在字符串之间添加一个空格,且会多打印一个空行,println打印后会在最后添加一个换行符
  type3: this is2 3message         #print打印出来的,不会在字符串之间添加空格,和type1一样
  #print 和 println 函数用于将所有的参数按照字符串进行输出

(2). printf函数        用于格式化输出字符串内容,并且支持使用占位符。占位符取决于传入参数的类型。
printf 函数常用类型 - 整数
%b :二进制
%c :表示普通字符
%d :十进制
%o :8进制
%O :带0o前缀的8进制
%q :安全转义的单引号字符
%x :16进制,使用小写字符a-f
%X :16进制,使用小写字符A-F
%U :Unicode格式: U+1234; 和"U+%04X"相同

printf 函数常用类型 - 浮点数
%b :指数二次幂的无小数科学计数法,比如 -123456p-78
%e :科学计数法,比如: -1.234456e+78
%E :科学计数法,比如: -1.234456E+78
%f :无指数的小数,比如: 123.456
%F :与%f同义
%g :%e的大指数,否则是%f
%G :%E的大指数,否则是%F
%x :十六进制计数法(和两个指数的十进制幂),比如: -0x1.23abcp+20
%X :大写的十六进制计数法,比如: -0X1.23ABCP+20

printf 函数常用类型 - 字符串
%s :未解析的二进制字符串或切片
%q :安全转义的双引号字符串
%x :十六进制,小写,每个字节两个字符
%X :十六进制,大写,每个字节两个字符

printf 函数常用类型 - 布尔值
%t :输出指定的布尔值

# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:
  type1: {{ printf "the bollean is %t" true }}        #%t 布尔值占位符: 输出指定的布尔值
  type2: {{ printf "the str is %s" "strtest" }}       #%s 字符串占位符: 未解析的二进制字符串或切片
  type3: {{ printf "the num is %d" 18 }}              #%d 整数型占位符: 十进制
  type4: {{ printf "the float is %.2f" 3.123 }}       #%f 浮点数型占位符,保留两位小数
  #printf 用于格式化输出字符串内容,并且支持使用占位符
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  type1: the bollean is true    #%t 布尔值占位符: 输出指定的布尔值
  type2: the str is strtest       #%s 字符串占位符: 未解析的二进制字符串或切片
  type3: the num is 18          #%d 整数型占位符: 十进制
  type4: the float is 3.12       #%f 浮点数型占位符,保留两位小数
  #printf 用于格式化输出字符串内容,并且支持使用占位符

(3). trim函数、trimAll 函数、trimPrefix函数 和 trimSuffix函数
分别含义如下:
trim函数:       可以用来去除字符串两边的空格,示例:trim "   hello    "
trimAll函数:     用于移除字符串中指定的字符,示例:trimAll "$" "$5.00"
trimPrefix 和 trimSuffix 函数: 分别用于移除字符串中指定的前缀和后缀:示例1:trimPrefix "-" "-hello"   示例2:trimSuffix "+" "hello+"
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:                 
  data1: {{ trim " Test " }}                   #trim函数可以用来去除字符串两边的空格
  data2: {{ trimAll "%" "%Test" }}       #trimAll函数用于移除字符串中指定的字符,此处指定的字符为"%"
  data3: {{ trimPrefix "-" "-hello" }}     #trimPrefix函数用于移除字符串中指定的前缀,此处指定的前缀是:"-"
  data4: {{ trimSuffix "+" "hello+" }}   #trimSuffix函数用于移除字符串中指定的后缀,此处指定的后缀是:"+"
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  data1: Test       #trim函数可以用来去除字符串两边的空格
  data2: Test       #trimAll函数用于移除字符串中指定的字符
  data3: hello     #trimPrefix函数用于移除字符串中指定的前缀
  data4: hello     #trimSuffix函数用于移除字符串中指定的后缀

(4). lower函数、upper函数、title函数 和 untitle函数
分别含义如下:
lower函数:  用于将所有字母转换成小写,示例1:lower "HELLO"
upper函数:  用于将所有字母转换成大写,示例2:upper "hello"
title函数:   用于将首字母转换成大写,示例3:title "test"
untitle函数:   用于将大写的首字母转换成小写,示例4:untitle "Test"
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:                 
  data1: {{ lower "HELLO" }}   #lower函数用于将所有字母转换成小写
  data2: {{ upper "hello"  }}    #upper函数用于将所有字母转换成大写
  data3: {{ title "test" }}         #title函数用于将首字母转换成大写
  data4: {{ untitle "Test" }}     #untitle函数用于将大写的首字母转换成小写
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  data1: hello     #lower函数用于将所有字母转换成小写
  data2: HELLO  #upper函数用于将所有字母转换成大写
  data3: Test     #title函数用于将首字母转换成大写
  data4: test     #untitle函数用于将大写的首字母转换成小写

(5). snakecase函数、camelcase函数 和 kebabcase函数
分别含义如下:
snakecase函数: 用于将驼峰写法转换为下划线命名写法, 示例:snakecase "UserName"	# 返回结果 user_name
camelcase函数: 用于将下划线命名写法转换为驼峰写法,示例:camelcase "user_name"	# 返回结果 UserName
kebabcase函数: 用于将驼峰写法转换为中横线写法,示例:kebabcase "UserName"	# 返回结果 user-name
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:
  data1: {{ snakecase "UserName" }}   #snakecase函数,用于将驼峰写法转换为下划线命名写法,返回结果 user_name
  data2: {{ camelcase "user_name" }}  #camelcase函数,用于将下划线命名写法转换为驼峰写法,返回结果 UserName
  data3: {{ kebabcase "UserName" }}   #kebabcase函数,用于将驼峰写法转换为中横线写法,返回结果 user-name
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  data1: user_name   #snakecase函数,用于将驼峰写法转换为下划线命名写法,返回结果 user_name
  data2: UserName    #camelcase函数,用于将下划线命名写法转换为驼峰写法,返回结果 UserName
  data3: user-name   #kebabcase函数,用于将驼峰写法转换为中横线写法,返回结果 user-name

(6). swapcase函数        作用是基于内置的算法来切换字符串的大小写
算法规则如下:
a).大写字符变成小写字母
b).首字母变成小写字母
c).空格后或开头的小写字母转换成大写字母
d).其他小写字母转换成大写字母
示例:swapcase "This Is A.Test"   # 返回结果:"tHIS iS a.tEST"
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:
  data1: {{ swapcase "This Is A.Test" }}   #作用是基于内置的算法来切换字符串的大小写,返回结果:"tHIS iS a.tEST"
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  data1: tHIS iS a.tEST   #作用是基于内置的算法来切换字符串的大小写,返回结果:"tHIS iS a.tEST"

(7). substr函数        用于切割字符串(指定切割起、始位置),并且返回切割后的字串
该函数需要指定三个参数:
start (int):起始位置,索引位置从0开始
end (int):结束位置,索引位置从0开始
string (string):需要切割的字符串
示例:substr 3 5 "message"	   #返回结果 "sa"
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:                 
  data1: {{ substr 3 5 "message" }}   #substr函数用于切割字符串,起始位置:3,结束位置:5,并且返回切割后的字串,返回结果"sa"
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  data1: sa   #substr函数用于切割字符串,起始位置:3,结束位置:5,并且返回切割后的字串,返回结果"sa"

(8). trunc函数        用于截断字符串。trunc 可以使用正整数或负整数来分别表示从左向右截取的个数和从右向左截取的个数
示例:trunc 5 "Hello World"   # 返回结果:"Hello"
示例:trunc -5 "Hello World"   # 返回结果:"World"
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:                 
  data1: {{ trunc 5 "Hello World" }}   #函数用于截断字符串,从左向右截取5个,返回结果:"Hello"
  data2: {{ trunc -5 "Hello World" }}   #函数用于截断字符串,从右向左截取5个,返回结果:"World"
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  data1: Hello   #函数用于截断字符串,从左向右截取5个,返回结果:"Hello"
  data2: World   #函数用于截断字符串,从右向左截取5个,返回结果:"World"

(9). abbrev函数     作用是使用省略号(...)切割字符串,保留指定的长度,注意省略号的长度是3个。其中省略号也是计算在长度之内的。
例如要将一个字符串保留长度为5,那么字符的个数只有两个,剩下三个是省略号。
示例:abbrev 5 "Hello World"   # 返回结果:"He..."
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:
  data1: {{ abbrev 5 "Hello World" }}   #使用省略号(...)切割字符串,保留指定的长度,注意省略号的长度是3个,此处保留5个长度,结果:He...
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  data1: He...   #使用省略号(...)切割字符串,保留指定的长度,注意省略号的长度是3个,此处保留5个长度,结果:He...

(10). randAlphaNum函数、randAlpha函数、randNumeric函数 和 randAscii 函数    用于生成加密的随机字符串,指定生成的字符串长度(生成几个长度)
分别含义如下:
这四个函数用于生成加密的随机字符串,但是有如下区别:
randAlphaNum: 使用 0-9a-zA-Z,生成随机字符串
randAlpha:     使用 a-zA-Z,生成随机字符串
randNumeric:   使用 0-9,生成随机字符串
randAscii:      使用所有的可使用的 ASCII 字符,生成随机字符串
注意: 
每个函数都需要传递一个参数用于指定生成的字符串长度:   示例:randNumeric 3
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:                 
  data1: {{ randAlphaNum 10 }}  #randAlphaNum函数:使用 0-9a-zA-Z,生成随机字符串
  data2: {{ randAlpha 10 }}        #randAlpha函数:   使用 a-zA-Z,生成随机字符串
  data3: {{ randNumeric 10 }}    #randNumeric函数: 使用 0-9,生成随机字符串
  data4: {{ randAscii 10 }}         #randAscii函数:   使用所有的可使用的 ASCII 字符,生成随机字符串
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  data1: Sg3P8PwYNw  #randAlphaNum函数:使用 0-9a-zA-Z,生成随机字符串
  data2: aZaGlBFjIF      #randAlpha函数:    使用 a-zA-Z,生成随机字符串
  data3: 4065269165    #randNumeric函数: 使用 0-9,生成随机字符串
  data4: r'~WV3d.z=     #randAscii函数:   使用所有的可使用的 ASCII 字符,生成随机字符串

(11). contains函数     用于测试一个字符串是否包含在另一个字符串里面,返回布尔值,true或false,包含返回true,不包含返回false
示例:contains "llo" "Hello"   #  结果返回 true
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:
  data1: {{ contains "llo" "Hello" }}  #用于测试一个字符串是否包含在另一个字符串里面,返回布尔值,true或false,结果:true
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  data1: true  #用于测试一个字符串是否包含在另一个字符串里面,返回布尔值,true或false,包含在里面,结果:true

(12). hasPrefix函数 和 hasSuffix函数  这两个函数用于测试一个字符串是否是指定字符串的前缀或者后缀,返回布尔值,true或false,包含返回true,不包含返回false
示例:hasPrefix "He" "Hello"	 # 判断前缀,是前缀,结果返回 true
示例:hasSuffix "le" "Hello"	 # 判断后缀,不是后缀,结果返回 false
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:                 
  data1: {{ hasPrefix "He" "Hello" }}  #测试一个字符串是否是指定字符串的前缀,返回布尔值,true或false,结果:true
  data2: {{ hasSuffix "le" "Hello" }}   #测试一个字符串是否是指定字符串的后缀,返回布尔值,true或false,结果:false
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  data1: true   #测试一个字符串是否是指定字符串的前缀,返回布尔值,true或false,是前缀,结果:true
  data2: false  #测试一个字符串是否是指定字符串的后缀,返回布尔值,true或false,不是后缀,结果:false

(13).repeat函数、nospace函数 和 initials 函数
分别含义如下:
repeat函数用于将字符串重复输出指定的次数                        示例:repeat 3 "Hello"     #  结果返回 HelloHelloHello
nospace函数用于去掉字符串中所有的空格                          示例:nospace "T e s t"	  # 返回 Test
initials函数用于截取指定字符串的每个单词的首字母,并拼接在一起    示例:initials "People Like Peace"  # 返回 PLP
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:                 
  data1: {{ repeat 3 "Hello" }}   #repeat函数用于将字符串重复输出指定的次数,结果: HelloHelloHello
  data2: {{ nospace "T e s t" }}  #nospace函数用于去掉字符串中所有的空格
  data3: {{ initials "People Like Peace" }}  #initials函数用于截取指定字符串的每个单词的首字母,并拼接在一起,结果:PLP
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  data1: HelloHelloHello   #repeat函数用于将字符串重复输出指定的次数,结果: HelloHelloHello
  data2: Test                   #nospace函数用于去掉字符串中所有的空格
  data3: PLP                    #initials函数用于截取指定字符串的每个单词的首字母,并拼接在一起,结果:PLP

(14). wrapWith函数   作用是在文档中在指定的列数添加内容,例如添加内容: "\t" 
示例:wrapWith 5 "\t" "HelloWorld", 会在第五个索引的位置添加"\t",所以结果为:"Hello	World"
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:                 
  data1: {{ wrapWith 5 "\t" "HelloWorld" }}   #会在第五个索引的位置添加"\t",所以结果为:"Hello World"
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  data1: Hello	World   #会在第五个索引的位置添加"\t",所以结果为:"Hello World"

(15). quote函数 和 squote 函数   该函数将字符串用双引号(quote) 或者单引号(squote)括起来
示例:quote hello        示例:squote hello
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:
  data1: {{ hello | quote }}   #该函数将字符串用双引号(quote)括起来,结果: "hello"
  data2: {{ hello | squote }}  #该函数将字符串用单引号(squote)括起来,结果: 'hello'
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  data1: "Hello!"   #该函数将字符串用双引号(quote)括起来,结果: "hello"
  data2: 'Hello!'   #该函数将字符串用单引号(squote)括起来,结果: 'hello'

(14). cat 函数   用于将多个字符串合并成一个字符串,并使用空格分隔开
示例:cat "Hello" "World" , 结果: Hello World
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:
  data1: {{ cat "Hello" "World" }}  #cat函数用于将多个字符串合并成一个字符串,并使用空格分隔开,结果: Hello World
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  data1: Hello World  #cat函数用于将多个字符串合并成一个字符串,并使用空格分隔开,结果: Hello World

(16). replace函数   用于执行简单的字符串替换。该函数需要传递三个参数:待替换的字符串、将要替换的字符串、源字符串
第1个参数: 待替换的字符串
第2个参数: 将要替换的字符串
第3个参数: 源字符串
示例:"I Am Test" | replace " " "-"   # 返回结果:I-Am-Test
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:
  data1: {{ "I Am Test" | replace " " "-" }}  #执行简单的字符串替换.该函数需要传递三个参数:待替换的字符串、将要替换的字符串、源字符串,结果:I-Am-Test
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  data1: I-Am-Test  #执行简单的字符串替换.该函数需要传递三个参数:待替换的字符串、将要替换的字符串、源字符串,结果:I-Am-Test

(17). shuffle函数   用于对字符串中的字符进行重新排序,是基于他内部的一个算法
示例:shuffle "Hello"
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:
  data1: {{ shuffle "Hello" }}  #用于对字符串中的字符进行重新排序
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  data1: Helol  #用于对字符串中的字符进行重新排序

(18). indent函数和 nindent函数   用于以指定长度来缩进指定字符串的所在行。其中nindent 函数可以在缩进时在字符串开头添加新行。
示例:indent 4 "this is indent"
示例:nindent 4 "this is nindent"  
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:                 
  data1: |                                            #定义多行字符串时候用|
    {{ nindent 4 "this is nindent" }}      
    {{ indent 4 "this is indent" }}   
#indent函数 和 nindent函数,用法一样,都是用于以指定的长度缩进来缩进指定字符串的所在行。
#区别是: nindent函数可以在缩进时在字符串开头添加新行,也就是在该行字符串上方会添加一行新的空行。
#注意:上面两各都有两部分缩进,{{前面已经手动缩进了4个字符,后面又指定了4个字符的缩进,结果:应该有8个字符缩进),indent是8个字符
#但是由于nindent会在缩进时在字符串开头添加新行,也就是在该行字符串上方会添加一行新的空行,然后另起一行,所有另起的结果还是缩进4个字符
#一般为了防止麻烦,一般indent和nindent所在行都顶格写最好。
#注意:执行报错,将注释删掉,重新执行
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  data1: |
                  #一个新的空行
    this is nindent                  #另开一行,还是缩进4个字符
        this is indent                #原来的行,共缩进8个字符
  
(19). plural 函数  判断字符串的长度,并且根据长度返回不同的值.如:字符串的长度为1会返回plural 函数的第一个参数,若不是1则返回第二个参数(包括0)
示例:len "a" | plural "one" "many"		# 结果返回 one
示例:len "abc" | plrual "one" "many"		# 结果返回 many  
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:
  data1: {{ len "a" | plural "one" "many" }}     #字符串长度为1,返回第1个参数,结果返回one 
  data2: {{ len "abc" | plural "one" "many" }}  #字符串长度不为1,返回第2个参数,结果返回many
  data3: {{ len "" | plural "one" "many" }}       #字符串长度不为1(为0),返回第2个参数,结果返回many
#字符串的长度为1会返回plural函数的第一个参数,如果不是1则返回第二个参数(包括0)
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  data1: one        #字符串长度为1,返回第1个参数,结果返回one 
  data2: many     #字符串长度不为1,返回第2个参数,结果返回many
  data3: many     #字符串长度不为1(为0),返回第2个参数,结果返回many
#字符串的长度为1会返回plural函数的第一个参数,如果不是1则返回第二个参数(包括0)

四、helm3的类型转换和正则表达式函数

1.常用helm3的类型转换函数和正则表达式函数
类型转换函数:(常用的有下面标演示的)
atoi函数:      将字符串转换为整型
float64函数:   转换成 float64 类型
int函数:       转换为 int 类型
toString函数:  转换成字符串
int64函数:       转换成 int64 类型
toDecimal函数:  将 unix 八进制转换成 int64
toStrings函数:   将列表、切片或数组转换成字符串列表
toJson函数 (mustToJson):            将列表、切片、数组、字典或对象转换成JSON
toPrettyJson函数 (mustToPrettyJson): 将列表、切片、数组、字典或对象转换成格式化JSON
toRawJson函数(mustToRawJson):     将列表、切片、数组、字典或对象转换成JSON(HTML字符不转义)

正则表达式函数:
regexFind函数 和 mustRegexFind函数
regexFindAll函数 和 mustRegexFindAll函数
regexMatch函数 和 mustRegexMatch函数
regexReplaceAll函数 和 mustRegexReplaceAll函数
regexReplaceAllLiteral函数 和 mustRegexReplaceAllLiteral函数
regexSplit函数 和 mustRegexSplit函数

2.常用helm3的类型转换函数和正则表达式函数使用的演示
1).环境准备 k8s集群
# kubectl get node
NAME   STATUS   ROLES                  AGE    VERSION
m1     Ready    control-plane,master   252d   v1.20.4
m2     Ready    control-plane,master   252d   v1.20.4
m3     Ready    control-plane,master   252d   v1.20.4
n1     Ready    <none>                 251d   v1.20.4

2).创建一个chart包       (用helm3发布创建一个configmap,创建的k8s集群中,发布其他应用也一样)
# helm create mychart       #创建一个chart包,chart包名为: mychart      
# cd mychart/
# ls
charts  Chart.yaml  templates  values.yaml
# cd templates/
# ls
deployment.yaml  _helpers.tpl  hpa.yaml  ingress.yaml  NOTES.txt  serviceaccount.yaml  service.yaml  tests
# rm -rf *                     #全部删除

3).编写自己需要的yaml文件,使用上面的各个内置函数演示
(1). atoi函数、float64函数、int函数 和 toString函数
分别含义如下:
atoi函数:      将字符串转换为整型
float64函数:   转换成 float64 类型
int函数:       转换为 int 类型
toString函数:  转换成字符串
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:                 
  data01: {{ "16" | kindOf }}          #转换前查看是啥类型,字符串
  data02: {{ 16 | kindOf }}             #转换前查看是啥类型,int整数类型
  data1: {{ atoi "16" | kindOf }}      #atoi函数是将字符串转换为整型,kindOf函数可以判断传入的这个参数的类型是什么,结果由字符串转成了整型
  data2: {{ float64 "16.0" | kindOf }} #float64函数是转换成float64类型,kindOf函数可以判断传入的这个参数的类型是什么,结果由字符串转成了float64类型
  data3: {{ int "16" | kindOf }}          #int函数是将字符串转换为整型,kindOf函数可以判断传入的这个参数的类型是什么,结果由字符串转成了整型
  data4: {{ toString 16 | kindOf }}  #toString函数是将字符串转换为字符串类型,kindOf函数可以判断传入的这个参数的类型是什么,结果由字符串转成了字符串
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  data01: string   #转换前查看是啥类型,字符串
  data02: int      #转换前查看是啥类型,int整数类型
  data1: int        #atoi函数是将字符串转换为整型,kindOf函数可以判断传入的这个参数的类型是什么,结果由字符串转成了整型
  data2: float64 #float64函数是转换成float64类型,kindOf函数可以判断传入的这个参数的类型是什么,结果由字符串转成了float64类型
  data3: int       #int函数是将字符串转换为整型,kindOf函数可以判断传入的这个参数的类型是什么,结果由字符串转成了整型
  data4: string  #toString函数是将字符串转换为字符串类型,kindOf函数可以判断传入的这个参数的类型是什么,结果由字符串转成了字符串
  
(2). regexMatch函数 和 mustRegexMatch函数
分别含义如下:
regexMatch函数 和 mustRegexMatch函数  用于根据指定的正则来匹配字符串,如果匹配成功则返回true.                    
                                       如果表达式有问题,regexMatch会直接抛出错误,mustRegexMatch会向模板引擎返回错误。
示例:regexMatch "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$" "[email protected]"   #正则表达式是一个邮箱地址的格式,能匹配到,返回:true
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:                 
  data1: {{ regexMatch "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$" "[email protected]" }}           #正则表达式是邮箱格式,能匹配到,结果返回:true
  data2: {{ mustRegexMatch "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$" "[email protected]" }}    #正则表达式是邮箱格式,能匹配到,结果返回:true
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:                 
  data1: true        #正则表达式是邮箱格式,能匹配到,结果返回:true
  data2: true        #正则表达式是邮箱格式,能匹配到,结果返回:true

(3). regexFindAll函数 和 mustRegexFindAll函数
分别含义如下:
用于获取字符串中匹配正则表达式的所有子字符串内容,并且在该函数的最后指定一个整型来表示返回多少个正则匹配的字符串。-1 代表返回所有正则匹配的结果
示例:regexFindAll "[2,4,6,8]" "123456789" 3
示例:regexFindAll "[2,4,6,8]" "123456789" -1
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:
  data1: {{ regexFindAll "[2,4,6,8]" "123456789" 3 | quote }}          #在给的字符串中,匹配正则表达式的所有子字符串内容,并指定返回3个字符串,加双引号quote
  data2: {{ regexFindAll "[2,4,6,8]" "123456789" -1 | quote }}         #在给的字符串中,匹配正则表达式的所有子字符串内容,-1代表返回所有正则匹配的结果
  data3: {{ mustRegexFindAll "[2,4,6,8]" "123456789" 3 | quote }}  #在给的字符串中,匹配正则表达式的所有子字符串内容,并指定返回3个字符串,加双引号quote
  data4: {{ mustRegexFindAll "[2,4,6,8]" "123456789" -1 | quote }} #在给的字符串中,匹配正则表达式的所有子字符串内容,-1代表返回所有正则匹配的结果
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:
  data1: "[2 4 6]"     #在给的字符串中,匹配正则表达式的所有子字符串内容,并指定返回3个字符串,加双引号quote
  data2: "[2 4 6 8]"  #在给的字符串中,匹配正则表达式的所有子字符串内容,-1代表返回所有正则匹配的结果
  data3: "[2 4 6]"     #在给的字符串中,匹配正则表达式的所有子字符串内容,并指定返回3个字符串,加双引号quote
  data4: "[2 4 6 8]"  #在给的字符串中,匹配正则表达式的所有子字符串内容,-1代表返回所有正则匹配的结果

(4).regexFind函数 和 mustRegexFind函数        根据正则匹配查找匹配的内容,都是用于获取字符串中第一个匹配正则表达式的结果(从左至右)
示例:{{ regexFind "[a-zA-Z][1-9]" "abcd1234c1" }}            {{ mustRegexFind "[a-zA-Z][1-9]" "abcd1234c1" }}
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:
  data1: {{ regexFind "[a-zA-Z][1-9]" "abcd1234c1" }}          #都是用于获取字符串中第一个匹配正则表达式的子串(从左至右)
  data2: {{ mustRegexFind "[a-zA-Z][1-9]" "abcd1234c1" }}  #都是用于获取字符串中第一个匹配正则表达式的子串(从左至右)
  #上面两个的正则含义:都是 匹配字母和数字想连的第一个结果:就是d1
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:
  data1: d1      #都是用于获取字符串中第一个匹配正则表达式的子串(从左至右)正则含义: 匹配字母和数字想连的第一个结果:就是d1
  data2: d1      #都是用于获取字符串中第一个匹配正则表达式的子串(从左至右)正则含义: 匹配字母和数字想连的第一个结果:就是d1

(5).regexReplaceAll函数 和 mustRegexReplaceAll函数  都是用指定的替换字符来串替换正则表达式匹配到的字符串
                                                  在替换字符串里面,$ 符号代表拓展符号,$1 代表正则表达式的第一个分组
示例:regexReplaceAll "a(x*)b" "-ab-axxb-" "${1}W"    #正则含义: a为前缀,b为后缀,中间有多个x 
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:
  data1: {{ regexReplaceAll "ab" "-ab-ab-axxb-" "W" }}          #将匹配到的正则形式的ab,替换成W
  data2: {{ regexReplaceAll "a(x*)b" "-ab-axxb-" "W" }}         #将匹配到的正则形式的:前缀为:a,后缀为b,中间n个x的(包括没有x的),都替换成W
  data3: {{ regexReplaceAll "a(x*)b" "-axb-axxb-" "W" }}       #将匹配到的正则形式的:前缀为:a,后缀为b,中间n个x的(包括没有x的),都替换成W
  data4: {{ regexReplaceAll "a(x*)b" "-ab-axxb-" "${1}W" }}  #$1代表正则表达式的第一个分组(第一个括号里的:(x*)),$1的值会保留,其他匹配到正则的都替换为W 
  data5: {{ mustRegexReplaceAll "ab" "-ab-ab-axxb-" "W" }}         #将匹配到的正则形式的ab,替换成W
  data6: {{ mustRegexReplaceAll "a(x*)b" "-ab-axxb-" "W" }}        #将匹配到的正则形式的:前缀为:a,后缀为b,中间n个x的(包括没有x的),都替换成W
  data7: {{ mustRegexReplaceAll "a(x*)b" "-axb-axxb-" "W" }}       #将匹配到的正则形式的:前缀为:a,后缀为b,中间n个x的(包括没有x的),都替换成W
  data8: {{ mustRegexReplaceAll "a(x*)b" "-ab-axxb-" "${1}W" }}  #$1代表正则表达式的第一个分组((x*)),$1的值会保留,其他匹配到正则的都替换为W 
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:
  data1: -W-W-axxb-     #将匹配到的正则形式的ab,替换成W
  data2: -W-W-             #将匹配到的正则形式的:前缀为:a,后缀为b,中间n个x的(包括没有x的),都替换成W
  data3: -W-W-            #将匹配到的正则形式的:前缀为:a,后缀为b,中间n个x的(包括没有x的),都替换成W
  data4: -W-xxW-         #$1代表正则表达式的第一个分组(第一个括号里的:(x*)),$1的值会保留,其他匹配到正则的都替换为W 
  data5: -W-W-axxb-    #将匹配到的正则形式的ab,替换成W
  data6: -W-W-           #将匹配到的正则形式的:前缀为:a,后缀为b,中间n个x的(包括没有x的),都替换成W
  data7: -W-W-           #将匹配到的正则形式的:前缀为:a,后缀为b,中间n个x的(包括没有x的),都替换成W
  data8: -W-xxW-       #$1代表正则表达式的第一个分组(第一个括号里的:(x*)),$1的值会保留,其他匹配到正则的都替换为W


(6).regexReplaceAllLiteral函数 和 mustRegexReplaceAllLiteral函数  将通过正则匹配到的内容,替换成其他内容
#regexReplaceAllLiteral 和 mustRegexReplaceAllLiteral函数的用法 和 regexReplaceAll函数/mustRegexReplaceAll函数 其实差不多
#不同的是: regexReplaceAllLiteral 和 mustRegexReplaceAllLiteral函数中不包括$拓展,也就是说会将$也视作字符串直接替换
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:
  data1: {{ regexReplaceAllLiteral "ab" "-ab-ab-axxb-" "W" }}         #将匹配到的正则形式的ab,替换成W
  data2: {{ regexReplaceAllLiteral "a(x*)b" "-ab-axxb-" "W" }}        #将匹配到的正则形式的:前缀为:a,后缀为b,中间n个x的(包括没有x的),都替换成W
  data3: {{ regexReplaceAllLiteral "a(x*)b" "-axb-axxb-" "W" }}       #将匹配到的正则形式的:前缀为:a,后缀为b,中间n个x的(包括没有x的),都替换成W
  data4: {{ regexReplaceAllLiteral "a(x*)b" "-ab-axxb-" "${1}W" }}  #第一个分组(第一个括号里的:(x*)),$1的值不会保留,匹配到正则的都替换为${1}W 
  data5: {{ mustRegexReplaceAllLiteral "ab" "-ab-ab-axxb-" "W" }}         #将匹配到的正则形式的ab,替换成W
  data6: {{ mustRegexReplaceAllLiteral "a(x*)b" "-ab-axxb-" "W" }}        #将匹配到的正则形式的:前缀为:a,后缀为b,中间n个x的(包括没有x的),都替换成W
  data7: {{ mustRegexReplaceAllLiteral "a(x*)b" "-axb-axxb-" "W" }}       #将匹配到的正则形式的:前缀为:a,后缀为b,中间n个x的(包括没有x的),都替换成W
  data8: {{ mustRegexReplaceAllLiteral "a(x*)b" "-ab-axxb-" "${1}W" }}  #第一个分组(第一个括号里的:(x*)),$1的值不会保留,匹配到正则的都替换为${1}W
#regexReplaceAllLiteral 和 mustRegexReplaceAllLiteral函数的用法 和 regexReplaceAll函数/mustRegexReplaceAll函数 其实差不多
#不同的是: regexReplaceAllLiteral 和 mustRegexReplaceAllLiteral函数中不包括$拓展,也就是说会将$也视作字符串直接替换 
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:
  data1: -W-W-axxb-           #将匹配到的正则形式的ab,替换成W
  data2: -W-W-                   #将匹配到的正则形式的:前缀为:a,后缀为b,中间n个x的(包括没有x的),都替换成W
  data3: -W-W-                  #将匹配到的正则形式的:前缀为:a,后缀为b,中间n个x的(包括没有x的),都替换成W
  data4: -${1}W-${1}W-    #$1代表正则表达式的第一个分组(第一个括号里的:(x*)),$1的值不会保留,匹配到正则的都替换为${1}W 
  data5: -W-W-axxb-          #将匹配到的正则形式的ab,替换成W
  data6: -W-W-                  #将匹配到的正则形式的:前缀为:a,后缀为b,中间n个x的(包括没有x的),都替换成W
  data7: -W-W-                 #将匹配到的正则形式的:前缀为:a,后缀为b,中间n个x的(包括没有x的),都替换成W
  data8: -${1}W-${1}W-   #$1代表正则表达式的第一个分组(第一个括号里的:(x*)),$1的值不会保留,匹配到正则的都替换为${1}W
#regexReplaceAllLiteral 和 mustRegexReplaceAllLiteral函数的用法 和 regexReplaceAll函数/mustRegexReplaceAll函数 其实差不多
#不同的是: regexReplaceAllLiteral 和 mustRegexReplaceAllLiteral函数中不包括$拓展,也就是说会将$也视作字符串直接替换

(7).regexSplit函数 和 mustRegexSplit函数  作用都是指定一个分隔符(以正则表达式匹配的内容为分隔符),将字符串进行切割,并返回切割后的字符串切片
                                        在函数的最后需要指定一个整型,来确定要返回的切片数量,-1 代表返回所有的切片       
示例:regexSplit "z+" "pizza" -1   #正则表达式含义: 可以匹配1-多个z, 匹配到正则的内容,
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:
  data1: {{ regexSplit "z+" "pizza" -1 | quote }}         #以正则表达式的内容为分隔符,即以zz为分隔符,默认返回的是数组,将双引号quote转成字符串类型
  data2: {{ mustRegexSplit "z+" "pizza" -1 |quote }}  #以正则表达式的内容为分隔符,即以zz为分隔符,默认返回的是数组,将双引号quote转成字符串类型
#表达式内容: 可以匹配1-多个z,即:zz
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:
  data1: "[pi a]"      #以正则表达式的内容为分隔符,表达式内容: 可以匹配1-多个z,即:zz,默认返回的是数组,将双引号quote转成字符串类型
  data2: "[pi a]"     #以正则表达式的内容为分隔符,表达式内容: 可以匹配1-多个z,即:zz,默认返回的是数组,将双引号quote转成字符串类型

五、helm3的加密函数和编码解码函数

1.常用helm3的加密函数和编码解码函数
helm提供了以下几种加密函数:
sha1sum 函数
sha256sum 函数
adler32sum 函数
htpasswd 函数
encryptAES 函数
decryptAES 函数

helm有以下编码和解码函数:
b64enc编码函数和b64dec解码函数:编码或解码 Base64
b32enc编码函数和b32dec解码函数:编码或解码 Base32


2.常用helm3的加密函数和编码解码函数使用的演示
1).环境准备 k8s集群
# kubectl get node
NAME   STATUS   ROLES                  AGE    VERSION
m1     Ready    control-plane,master   252d   v1.20.4
m2     Ready    control-plane,master   252d   v1.20.4
m3     Ready    control-plane,master   252d   v1.20.4
n1     Ready    <none>                 251d   v1.20.4

2).创建一个chart包       (用helm3发布创建一个configmap,创建的k8s集群中,发布其他应用也一样)
# helm create mychart       #创建一个chart包,chart包名为: mychart      
# cd mychart/
# ls
charts  Chart.yaml  templates  values.yaml
# cd templates/
# ls
deployment.yaml  _helpers.tpl  hpa.yaml  ingress.yaml  NOTES.txt  serviceaccount.yaml  service.yaml  tests
# rm -rf *                     #全部删除

3).编写自己需要的yaml文件,使用上面的各个内置函数演示
(1). sha1sum函数、sha256sum函数、adler32sum函数 和 htpasswd函数
分别含义如下:
sha1sum 函数:  用于计算字符串的SHA1值进行加密
sha256sum 函数:用于计算字符串的SHA256值进行加密
adler32sum 函数:用于计算字符串的Adler-32校验和进行加密
htpasswd 函数:  可以根据传入的username和password生成一个密码的bcrypt 哈希值,可以用于HTTP Server的基础认证
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:
  data1: {{ sha1sum "hello world" }}      #sha1sum函数:用于计算字符串的SHA1值进行加密
  data2: {{ sha256sum "hello world" }}    #sha256sum函数:用于计算字符串的SHA256值进行加密
  data3: {{ adler32sum "hello world" }}   #adler32sum函数:用于计算字符串的Adler-32校验和进行加密
  data4: {{ htpasswd "user1" "123456" }}  #htpasswd函数:可以根据传入的username和password生成一个密码的bcrypt 哈希值,可以用于HTTP Server的基础认证
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:
  data1: 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed      #sha1sum函数:用于计算字符串的SHA1值进行加密
  data2: b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9    #sha256sum函数:用于计算字符串的SHA256值进行加密
  data3: 436929629   #adler32sum函数:用于计算字符串的Adler-32校验和进行加密
  data4: user1:$2a$10$PWA5aXi1Qgtd6fb1/.34H.rC1cC16DRa6Yq7PD88we3ndQMaPo5t2  #htpasswd函数:可以根据传入的username和password生成一个密码的bcrypt 哈希值,可以用于HTTP Server的基础认证

(2). encryptAES加密函数 和 decryptAES解密函数
分别含义如下:
encryptAES 函数:是加密函数,使用AES-256 CBC 加密文本并返回一个base64编码字符串
decryptAES 函数:是解密函数,接收一个AES-256 CBC编码的字符串并返回解密文本
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:
  data1: {{ encryptAES "testkey" "hello" }}   #encryptAES是加密函数,传入两个参数,第一个是自定义了一个加密后的key名,后面是要加密的内容
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:
  data1: 2mFYH1h6bdkrGPN1P6nCMepc740w2MNEUMMfBvfimFg=   #encryptAES是加密函数,传入两个参数,前面:自定义了一个加密后的key名,后面:要加密的内容
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:
  data1: {{ decryptAES "testkey" "2mFYH1h6bdkrGPN1P6nCMepc740w2MNEUMMfBvfimFg=" }}   #解密,传两个参数,前:指定一个要解密的key名,后:要解密的内容
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:
  data1: hello   #decryptAES是解密函数,传入两个参数,前面:指定一个要解密的key名,后面:要解密的内容
  
(3). b64enc编码函数和b64dec解码函数  编写k8s的secret文件时候会用到
分别含义如下:
b64enc编码函数和b64dec解码函数:编码或解码 Base64
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:
  data1: {{ "test" | b64enc }}   #b64enc编码函数,将字符串编码为Base64
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:
  data1: dGVzdA==   #b64enc编码函数,将字符串编码为Base64
解密: b64dec
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:
  data1: {{ "dGVzdA==" | b64dec }}   #b64dec解码函数,将编码为Base64的内容解码
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:
  data1: test   #b64dec解码函数,将编码为Base64的内容解码

六、helm3的日期函数

1.常用的helm3的日期函数
now函数
date函数
dateInZone函数
duration函数和durationRound函数
unixEpoch函数
dateModify函数 和 mustDateModify函数
toDate函数 和 mustToDate函数


2.常用helm3的日期函数使用的演示
1).环境准备 k8s集群
# kubectl get node
NAME   STATUS   ROLES                  AGE    VERSION
m1     Ready    control-plane,master   252d   v1.20.4
m2     Ready    control-plane,master   252d   v1.20.4
m3     Ready    control-plane,master   252d   v1.20.4
n1     Ready    <none>                 251d   v1.20.4

2).创建一个chart包       (用helm3发布创建一个configmap,创建的k8s集群中,发布其他应用也一样)
# helm create mychart       #创建一个chart包,chart包名为: mychart      
# cd mychart/
# ls
charts  Chart.yaml  templates  values.yaml
# cd templates/
# ls
deployment.yaml  _helpers.tpl  hpa.yaml  ingress.yaml  NOTES.txt  serviceaccount.yaml  service.yaml  tests
# rm -rf *                     #全部删除

3).编写自己需要的yaml文件,使用上面的各个内置函数演示
(1). now函数、date函数、dateInZone函数、duration函数和durationRound函数
分别含义如下:
now函数:用于返回当前日期和时间,通常与其他日期函数共同使用
date函数:用于将日期信息进行格式化。date 函数后面需要指明日期的格式,这个格式内容必须使用"2006-01-02" 或 "02/01/2006" 来标明,否则会出错
          示例:now | date "2006-01-02"   或   now | date "02/01/2006"  注意: 格式内容必须是这两个示例的内容,内容换成其他日期都不行。
dateInZone函数:用法与date函数基本一致,只不过dataInZone函数可以指定时区返回时间,如:指定UTC时区返回时间
          示例:dateInZone "2006-01-02" (now) "UTC"  #指定UTC时区返回时间
duration函数:该函数可以将给定的秒数转换为golang 中的time.Duration类型,例如指定 95秒可以返回1m35s,秒数必须需要使用双引号,否则会返回 0s
          示例:duration "95"      #结果: 1m35s
durationRound函数:durationRound函数用于将给定的日期进行取整,保留最大的单位
     示例:durationRound "2h10m5s"  #结果: 2h      
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:
  data1: {{ now }}                                #now函数:用于返回当前日期和时间,通常与其他日期函数共同使用
  data2: {{ now | date "2006-01-02" }}  #date函数:用于将日期信息进行格式化,date函数后面需要指明日期的格式
                                                            #这个格式内容必须使用"2006-01-02"或"02/01/2006"来标明
  data3: {{ dateInZone "2006-01-02" (now) "UTC" }}  #dateInZone函数:用法与date函数基本一致,只不过dataInZone函数可以指定时区返回时间
  data4: {{ duration "95" }}            #该函数可将给定的秒数转换为golang中的time.Duration类型,如:指定95秒可返回1m35s,秒数必须需要使用双引号,否则会返回0s 
  data5: {{ durationRound "2h10m5s" }}     #结果:2h,durationRound函数用于将给定的日期进行取整,保留最大的单位 
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:
  data1: 2022-11-27 09:54:24.687563021 +0800 CST m=+0.083872699                      #now函数:用于返回当前日期和时间,通常与其他日期函数共同使用
  data2: 2022-11-27  #date函数:用于将日期信息进行格式化,date函数后面需要指明日期的格式,这个格式内容必须使用"2006-01-02"或"02/01/2006"来标明
  data3: 2022-11-27  #dateInZone函数:用法与 date函数基本一致,只不过dataInZone函数可以指定时区返回时间,如:指定UTC时区返回时间
  data4: 1m35s            #该函数可将给定的秒数转换为golang中的time.Duration类型,如:指定95秒可返回1m35s,秒数必须需要使用双引号,否则会返回0s 
  data5: 2h                  #结果:2h,durationRound函数用于将给定的日期进行取整,保留最大的单位

(2). unixEpoch函数、dateModify函数 和 mustDateModify函数、toDate函数 和 mustToDate函数
分别含义如下:
unixEpoch函数: 用于返回给定时间的时间戳格式
     示例:now | unixEpoch
dateModify和mustDateModify函数:这两个函数用于将一个给定的日期修改一定的时间,并返回修改后的时间
     区别是: 如果修改格式错误,dateModify会返回日期未定义.而mustDateModify会返回错误
     示例:now | date_modify "-2h"   #将当前的时间减去2h再返回
toDate函数和mustToDate函数:这两个函数都是用于将指定的字符串转换成日期,第一个参数需要指明要转成的日期格式,第二个参数需要传递要转换的字符串
     区别是:如果字符串无法转换,toDate函数就会返回0值。mustToDate 函数无法转换时会抛出错误
     示例: toDate "2006-01-02" "2017-12-31"
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  namespace: {{ .Release.Namespace }}
data:
  data1: {{ now | unixEpoch }}              #unixEpoch函数:用于返回给定时间的时间戳格式  
  data2: {{ now | date_modify "-2h" }}      #将当前的时间减去2h再返回
  data3: {{ now | mustDateModify "-2h" }}   #将当前的时间减去2h再返回
  date4: {{ toDate "2006-01-02" "2017-12-31" }}     #将后面的字符串以前面的格式进行转换输出
  date5: {{ mustToDate "2006-01-02" "2017-12-31" }} #将后面的字符串以前面的日期格式进行转换输出
#dateModify和mustDateModify函数:这两个函数用于将一个给定的日期修改一定的时间,并返回修改后的时间
#区别是: 如果修改格式错误,dateModify会返回日期未定义.而mustDateModify会返回错误
#toDate函数和mustToDate函数:这两个函数都是用于将字符串转换成日期,第一个参数需要指明要转成的日期格式,第二个参数需要传递要转换的日期字符串
#区别是:如果字符串无法转换,toDate函数就会返回0值。mustToDate 函数无法转换时会抛出错误
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
  namespace: default
data:
  data1: 1669515508              #unixEpoch函数:用于返回给定时间的时间戳格式  
  data2: 2022-11-27 08:18:28.334323828 +0800 CST m=-7199.918106493      #将当前的时间减去2h再返回
  data3: 2022-11-27 08:18:28.334381541 +0800 CST m=-7199.918048776      #将当前的时间减去2h再返回
  date4: 2017-12-31 00:00:00 +0800 CST     #将后面的字符串以前面的格式进行转换输出
  date5: 2017-12-31 00:00:00 +0800 CST    #将后面的字符串以前面的格式进行转换输出
#dateModify和mustDateModify函数:这两个函数用于将一个给定的日期修改一定的时间,并返回修改后的时间
#区别是: 如果修改格式错误,dateModify会返回日期未定义.而mustDateModify会返回错误
#toDate函数和mustToDate函数:这两个函数都是用于将字符串转换成日期,第一个参数需要指明要转成的日期格式,第二个参数需要传递要转换的日期字符串
#区别是:如果字符串无法转换,toDate函数就会返回0值。mustToDate 函数无法转换时会抛出错误

七、helm3的字典函数

1.常用的helm3的字典函数
(1).dict字典函数、get函数、set函数、unset函数
dict字典函数:  用于存储key/value键值对.其中字典的key必须是字符串,value可以是任何类型
get函数:    函数来获取定义字典myDict的值
set函数:    用于向已有的字典中添加新的键值对,也可修改原来键值对的值
unset函数:  用于删除字典中指定的key
(2).keys函数
(3).hasKey函数
(4).pluck函数
(5).merge函数 和 mustMerge函数
(6).mergeOverwrite函数 和 mustMergeOverwrite函数
(7).values函数
(8).pick函数 和 omit函数
(9).deepCopy函数 和 mustDeepCopy函数


2.常用helm3的字典函数使用的演示
1).环境准备 k8s集群
# kubectl get node
NAME   STATUS   ROLES                  AGE    VERSION
m1     Ready    control-plane,master   252d   v1.20.4
m2     Ready    control-plane,master   252d   v1.20.4
m3     Ready    control-plane,master   252d   v1.20.4
n1     Ready    <none>                 251d   v1.20.4

2).创建一个chart包       (用helm3发布创建一个configmap,创建的k8s集群中,发布其他应用也一样)
# helm create mychart       #创建一个chart包,chart包名为: mychart      
# cd mychart/
# ls
charts  Chart.yaml  templates  values.yaml
# cd templates/
# ls
deployment.yaml  _helpers.tpl  hpa.yaml  ingress.yaml  NOTES.txt  serviceaccount.yaml  service.yaml  tests
# rm -rf *                     #全部删除

3).编写自己需要的yaml文件,使用上面的各个内置函数演示
(1).dict字典函数、get函数、set函数、unset函数的使用演示
分别含义如下:
dict字典函数:  用于存储key/value键值对.其中字典的key必须是字符串,value可以是任何类型
get函数:    函数来获取定义字典myDict的值
set函数:    用于向已有的字典中添加新的键值对,也可修改原来键值对的值
unset函数:  用于删除字典中指定的key

(a).dict字典函数:
dict字典类型函数用于存储 key/value 键值对。其中字典的 key 必须是字符串,value 可以是任何类型,包括 dict 或 list (列表会在后面讲解)。
dict函数用于声明一个字典,并且可以将键值对列表传入初始化的字典中:
示例:$myDict := dict "name1" "value1" "name2" "value2" "name3" "value 3"
打印这个变量可以获取如下结果: map[name1:value1 name2:value2 name3:value 3]

(b).get函数:
 get 函数用于从一个映射(变量名)中根据 key 值获取对应的 value:
示例:get $myDict "name1"
如果该 key 不存在,或者 value 为空,则会返回"",不会抛出异常。

(c).set函数:
set 函数用于向已有的字典中添加新的键值对:
示例:set $myDict "name4" "value4"
set 函数执行完成后会返回一个字典,所以返回结果如下:
map[name1:value1 name2:value2 name3:value 3 name4:value4]
如果指定的 key 值已存在,那么会更新 key 的 value

(d).unset函数:
unset 函数用于删除字典中指定的 key:
示例:unset $myDict "name3"
unset 也会返回字典,所以结果如下:
map[name1:value1 name2:value2]
如果这个 key 没有找到,则会返回原字典,不会报错。

# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  {{- $myDict := dict "name1" "value1" "name2" "value2" "name3" "value3" }}
  data1: {{ $myDict }}
  data2: {{ get $myDict "name1" }}
  data3: {{ set $myDict "name4" "value4"}}
  data4: {{ get $myDict "name4" }}
  data5: {{ unset $myDict "name4" }}
#dict字典类型函数用于存储key/value键值对.其中字典的key必须是字符串,value可以是任何类型
#$myDict是声明变量的格式,后面会讲解.这里是将字典赋值给$myDict变量(相当于映射),下面$myDict是调用变量输出
#data2: 使用get函数来获取定义字典myDict的值,获取key是name1的值,结果是:value1
#data3: 使用set函数用于向已有的字典中添加新的键值对,也可修改原来键值对的值
#data4: 使用get函数来获取定义字典myDict的值,获取key是name4的值,结果是:value4
#data5: 使用unset函数来删除字典中指定的key
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
data:
  data1: map[name1:value1 name2:value2 name3:value3]
  data2: value1
  data3: map[name1:value1 name2:value2 name3:value3 name4:value4]
  data4: value4
  data5: map[name1:value1 name2:value2 name3:value3]
#dict字典类型函数用于存储key/value键值对.其中字典的key必须是字符串,value可以是任何类型
#$myDict是声明变量的格式,后面会讲解.这里是将字典赋值给$myDict变量(相当于映射),下面$myDict是调用变量输出
#data2: 使用get函数来获取定义字典myDict的值,获取key是name1的值,结果是:value1
#data3: 使用set函数用于向已有的字典中添加新的键值对,也可修改原来键值对的值
#data4: 使用get函数来获取定义字典myDict的值,获取key是name4的值,结果是:value4
#data5: 使用unset函数来删除字典中指定的key

(2).keys函数的使用演示
keys 函数用于获取一个或多个字典中所有的key 并返回一个列表。由于字典是无序的,所以每次返回的列表中key 的顺序也是会变化的。
在指定多个字典并且字典中存在相同key的时候,这些key 都会保存在列表中。       
列表内如果包含多个相同的key,并且是无序的。可以使用sortAlpha 函数对列表进行排序,再使用uniq函数去重。
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  {{- $myDict1 := dict "name1" "value1" "name2" "value2" }}
  {{- $myDict2 := dict "name1" "value1" "name3" "value3" }}
  {{- $myDict3 := dict "name1" "value1" "name4" "value4" }}
  data1: {{ keys $myDict1 $myDict2 $myDict3 | quote }}
  data2: {{ keys $myDict1 $myDict2 $myDict3 | sortAlpha | uniq | quote }}
#上面定义3个字典,下面使用keys函数获取多个字典中所有的key名,key名相同也获取,因为返回的是列表可能会报错,用quote函数加上双引号
#data2是在上面基础上用sortAlpha函数排序,再用uniq去重
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
data:
  data1: "[name1 name2 name1 name3 name1 name4]"
  data2: "[name1 name2 name3 name4]"
#上面定义3个字典,下面使用keys函数获取多个字典中所有的key名,key名相同也获取,因为返回的是列表可能会报错,用quote函数加上双引号
#data2是在上面基础上用sortAlpha函数排序,再用uniq去重

(3).hasKey函数的使用演示
 hasKey函数用于判断字典中是否包含指定的key,如果包含则返回 true,否则返回 false:
示例:hasKey $myDict "name4"
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  {{- $myDict1 := dict "name1" "value1" "name2" "value2" }}
  {{- $myDict2 := dict "name1" "value1" "name3" "value3" }}
  data1: {{ hasKey $myDict1 "name1" }}
  data2: {{ hasKey $myDict2 "name4" }}
#上面是定义两个字典
#使用haskey函数判断字典中是否包含后面指定的key,包含返回true,不包含返回false
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
data:
  data1: true
  data2: false
#上面是定义两个字典
#使用haskey函数判断字典中是否包含后面指定的key,包含返回true,不包含返回false

(4).pluck函数的使用演示
pluck 函数可以根据一个key在多个字典中时获得所有匹配的value,并返回一个value组成的列表。
如果key值在两个字典中都不存在,则会返回一个空列表。
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  {{- $myDict1 := dict "name1" "value1" "name2" "value2" }}
  {{- $myDict2 := dict "name1" "value2" "name3" "value3" }}
  data1: {{ pluck "name1" $myDict1 $myDict2 | quote }}
  data2: {{ pluck "name4" $myDict1 $myDict2 | quote }}
#上面两行是定义两个字典
#下面两行是用pluck函数根据一个key在多个字典中时获得所有匹配的value,并返回一个value组成的列表
#如果key值在两个字典中都不存在,则会返回一个空列表
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
data:
  data1: "[value1 value2]"
  data2: "[]"
#上面两行是定义两个字典
#下面两行是用pluck函数根据一个key在多个字典中时获得所有匹配的value,并返回一个value组成的列表
#如果key值在两个字典中都不存在,则会返回一个空列表

(5).merge函数 和 mustMerge函数的使用演示
两个函数都是用于合并两个或多个字典,由源字典向目标字典合并,如果目标字典中已经存在相同的key 值,则忽略源字典中对应的键值对,以目标字典为主。
如果源字典中的key没有包含在目标字典中,那么将对应的键值对合并到目标字典中。
使用 mustMerge 合并时,如果合并不成功会抛出错误。
merge 函数的使用格式如下:merge $destDict $sourceDict1 $sourceDict2	  # $destDict 是目标字典,把后面的所有字典都合并到第一个字典中
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  {{- $myDict1 := dict "name1" "value1" "name2" "value2" }}
  {{- $myDict2 := dict "name1" "value2" "name3" "value3" }}
  {{- $myDict3 := dict "name1" "value4" "name5" "value5" }}
  data1: {{ merge $myDict1 $myDict2 $myDict3 }}
  data1: {{ mustMerge $myDict1 $myDict2 $myDict3 }}
#上面两行是定义三个字典,下面是使用merge函数或mustMerge函数合并字典,第一个是目标字典,把后面的所有字典都合并到第一个字典中
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
data:
  data1: map[name1:value1 name2:value2 name3:value3 name5:value5]
  data1: map[name1:value1 name2:value2 name3:value3 name5:value5]
#上面两行是定义三个字典,下面是使用merge函数或mustMerge函数合并字典,第一个是目标字典,把后面的所有字典都合并到第一个字典中

(6).mergeOverwrite函数 和 mustMergeOverwrite函数的使用演示
这两个函数也是用来合并字典,但与merge函数不同的是,如果目标字典中存在与源字典中相同的key,那么目标字典中的key会被覆盖,
mustMergeOverwrite会返回错误,以防出现不成功的合并。
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  {{- $myDict1 := dict "name1" "value1" "name2" "value2" }}
  {{- $myDict2 := dict "name1" "value2" "name3" "value3" }}
  {{- $myDict3 := dict "name1" "value4" "name5" "value5" }}
  data1: {{ mergeOverwrite $myDict1 $myDict2 $myDict3 }}
  data1: {{ mustMergeOverwrite $myDict1 $myDict2 $myDict3 }}
#上面两行是定义三个字典,下面是使用mergeOverwrite函数或mustMergeOverwrite函数合并字典,第一个是目标字典,把后面的所有字典都合并到第一个字典中
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
data:
  data1: map[name1:value4 name2:value2 name3:value3 name5:value5]
  data1: map[name1:value4 name2:value2 name3:value3 name5:value5]
#上面两行是定义三个字典,下面是使用mergeOverwrite函数或mustMergeOverwrite函数合并字典,第一个是目标字典,把后面的所有字典都合并到第一个字典中

(7).values函数的使用演示
 values函数用于获取一个字典中所有的value值并返回一个列表,由于字典是无序的,所以返回的list 的内容也是无序的,如果需要排序和去重,可以使用sortAlpha 函数对 list 进行排序,再使用 uniq 函数去重。
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  {{- $myDict1 := dict "name1" "value1" "name2" "value2" "name3" "value3" }}
  data1: {{ values $myDict1 | quote }}
#上面定义一个字典,下面使用values函数获取一个字典中所有的value值并返回一个列表,由于字典是无序的,所以返回的list 的内容也是无序的
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
data:
  data1: "[value3 value1 value2]"
#上面定义一个字典,下面使用values函数获取一个字典中所有的value值并返回一个列表,由于字典是无序的,所以返回的list 的内容也是无序的

(8).pick函数 和 omit函数的使用演示
pick函数用于根据指定的字典和key值获取value,并将key和value 组成一个新的字典返回。
omit函数与pick 函数正好相反,该函数会将指定的key值忽略,获取的是未被指定的key和value(也就是取反),并返回一个新的字典。
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  {{- $myDict1 := dict "name1" "value1" "name2" "value2" "name3" "value3" }}
  data1: {{ pick $myDict1 "name1" "name2" }}
  data2: {{ omit $myDict1 "name1" "name2" }}
#上面定义一个字典,下面使用pick函数用于根据指定的字典和key值获取value,并将key和value 组成一个新的字典返回
#omit函数与pick函数正好相反,该函数会将指定的key值忽略,获取的是未被指定的key和value(也就是取反),并返回一个新的字典
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
data:
  data1: map[name1:value1 name2:value2]
  data2: map[name3:value3]
#上面定义一个字典,下面使用pick函数用于根据指定的字典和key值获取value,并将key和value 组成一个新的字典返回
#omit函数与pick函数正好相反,该函数会将指定的key值忽略,获取的是未被指定的key和value(也就是取反),并返回一个新的字典

(9).deepCopy函数 和 mustDeepCopy函数的使用演示
这两个函数都是用于深度拷贝一个字典并返回一个字典(也就是复制一个字典)
deepCopy有问题时会出错,而mustDeepCopy出错时,会返回一个错误给模板系统。
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  {{- $myDict1 := dict "name1" "value1" "name2" "value2" "name3" "value3" }}
  data1: {{ $myDict1 | deepCopy }}
  data2: {{ $myDict1 | mustDeepCopy }}
#这两个函数都是用于深度拷贝一个字典并返回一个字典(也就是复制一个字典)
#deepCopy有问题时会出错,而mustDeepCopy出错时,会返回一个错误给模板系统
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
data:
  data1: map[name1:value1 name2:value2 name3:value3]
  data2: map[name1:value1 name2:value2 name3:value3]
#这两个函数都是用于深度拷贝一个字典并返回一个字典(也就是复制一个字典)
#deepCopy有问题时会出错,而mustDeepCopy出错时,会返回一个错误给模板系统

八、helm3的列表函数

1.常用的helm3的列表函数
(1).list函数、first函数、rest函数、last函数、initial函数
(2).append函数、prepend函数、concat函数、reverse函数、uniq函数
(3).without函数、has函数、compact函数
(4).slice函数、until函数、untilStep函数、seq函数


2.常用helm3的列表函数使用的演示
1).环境准备 k8s集群
# kubectl get node
NAME   STATUS   ROLES                  AGE    VERSION
m1     Ready    control-plane,master   252d   v1.20.4
m2     Ready    control-plane,master   252d   v1.20.4
m3     Ready    control-plane,master   252d   v1.20.4
n1     Ready    <none>                 251d   v1.20.4

2).创建一个chart包       (用helm3发布创建一个configmap,创建的k8s集群中,发布其他应用也一样)
# helm create mychart       #创建一个chart包,chart包名为: mychart      
# cd mychart/
# ls
charts  Chart.yaml  templates  values.yaml
# cd templates/
# ls
deployment.yaml  _helpers.tpl  hpa.yaml  ingress.yaml  NOTES.txt  serviceaccount.yaml  service.yaml  tests
# rm -rf *                     #全部删除

3).编写自己需要的yaml文件,使用上面的各个内置函数演示
(1).list函数、first函数、rest函数、last函数、initial函数的使用演示
分别含义如下:
list函数:   list函数用于生成一个列表,传入的参数将会作为列表中的值,示例:$myList := list 1 2 3 "one" "two" "three"
first函数:  first函数用于获取列表的第一项, 示例:first $myList
rest函数:  rest函数用于获取列表中除第一项以外的所有内容,示例:rest $myList
last函数:  last函数用于获取列表的最后一项,示例:last $myList
initial函数:  initial函数会获取到列表中除最后一项以外的所有内容,与rest 正好相反,示例:initial $myList

# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  {{- $myList := list 1 2 3 "one" "two" "three" }}
  data1: {{ $myList | quote }}
  data2: {{ first $myList | quote }}
  data3: {{ rest $myList | quote }}
  data4: {{ last $myList | quote }}
  data5: {{ initial $myList | quote }}
#上面是定义一个列表,将后面的列表值赋值给前面的变量myList,形成一个列表
#下面data1是输出变量的值,即输出列表,并用quote函数加上双引号
#data2是使用first函数获取列表的第一项
#data3是使用rest函数获取列表中除第一项以外的所有内容
#data4是使用last函数获取列表的最后一项
#data5是使用initial函数获取除最后一项以外的所有内容
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
data:
  data1: "[1 2 3 one two three]"
  data2: "1"
  data3: "[2 3 one two three]"
  data4: "three"
  data5: "[1 2 3 one two]"
#上面是定义一个列表,将后面的列表值赋值给前面的变量myList,形成一个列表
#下面data1是输出变量的值,即输出列表,并用quote函数加上双引号
#data2是使用first函数获取列表的第一项
#data3是使用rest函数获取列表中除第一项以外的所有内容
#data4是使用last函数获取列表的最后一项
#data5是使用initial函数获取除最后一项以外的所有内容

(2).append函数、prepend函数、concat函数、reverse函数、uniq函数的使用演示
分别含义如下:
append函数: 用于在已有的列表中追加一项,并返回一个新的列表。原列表内容保持不变。格式:$newList = append $列表变量 要追加的内容
prepend函数:用于在列表的最前面加入一个新值,并返回一个新的列表,原列表内容不变。格式:$newList = prepend $列表变量 最前面加的值
concat函数: 用于将任意数量的列表合并成一个新的列表,原列表内容保持不变。格式:concat $原列表名 新列表1 新列表2 ...
                                                                        示例: concat $myList (list 100 101 102) (list a b c)
reverse函数:  用于反转一个列表,并返回一个新的列表。 示例:reverse $myList
uniq函数:  用于去除一个列表中的重复项,并返回一个新的列表:示例:list 1 1 2 2 3 3 | uniq
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  {{- $myList := list 1 2 3 "one" "two" "three" }}
  data1: {{ append $myList "apend_test" | quote }}
  data2: {{ prepend $myList "prenpend_test" | quote }}
  data3: {{ concat $myList (list 100 101 102) (list 200 201) | quote }}
  data4: {{ reverse $myList | quote }}
  data5: {{ list 1 1 2 2 3 3 | uniq | quote}}
#上面是定义一个列表,将后面的列表值赋值给前面的变量myList,形成一个列表
#data1是使用append函数用于在已有的列表中追加一项,并返回一个新的列表
#data2是使用prepend函数用于在列表的最前面加入一个新值,并返回一个新的列表
#data3是使用concat函数用于将任意数量的列表合并成一个新的列表
#data4是使用reverse函数反转一个列表,并返回一个新的列表
#data5是使用uniq函数用于去除一个列表中的重复项,并返回一个新的列表
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
data:
  data1: "[1 2 3 one two three apend_test]"
  data2: "[prenpend_test 1 2 3 one two three]"
  data3: "[1 2 3 one two three 100 101 102 200 201]"
  data4: "[three two one 3 2 1]"
  data5: "[1 2 3]"
#上面是定义一个列表,将后面的列表值赋值给前面的变量myList,形成一个列表
#data1是使用append函数用于在已有的列表中追加一项,并返回一个新的列表
#data2是使用prepend函数用于在列表的最前面加入一个新值,并返回一个新的列表
#data3是使用concat函数用于将任意数量的列表合并成一个新的列表
#data4是使用reverse函数反转一个列表,并返回一个新的列表
#data5是使用uniq函数用于去除一个列表中的重复项,并返回一个新的列表

(3).without函数、has函数、compact函数的使用演示
分别作用如下:
without函数: 用于过滤掉列表中的指定值(即:不要某某个值或多个值),并返回包含剩下值的列表:
                      示例:without (list 1 2 3 4) 3 (过滤掉3)   也可过滤掉多个值: 示例:without (list 1 2 3 4) 2 3 (过滤掉2 3)
has函数:用于判断一个值是否包含在列表中,如果包含返回 true,否则返回 false:
                     示例:has "hello" ( list 1 2 3 4 ) | quote
compact函数:用来删除一个列表中的空值,并返回一个新的列表:
                     示例:compact ( list 1 2 3 "" ) | quote
需要注意的是,空值不仅仅只是 "",在逻辑和流控制函数的部分,讲解 default 函数的时候提到过,空值包括:
 整型:0
 字符串: ""
 列表: []
 字典: {}
 布尔: false
 以及所有的nil (或 null)
所以如果列表中包含这些也会被 compact 函数给删除
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  data1: {{ without (list 1 2 3 4) 3 | quote }}
  data2: {{ without (list 1 2 3 4) 2 3 | quote }}
  data3: {{ has "hello" ( list 1 2 3 4 ) | quote }}
  data4: {{ has 2 ( list 1 2 3 4 ) | quote }}
  data5: {{ compact ( list 1 2 3 "" ) | quote }}
#quote是加一个双引号
#data1是使用without函数过滤掉一个值3,data2是过滤掉多个值2和3
#data3和data4是使用has函数判断一个值是否包含在列表中,如果包含返回true,否则返回false
#data5是使用compact函数删除一个列表中的空值
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
data:
  data1: "[1 2 4]"
  data2: "[1 4]"
  data3: "false"
  data4: "true"
  data5: "[1 2 3]"
#quote是加一个双引号
#data1是使用without函数过滤掉一个值3,data2是过滤掉多个值2和3
#data3和data4是使用has函数判断一个值是否包含在列表中,如果包含返回true,否则返回false
#data5是使用compact函数删除一个列表中的空值

(4).slice函数、until函数、untilStep函数、seq函数的使用演示
 slice函数: 用于对列表进行切片,命令格式为 slice list [n] [m],相当于 list[n:m]
       {{- $myList := list 1 2 3 4 5 }}
       slice $myList 返回 [1 2 3 4 5]。 等同于 myList[:],没有设置步长,返回所有
       slice $myList 3 返回 [4 5]等同于 myList[3:],从索引为3的位置进行切片
       slice $myList 1 3 返回 [2 3]等同于 myList[1:3],从索引为1的位置进行切片,切到索引3
       slice $myList 0 3 返回 [1 2 3]等同于 myList[:3],从索引为0的位置进行切片,切到索引3
until函数: 用于构建一个指定整数范围内的列表:示例:until 5
untilStep函数:与until 作用类似,不过可以定义整数的开始和步长:示例:untilStep 3 9 2    输出3-9之间的数字,切步长值为2
seq 函数:与linux 中的seq命令类似,用于生成指定范围内的整数。最多可以传递三个参数:
    单个参数 (结束位置) - 会生成所有从1到包含 end 的整数。
    多个参数 (开始, 结束) - 会生成所有包含start 和 end 的整数,递增或者递减。
    多个参数 (开始, 步长, 结束) - 会生成所有包含 start 和 end 按 step递增或递减的整数。
    示例:
      seq 5         => 1 2 3 4 5
      seq -3        => 1 0 -1 -2 -3
      seq 0 2       => 0 1 2
      seq 2 -2     => 2 1 0 -1 -2
      seq 0 2 10  => 0 2 4 6 8 10
      seq 0 -2 -5 => 0 -2 -4
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  {{- $myList := list 1 2 3 4 5 }}
  data1: {{ slice $myList | quote }}       #没有设置步长,返回所有
  data2: {{ slice $myList 3 | quote }}     #从索引为3的位置进行切片
  data3: {{ slice $myList 1 3 | quote }}   #从索引为1的位置进行切片,切到索引3
  data4: {{ slice $myList 0 3 | quote }}   #从索引为0的位置进行切片,切到索引3
  data5: {{ until 5 | quote }}   #until函数用于构建一个指定整数范围内的列表,构建5个整数范围的列表
  data6: {{ untilStep 3 9 2 | quote }}   #untilStep函数与until函数相似,不过可以定义整数的开始和步长, 输出3-9之间的数字,步长值为2
  data7: {{ seq 5 | quote }}    #单个参数,会生成所有从1到包含end的整数
  data8: {{ seq 0 2 | quote }}   #开始 结束 
  data9: {{ seq 0 2 10 | quote }}  #开始 步长 结束
#quote是加一个双引号,下面是使用slice函数对列表进行切片
#seq函数与linux中的seq命令类似,用于生成指定范围内的整数
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
data:
  data1: "[1 2 3 4 5]"       #没有设置步长,返回所有
  data2: "[4 5]"     #从索引为3的位置进行切片
  data3: "[2 3]"   #从索引为1的位置进行切片,切到索引3
  data4: "[1 2 3]"   #从索引为0的位置进行切片,切到索引3
  data5: "[0 1 2 3 4]"   #until函数用于构建一个指定整数范围内的列表,构建5个整数范围的列表
  data6: "[3 5 7]"   #untilStep函数与until函数相似,不过可以定义整数的开始和步长, 输出3-9之间的数字,步长值为2
  data7: "1 2 3 4 5"    #单个参数,会生成所有从1到包含end的整数
  data8: "0 1 2"   #开始 结束 
  data9: "0 2 4 6 8 10"  #开始 步长 结束
#quote是加一个双引号,下面是使用slice函数对列表进行切片
#seq函数与linux中的seq命令类似,用于生成指定范围内的整数

九、helm3的数学计算函数

1.常用helm3的数学计算函数
(1).add函数、sub函数、mul函数、div、mod、add1函数
(2).max函数、min函数、round函数、len函数、floor函数、ceil函数 


2.常用helm3的数学计算函数使用的演示
1).环境准备 k8s集群
# kubectl get node
NAME   STATUS   ROLES                  AGE    VERSION
m1     Ready    control-plane,master   252d   v1.20.4
m2     Ready    control-plane,master   252d   v1.20.4
m3     Ready    control-plane,master   252d   v1.20.4
n1     Ready    <none>                 251d   v1.20.4

2).创建一个chart包       (用helm3发布创建一个configmap,创建的k8s集群中,发布其他应用也一样)
# helm create mychart       #创建一个chart包,chart包名为: mychart      
# cd mychart/
# ls
charts  Chart.yaml  templates  values.yaml
# cd templates/
# ls
deployment.yaml  _helpers.tpl  hpa.yaml  ingress.yaml  NOTES.txt  serviceaccount.yaml  service.yaml  tests
# rm -rf *                     #全部删除

3).编写自己需要的yaml文件,使用上面的各个内置函数演示
(1).add函数、sub函数、mul函数、div、mod、add1函数的使用演示     
分别含义如下:  
add、sub、mul、div 、mod函数: 分别用来计算加减乘除和取模,可以接受两个或多个参数
示例:
       add 1 2 3	 # 计算加,返回 6
       sub 3 2		# 计算减,返回 1
       mul 3 2		# 计算乘,返回 6
       div 6 3		# 计算除,返回 2
       mod 9 2    #取模,求余数,返回1
add1函数:   用于给参数加 1。只能接受一个参数,示例:  add1 3  给参数3加1,结果是4
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  data1: {{  add 1 2 3 | quote }} #计算加
  data2: {{  sub 3 2 | quote }}   #计算减
  data3: {{  mul 3 2 | quote }}   #计算乘
  data4: {{  div 6 3 | quote }}   #计算除
  data5: {{  mod 9 2 | quote }}   #取模求余数
  data6: {{  add1 3 | quote }}    #用于给参数加1,给参数3加1,结果4
#quote是加上双引号
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
data:
  data1: "6" #计算加
  data2: "1"   #计算减
  data3: "6"   #计算乘
  data4: "2"   #计算除
  data5: "1"   #取模求余数
  data6: "4"    #用于给参数加1,给参数3加1,结果4
#quote是加上双引号
#quote是加上双引号

(2).max函数、min函数、round函数、len函数、floor函数、ceil函数的使用演示  
分别含义如下:
max函数 和 min 函数: 分别用于取出一组参数中的最大值和最小值。   示例1: max 1 2 3      示例2:  min 1 2 3
round函数:  用计算输入值四舍五入后的值,需传入两个参数,最后一个参数代表保留的小数位。示例:  round  3.1415926  3
len函数:    用于计算参数的长度。 示例:  len "abcde"
floor函数:  用于返回小于等于输入值的最大浮点整数。    示例: floor 123.9999		#返回 123
ceil函数:   用于返回大于等于输入值的最小浮点整数,返回的值一定要大于或等于输入的值。 示例: ceil 123.9999		#返回 124
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  data1: {{  max 1 2 3 | quote }}         #max函数,取出一组参数中的最大值
  data2: {{  min 1 2 3 | quote }}         #min函数,取出一组参数中的最小值
  data3: {{  round 3.1415926 3 | quote }} #round函数,用计算输入值四舍五入后的值,保留3位小数
  data4: {{  len "abcde" | quote }}       #len函数,用于计算参数的长度
  data5: {{  floor 123.9999 | quote }}    #floor函数,用于返回小于等于输入值的最大浮点整数
  data6: {{  ceil 123.9999 | quote }}     #ceil函数,用于返回大于等于输入值的最小浮点整数
#quote是加上双引号
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
data:
  data1: "3"         #max函数,取出一组参数中的最大值
  data2: "1"         #min函数,取出一组参数中的最小值
  data3: "3.142" #round函数,用计算输入值四舍五入后的值,保留3位小数
  data4: "5"       #len函数,用于计算参数的长度
  data5: "123"    #floor函数,用于返回小于等于输入值的最大浮点整数
  data6: "124"     #ceil函数,用于返回大于等于输入值的最小浮点整数
#quote是加上双引号

十、helm3的网络函数、文件路径函数、类型检查函数

1.常用helm3的网络函数、文件路径函数、类型检查函数
(1).getHostByName网络函数
(2).文件路径函数 base函数、dir函数、ext函数、isAbs函数
(3).类型检查和对比函数 kindOf函数、kindIs函数、deepEqual函数


2.常用helm3的网络函数、文件路径函数、类型检查函数使用的演示
1).环境准备 k8s集群
# kubectl get node
NAME   STATUS   ROLES                  AGE    VERSION
m1     Ready    control-plane,master   252d   v1.20.4
m2     Ready    control-plane,master   252d   v1.20.4
m3     Ready    control-plane,master   252d   v1.20.4
n1     Ready    <none>                 251d   v1.20.4

2).创建一个chart包       (用helm3发布创建一个configmap,创建的k8s集群中,发布其他应用也一样)
# helm create mychart       #创建一个chart包,chart包名为: mychart      
# cd mychart/
# ls
charts  Chart.yaml  templates  values.yaml
# cd templates/
# ls
deployment.yaml  _helpers.tpl  hpa.yaml  ingress.yaml  NOTES.txt  serviceaccount.yaml  service.yaml  tests
# rm -rf *                     #全部删除

3).编写自己需要的yaml文件,使用上面的各个内置函数演示
(1).getHostByName网络函数使用的演示    用于接收一个域名并返回该域名的解析后的IP地址  示例:   getHostByName "www.baidu.com"
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  data1: {{ getHostByName "www.baidu.com" | quote }}   #getHostByName网络函数,用于接收一个域名并返回该域名的解析后的IP地址
#quote是加上双引号
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
data:
  data1: "110.242.68.3"   #getHostByName网络函数,用于接收一个域名并返回该域名的解析后的IP地址
#quote是加上双引号

(2).文件路径函数base函数、dir函数、ext函数、isAbs函数使用的演示      用于对文件路径进行处理
分别含义如下:
base函数: 用于返回指定路径的最后一级目录
dir函数:  用于返回指定路径的上一级路径(也就是去掉最后一级路径)
ext函数:  用于返回文件的拓展名
isAbs函数:用于判断文件路径是否是绝对路径,是绝对路径则返回 true,否则返回 false
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  data1: {{ base "/tmp/a/a.txt" }}   #返回最后一级目录
  data2: {{ dir "/tmp/a/a.txt" }}    #去掉最后一级目录
  data3: {{ ext "a.txt" }}           #返回文件的扩展名
  data4: {{ isAbs "/tmp/a" }}        #判断文件路径是否为绝对路径
  data5: {{ isAbs "tmp/a" }}         #判断文件路径是否为绝对路径
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
data:
  data1: a.txt        #返回最后一级目录
  data2: /tmp/a    #去掉最后一级目录
  data3: .txt         #返回文件的扩展名
  data4: true        #判断文件路径是否为绝对路径
  data5: false       #判断文件路径是否为绝对路径

(3).类型检查和对比函数 kindOf函数、kindIs函数、deepEqual函数使用的演示      
分别含义如下:
kindOf:    用于返回对象的类型
kindIs:    用于检测某个对象是否是指定的类型,返回布尔值,第一个参数需要指定类型,第二个参数需要指定检查的数据对象
deepEqual:用于判断两个对象的值是否完全一致,返回布尔值
# vim /root/mychart/templates/configmap.yaml     #编写一个自己需要的模板文件
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  data1: {{ kindOf ( list 1 2 3 ) }}                  #kindOf函数:用于返回对象的类型
  data2: {{ kindIs "string" "hi" }}                   #kindIs函数:用于检测某个对象是否是指定的类型,返回布尔值,后面的字符串,是前面定义的类型
  data3: {{ deepEqual ( list 1 2 3) (list 1 2 3 ) }}  #deepEqual函数:用于判断两个对象的值是否完全一致,返回布尔值,一致返回true
  data4: {{ deepEqual ( list 1 2 3) (list 2 3 4 ) }}  #deepEqual函数:用于判断两个对象的值是否完全一致,返回布尔值,不一致返回false
# helm install myconfigmap1 ./mychart/ --debug --dry-run      #不真正执行,只是试运行看是否能运行
...
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap1-configmap
data:
  data1: slice    #kindOf函数:用于返回对象的类型
  data2: true     #kindIs函数:用于检测某个对象是否是指定的类型,返回布尔值,后面的字符串,是前面定义的类型
  data3: true     #deepEqual函数:用于判断两个对象的值是否完全一致,返回布尔值,一致返回true
  data4: false    #deepEqual函数:用于判断两个对象的值是否完全一致,返回布尔值,不一致返回false

标签:返回,configmap,helm3,内置,函数,mychart,yaml,详解,字符串
From: https://www.cnblogs.com/khtt/p/17198911.html

相关文章

  • api接口详解大全
    api接口详解大全?优秀的设计是产品变得卓越的原因设计API意味着提供有效的接口,可以帮助API使用者更好地了解、使用和集成,同时帮助人们有效地维护它每个产品都需要使用手册,AP......
  • 详解avaScript ES6中的import和export
    0、前言前端工程,在最早的时候是没有模块的概念的。随着前端工程的发展,前端开发也越来越规范化,更像是软件工程了。那么随之而来的,为了解决工程化的问题,就引入了模块的概念......
  • ntpq -p命令详解
    ntpq用来监视ntpd操作,ntpq-p查询网络中的NTP服务器,同时显示客户端和每个服务器的关系[root@localhost~]#ntpq-premoterefidst......
  • Java数据类型详解
    Java数据类型详解基本数据类型(8种)整数类型byte1个字节-128-127short2个字节负的3万多到正的三万多-32768-32767int4个字节负的20多亿到正的20多亿......
  • Redis 的Java客户端——Jedis连接池的使用详解
    一.Redis的Java客户端jedis的官方仓库地址:https://github.com/redis/jedisRedis数据结构Redis是一个key-value的数据库,key一般是String类型,不过value的类......
  • 【Rides】使用Xshell 链接云服务器安装Rides及其三种启动方法详解
    一.NoSQL和SQl的概念SQL:关系型数据库1.结构化2.关系型:关联的3.语法固定,所有的sql数据库sql语法都是相同的。SQL查询:NoSQL:非关系型数据库1.非结构化(约束松散)2.非......
  • 【数据结构入门】单链表(SList)详解(增、删、查、改)
    1、链表的概念及结构1.1链表的概念概念:链表是一种物理存储结构上非连续、非顺序的存储结构,但链表在逻辑上是连续的,顺序的,而数据元素的逻辑顺序是通过链表中的指针连接次序实......
  • 一文深入 Redis 主从复制的原理详解
    文章目录:1、复制过程2、数据间的同步3、全量复制4、部分复制5、心跳6、异步复制复制原理1.复制过程复制的过程步骤如下:1、从节点执行slaveof命令2、从节......
  • 嵌入式C语言九大数据结构操作方式详解
          数据结构想必大家都不会陌生,对于一个成熟的程序员而言,熟悉和掌握数据结构和算法也是基本功之一。数据结构本身其实不过是数据按照特点关系进行存储或者组织......
  • 51Nod1019 逆序数(归并排序详解)
    逆序对给定一个1-N的排列A1,A2,...AN,如果Ai和Aj满足i<j且Ai>Aj,我们就称(Ai,Aj)是一个逆序对。 求A1,A2...AN中所有逆序对的数目。input 第一行包含一个整数N......