云原生应用管理:原理与实践
上QQ阅读APP看书,第一时间看更新

2.10.3 模板函数与管道

到目前为止,我们已经学习了如何在Chart中放置静态文本或者资源,但是所有的资源和文本都是静态或预先编制的,且不能动态指定。如果我们想让某个标签内含有当前部署的时间,或者处理一下大小写的转换,这些功能该如何实现呢?下面就来介绍一些Helm内提供的内置模板函数,与流程控制器一样是高阶Chart编写的必备技能。

首先接着上文创建的Chart,在values.yaml文件下增加如下内容。


favorite:
  drink: coffee
  food: PIZZA

当我们想要从values.yaml文件中注入一些内容到template文件夹下面时,可以使用函数quote。


apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink: {{ quote .Values.favorite.drink }}
  food: {{ quote .Values.favorite.food }}

模板函数的使用规范是functionName arg1 arg2...上面的函数。

quote.Values.favorite.drink就是用于将values.yaml内的值传递进去,下面进行测试。


[root@iZ8vb0qditk1qw27yu4k5nZ myChart]# helm install ../myChart/ --dry-run --debug
[debug] Created tunnel using local port: '36190'

[debug] SERVER: "127.0.0.1:36190"

[debug] Original Chart version: ""
[debug] CHART PATH: /root/myChart

NAME:   contrasting-ibex
REVISION: 1
RELEASED: Wed Aug 28 19:30:34 2019
CHART: myChart-0.1.0
USER-SUPPLIED VALUES:
{}

COMPUTED VALUES:
favorite:
  drink: coffee
  food: PIZZA

HOOKS:
MANIFEST:

---
# Source: myChart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: contrasting-ibex-configmap
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "PIZZA"
[root@iZ8vb0qditk1qw27yu4k5nZ myChart]# cat values.yaml
favorite:
  drink: coffee
  food: PIZZA

可以看到,确实将values.yaml内的参数显示了出来。

1.管道

管道调用是模板语言的一个非常强大的功能,它类似Linux内的管道传递。管道调用可以将上一步处理的结果传递给下一个函数,然后由下一个函数继续进行处理。我们改造一下上面的Chart,改成以管道的形式书写。


apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink: {{ .Values.favorite.drink | quote }}
  food: {{ .Values.favorite.food | quote 

在上面的例子中,没有使用quote ARGUMENT这种格式,我们调转了顺序将得到的参数直接通过管道的方式传递给函数,通过的管道用“|”符号表示。管道这种调用方式可以连接起来多次使用,比如我们希望将drink的字符全部都大写,可以改造成如下这样。


apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink: {{ .Values.favorite.drink | upper | quote }}
  food: {{ .Values.favorite.food | upper | quote }}

上面的参数都是把前面的第一个参数传递给后面的函数,我们下面介绍一个需要两个参数的函数repeat COUNT STRING:,它可以将指定的字符串重复输出多次。


apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink: {{ .Values.favorite.drink | repeat 5 | quote }}
  food: {{ .Values.favorite.food | upper | quote }}

apiVersion: v1
kind: ConfigMap
metadata:
  name: vigilant-penguin-configmap
data:
  myvalue: "Hello World"
  drink: "coffeecoffeecoffeecoffeecoffee"
  food: "PIZZA"

可以从上面的结果看到,repeat确实重复了多次。

2.DEFAULT函数

在一些模板中,某些标签或者字段必须有一个默认值,这里就引出了Helm中最常用的函数default DEFAULT_VALUE GIVEN_VALUE。这个函数允许用户给某个template下的资源文件设置一个默认值,当这个值没有被用户提供时,就会触发默认的值来填充。我们修改上面的ConfigMap程序。


drink: {{ .Values.favorite.drink | default "tea" | quote }}

然后注释values.yaml中的drink字段,再次运行可以看到如下结果。


apiVersion: v1
kind: ConfigMap
metadata:
  name: banking-toad-configmap
data:
  myvalue: "Hello World"
  drink: "tea"
  food: "PIZZA"

可以看到drink的值已经被替换为默认值tea。

但是在实际生产中,建议所有的默认值都放入values.yaml文件中,即使它是多余的。

模板函数和管道是非常有用的功能,但有时我们需要进行一些逻辑计算来选择到底应该填充哪个值到对应的模板中,下面介绍一下如何在模板语言中引入逻辑控制。