1. define 声明模板
define 操作允许我们在模板文件中创建一个命名模板,语法如下:
{{ define "MY.NAME" }}
# body of template here
{{ end }}
比如我们可以定义一个模板封装 Kubernetes 的标签:
{{- define "mychart.labels" }}
labels:
generator: helm
date: {{ now | htmlDate }}
{{- end }}
现在我们将模板嵌入到了已有的配置映射中,然后使用 template 包含进来:
{{- define "mychart.labels" }}
labels:
generator: helm
date: {{ now | htmlDate }}
{{- end }}
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
{{- template "mychart.labels" }}
data:
myvalue: "Hello World"
{{- range $key, $val := .Values.favorite }}
{{ $key }}: {{ $val | quote }}
{{- end }}
当模板引擎读取该文件时,它会存储 mychart.labels
的引用直到 template "mychart.labels"
被调用。 然后会按行渲染模板,因此结果类似这样:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: running-panda-configmap
labels:
generator: helm
date: 2016-11-02
data:
myvalue: "Hello World"
drink: "coffee"
food: "pizza"
[!NOTE|style:flat] 注意:define不会有输出,除非像本示例一样用模板调用它。
按照惯例,Helm chart 将这些模板放置在局部文件中,一般是 _helpers.tpl
。把这个方法移到那里:
[!TIP|style:flat] 在 Helm 中使用以下划线
_
开头的文件来创建模板,该文件不会被渲染成 Kuberentes 的清单文件。关于例外,详见:Chart 命名模板
{{/* Generate basic labels */}}
{{- define "mychart.labels" }}
labels:
generator: helm
date: {{ now | htmlDate }}
{{- end }}
按照惯例 define 方法会有个简单的文档块({{/* ... */}}
)来描述要做的事。
尽管这个定义是在 _helpers.tpl
中,但它仍能访问 configmap.yaml:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
{{- template "mychart.labels" }}
data:
myvalue: "Hello World"
{{- range $key, $val := .Values.favorite }}
{{ $key }}: {{ $val | quote }}
{{- end }}
如上所述,模板名称是全局的。因此,如果两个模板使用相同名字声明,会使用最后出现的那个。由于子 chart 中的模板和顶层模板一起编译, 最好用 chart 特定名称命名你的模板。常用的命名规则是用 chart 的名字作为模板的前缀: {{ define "mychart.labels" }}
。
[!TIP|style:flat]
define
定义的模板,一般推荐时 include,而不是 template来渲染。