Helm 包含了很多可以在模板中利用的模板函数。包括密码安全、日期、字典、逻辑与流程控制、列表、正则表达式、字符串、类型转换、统一资源定位等17大类的模板函数,本节主要介绍字典函数(Dictionaries Functions)。
字典函数(Dictionaries Functions)
Helm 提供了一个key/value存储类型称为dict("dictionary"的简称,Python中也有)。dict是无序类型。
- 字典的key 必须是字符串。但值可以是任意类型,甚至是另一个dict 或 list。
- 不像list,dict不是不可变的。set和unset函数会修改字典的内容。
字典的内部说明: dict 在Go里是作为map[string]interface{}执行的。Go开发者可以传map[string]interface{}值给上下文, 将其作为 dict 提供给模板。
Helm 提供了以下函数支持使用字典: deepCopy(mustDeepCopy)
, dict
, get
, hasKey
, keys
, merge (mustMerge)
, mergeOverwrite (mustMergeOverwrite)
, omit
, pick
, pluck
, set
, unset
, values
。
1、dict
通过调用dict函数并传递一个键值对列表创建字典(创建一个 map)。下面是创建三个键值对的字典:
- 语法:
dict .Arg1 .Arg2...
$myDict := dict "name1" "value1" "name2" "value2" "name3" "value 3"
templates/dict.yaml 文件内容
dict: |
{{- $dt:= dict "name" "jicki" "age" 22 }}
tuple: {{ $dt }}
typeOf: {{ typeOf $dt }}
kindOf: {{ kindOf $dt }}
运行 template
root@kubernetes:/opt/helm/myapp# helm template . --show-only templates/dict.yaml
---
# Source: myapp/templates/dict.yaml
dict: |
tuple: map[age:22 name:jicki]
typeOf: map[string]interface {}
kindOf: map
2、get
给定一个映射和一个键,从映射中获取值(获取 map 中指定 key 的 value 值)。
- 语法:
get .Arg1 .Arg2
- 注意如果没有找到,会简单返回""。不会生成error。
templates/get.yaml 文件内容
get: |
{{- $mp := dict "name" "jicki" "age" 12 }}
{{ get $mp "name" }}
运行 template
root@kubernetes:/opt/helm/myapp# helm template . --show-only templates/get.yaml
---
# Source: myapp/templates/get.yaml
get: |
jicki
3、set
使用set给字典添加一个键值对(给指定的 map 设置 key/value 键值对)。
- 语法:
set .Arg1 .Arg2 .Arg3
- 注意set 返回字典 (Go模板函数的一个要求),因此你可能需要像上面那样使用使用$_赋值来获取值。
$_ := set $myDict "name4" "value4"
templates/set.yaml 文件内容
set: |
{{- $mp := dict "name" "jicki" "age" 12 }}
{{ set $mp "email" "jicki@qq.com" }}
运行 template
root@kubernetes:/opt/helm/myapp# helm template . --show-only templates/set.yaml
---
# Source: myapp/templates/set.yaml
set: |
map[age:12 email:jicki@qq.com name:jicki]
4、unset
给定一个映射和key,从映射中删除这个key(删除 map 中指定的 key/value 值)。
- 语法:
unset .Arg1 .Arg2
- 注意,如果key没有找到,这个操作会简单返回,不会生成错误。和set一样,需要返回字典。
templates/unset.yaml 文件内容
unset: |
{{- $mp := dict "name" "jicki" "age" 12 }}
{{ unset $mp "age"}}
运行 template
root@kubernetes:/opt/helm/myapp# helm template . --show-only templates/unset.yaml
---
# Source: myapp/templates/unset.yaml
unset: |
map[name:jicki]
5、hasKey
hasKey函数会在给定字典中包含了给定key时返回true(判断 map 中是否有指定的 key)。如果key没找到,会返回false。
- 语法:
hasKey .Arg1 .Arg2
templates/hasKey.yaml 文件内容
hasKey: |
{{- $mp := dict "name" "jicki" "age" 12 }}
{{ hasKey $mp "age"}}
运行 template
root@kubernetes:/opt/helm/myapp# helm template . --show-only templates/haskey.yaml
---
# Source: myapp/templates/haskey.yaml
hasKey: |
true
6、pluck
pluck 函数给定一个键和多个映射,并获得所有匹配项的列表(获取两个 map 中指定的 相同的 key 值, 组成一个新的 map):
- 语法:
pluck .Arg1 .Arg2...
- 如果key在映射中没有找到 ,列表中的映射就不会有内容(并且返回列表的长度也会小于调用pluck的字典)。
- 如果key是 存在的,但是值是空值,会插入一个值。
pluck "name1" $myDict $myOtherDict
上述会返回的list包含了每个找到的值([value1 otherValue1])。
templates/pluck.yaml 文件内容
pluck: |
{{- $mp1 := dict "name" "jicki" "age" 12 }}
{{- $mp2 := dict "name" "tom" "age" 20 }}
{{ pluck "name" $mp1 $mp2 }}
运行 template
root@kubernetes:/opt/helm/myapp# helm template . --show-only templates/pluck.yaml
---
# Source: myapp/templates/pluck.yaml
pluck: |
[jicki tom]
Helm模板中的一个常见用法是使用
pluck... | first
从字典集合中获取第一个匹配的键。
7、merge, mustMerge
将两个或多个字典合并为一个, 目标字典优先(合并指定的两个 map 到指定的新 map 中 相同的 key 会取前面的覆盖后面的):
- 语法:
merge .Arg1 .Arg2 .Arg3
- 语法:
mustMerge .Arg1 .Arg2 .Arg3
- mustMerge 会返回错误,以防出现不成功的合并。
$newdict := merge $dest $source1 $source2
这是个深度合并操作,但不是深度拷贝操作。合并的嵌套对象是两个字典上的同一实例。如果想深度合并的同时进行深度拷贝, 合并的时候同时使用deepCopy函数,比如:deepCopy $source | merge $dest
templates/merge.yaml 文件内容
merge: |
{{- $mp := dict }}
{{- $mp1 := dict "mp1" "mmm" "mp22" 12 "mp3" "jicki@qq.com" }}
{{- $mp2 := dict "mp1" "mmmm" "mp222" 20 "mp4" "tom@qq.com" }}
{{ merge $mp $mp1 $mp2 }}
运行 template
root@kubernetes:/opt/helm/myapp# helm template . --show-only templates/merge.yaml
---
# Source: myapp/templates/merge.yaml
merge: |
map[mp1:mmm mp22:12 mp222:20 mp3:jicki@qq.com mp4:tom@qq.com]
8、mergeOverwrite, mustMergeOverwrite
合并两个或多个字典,优先按照从右到左,在目标字典中有效地覆盖值(合并指定的两个 map 到指定的新 map 中 相同的 key 会取后面的覆盖前面的):
- 语法:
mergeOverwrite .Arg1 .Arg2 .Arg3
- 语法:
mustMergeOverwrite .Arg1 .Arg2 .Arg3
- mustMergeOverwrite 会返回错误,以防出现不成功的合并。
给定的:
dst:
default: default
overwrite: me
key: true
src:
overwrite: overwritten
key: false
会生成:
newdict:
default: default
overwrite: overwritten
key: false
$newdict := mergeOverwrite $dest $source1 $source2
这是一个深度合并操作但不是深度拷贝操作。两个字典上嵌入的对象被合并到了同一个实例中。如果你想在合并的同时进行深度拷贝, 使用deepCopy函数,比如:deepCopy $source | mergeOverwrite $dest
9、keys
keys函数会返回一个或多个dict类型中所有的key的list(获取一个或多个 map 中的所有 key)。由于字典是 无序的,key不会有可预料的顺序。 可以使用sortAlpha存储。
- 语法:
keys .Arg1
keys $myDict | sortAlpha
- 当提供了多个词典时,key会被串联起来。使用uniq函数和sortAlpha获取一个唯一有序的键列表。
keys $myDict $myOtherDict | uniq | sortAlpha
templates/keys.yaml 文件内容
keys: |
{{- $mp1 := dict "name" "jicki" "age" 12 }}
{{- $mp2 := dict "name" "tom" "age" 20 }}
{{ keys $mp1 $mp2 }}
运行 template
root@kubernetes:/opt/helm/myapp# helm template . --show-only templates/keys.yaml
---
# Source: myapp/templates/keys.yaml
keys: |
[name age name age]
10、pick
pick函数只从字典中选择给定的键,并创建一个新的dict(提取 map 中的 key/value 值 组成一个新的 map)。
- 语法:
pick .Arg1 .Arg2...
$new := pick $myDict "name1" "name2"
结果为:
templates/pick.yaml 文件内容
pick: |
{{- $mp1 := dict "name" "jicki" "age" 12 "email" "jicki@qq.com" }}
{{ pick $mp1 "name" "email" }}
运行 template
root@kubernetes:/opt/helm/myapp# helm template . --show-only templates/pick.yaml
---
# Source: myapp/templates/pick.yaml
pick: |
map[email:jicki@qq.com name:jicki]
11、omit
omit函数删除 map 中指定的 key 值,类似于pick,除它之外返回一个新的dict,所有的key 不匹配给定的key。
- 语法:
omit .Arg1 .Arg2...
$new := omit $myDict "name1" "name3"
结果为:
templates/omit.yaml 文件内容
omit: |
{{- $mp1 := dict "name" "jicki" "age" 12 "email" "jicki@qq.com" }}
{{ omit $mp1 "age" }}
运行 template
root@kubernetes:/opt/helm/myapp# helm template . --show-only templates/omit.yaml
---
# Source: myapp/templates/omit.yaml
omit: |
map[email:jicki@qq.com name:jicki]
12、values
values函数类似于keys,获取 map 中的 value 值(返回一个新的list包含源字典中所有的value(只支持一个字典))。
- 语法:
values .Arg1
$vals := values $myDict
结果为: list[“value1”, “value2”, “value 3”]。注意 values不能保证结果的顺序;如果你需要顺序, 请使用sortAlpha。
templates/values.yaml 文件内容
values: |
{{- $mp := dict "name" "jicki" "age" 12 "email" "jicki@qq.com" }}
{{ values $mp }}
运行 template
root@kubernetes:/opt/helm/myapp# helm template . --show-only templates/values.yaml
---
# Source: myapp/templates/values.yaml
values: |
[jicki 12 jicki@qq.com]
13、deepCopy, mustDeepCopy
deepCopy 和 mustDeepCopy 函数给定一个值并深度拷贝这个值(深度拷贝,生成一份新的)。包括字典和其他结构体。
- 语法:
deepCopy .Arg1
- deepCopy有问题时会出错, 而mustDeepCopy会返回一个错误给模板系统。
dict "a" 1 "b" 2 | deepCopy
templates/deepCopy.yaml 文件内容
deepCopy: |
{{- $li := list 1 2 4 5 }}
{{ deepCopy $li }}
运行 template
root@kubernetes:/opt/helm/myapp# helm template . --show-only templates/compact.yaml
---
# Source: myapp/templates/compact.yaml
compact: |
[a c d f]
评论区