八 Kubernetes学习Helm应用包管理器( 三 )


# cat templates/deploymemt.yaml...env:{{- if eq .Values.env.hello "world" }}- name: hellovalue: 123{{- end }}
现在是不是没有多余的空格了 , 如果使用-}}需谨慎 , 比如上面模板文件中:
# cat templates/deploymemt.yaml...env:{{- if eq .Values.env.hello "world" -}}- hello: true{{- end }}
这会渲染成:
env:- hello: true
因为-}}它删除了双方的换行符 。
with
with :控制变量作用域 。
其语法和一个简单的 if语句比较类似:
{{ with PIPELINE }}#restricted scope{{ end }}
with语句可以允许将当前范围 .设置为特定的对象 , 比如我们前面一直使用的 ..label , 我们可以使用 with来将 .范围指向 ..label:
apiVersion: apps/v1kind: Deploymentmetadata:name: {{ .Values.name | default "web" }}spec:replicas: {{ .Values.replicas }}selector:matchLabels:project: {{ .Values.label.project }}app: {{ .Values.label.app }}template:metadata:labels:project: {{ .Values.label.project }}app: {{ .Values.label.app }}{{- with .Values.label }}project: {{ .project }}app: {{ .app }}{{- end }}
上面增加了一个{{- with ..label }} xxx {{- end }}的一个块 , 这样的话就可以在当前的块里面直接引用 .和 .app了 。
需要注意的在 with声明的范围内 , 将无法从父范围访问到其他对象了 , 比如:
{{- with .Values.label }}project: {{ .project }}app: {{ .app }}{{ .Release.Name }}{{- end }}
range
在 Helm 模板语言中 , 使用 range关键字来进行循环操作 。
# cat values.yaml replicas: 2label:project: msapp: productenv:hello: "world"test: "yes"
循环打印该列表:
env:{{- range .Values.env }}{{ . }}{{- end }}
循环内部我们使用的是一个 . , 这是因为当前的作用域就在当前循环内 , 这个 .引用的当前读取的元素 。
但结果并不是我们所期望的:
env:- name: worldvalue: world
变量
在模板中 , 使用变量的场合不多 , 但我们将看到如何使用它来简化代码 , 并更好地利用with和range 。
1、获取列表键值
# cat ../values.yamlenv:NAME: "gateway"JAVA_OPTS: "-Xmx1G"# cat deployment.yaml ...env:{{- range $k, $v := .Values.env }}- name: {{ $k }}value: {{ $v | quote }}{{- end }}
结果如下:
env:- name: JAVA_OPTSvalue: "-Xmx1G"- name: NAMEvalue: "gateway"
range循环中使用 $key和 $value两个变量来接收后面列表循环的键和值 。
2、with中不能使用内置对象
with语句块内不能再 ..Name对象 , 否则报错 。
我们可以将该对象赋值给一个变量可以来解决这个问题:
{{- $releaseName := .Release.Name -}}{{- with .Values.label }}project: {{ .project }}app: {{ .app }}release: {{ $releaseName }}# 或者可以使用$符号,引入全局命名空间release: {{ $.Release.Name }}{{- end }}
可以看到在 with语句上面增加了一句 {{-$:=..Name-}} , 其中 $就是后面的对象的一个引用变量 , 它的形式就是 $name , 赋值操作使用 := , 这样 with语句块内部的 $变量仍然指向的是 ..Name
命名模板
命名模板:使用定义 , 引入 , 在目录中默认下划线_开头的文件为公共模板.tpl