侧边栏壁纸
博主头像
孔子说JAVA博主等级

成功只是一只沦落在鸡窝里的鹰,成功永远属于自信且有毅力的人!

  • 累计撰写 285 篇文章
  • 累计创建 125 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

Helm3入门教程-14:模板函数6-字典函数

孔子说JAVA
2022-04-24 / 0 评论 / 0 点赞 / 161 阅读 / 6,867 字 / 正在检测是否收录...

Helm3入门教程全系列,26小时轻松掌握Helm

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]
0

评论区