提供的一些聲明和使用命名模板段的操作:
define在模板中聲明一個(gè)新的命名模板
template導(dǎo)入一個(gè)命名模板
block 聲明了一種特殊的可填寫模板區(qū)域
首先理张,模板名稱是全局的。如果聲明兩個(gè)具有相同名稱的模板绵患,則最后加載一個(gè)模板是起作用的模板雾叭。由于子chart中的模板與頂級(jí)模板一起編譯,因此注意小心地使用特定chart的名稱來命名模板落蝙。
通用的命名方式是织狐,以chart名稱作為前綴,eg: {{ define "mychart.labels" }}
用define和template聲明,使用模板
示例:
{{/* Generate basic labels */}}
{{- 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 }}
當(dāng)模板引擎讀取該文件時(shí)筏勒,它將存儲(chǔ)引用mychart.labels直到template "mychart.labels"被調(diào)用移迫。然后它將在文件內(nèi)渲染該模板。結(jié)果:
# 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"
按照慣例管行,define函數(shù)會(huì)有一個(gè)簡(jiǎn)單的文檔塊({{/* ... */}})來描述自己厨埋。
Helm chart通常將這些模板放入partials文件中,通常是_helpers.tpl捐顷〉聪荩 定義和引用的方式不變雨效。
如果這樣定義一個(gè)模板
{{/* Generate basic labels */}}
{{- define "mychart.labels" }}
labels:
generator: helm
version: {{ .Chart.Version }}
{{- end }}
還是這樣引用:
{{- template "mychart.labels" }}
則 version 的值為空,因?yàn)槟0逍枰粋€(gè)上下文:
{{- template "mychart.labels" . }}
把頂層對(duì)象'.'傳遞給模板废赞,即可引用.Release,.Chaert 等徽龟。
include
這是一個(gè)引用模板的函數(shù):
假設(shè)我們定義了一個(gè)這樣的模板:
{{- define "mychart.app" -}}
app_name: {{ .Chart.Name }}
app_version: "{{ .Chart.Version }}+{{ .Release.Time.Seconds }}"
{{- end -}}
并且正常引用:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
labels:
{{ template "mychart.app" .}}
data:
myvalue: "Hello World"
{{- range $key, $val := .Values.favorite }}
{{ $key }}: {{ $val | quote }}
{{- end }}
{{ template "mychart.app" . }}
結(jié)果會(huì)有縮進(jìn)錯(cuò)誤:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: measly-whippet-configmap
labels:
app_name: mychart
app_version: "0.1.0+1478129847" 0Φ兀縮進(jìn)錯(cuò)誤
data:
myvalue: "Hello World"
drink: "coffee"
food: "pizza"
app_name: mychart
app_version: "0.1.0+1478129847"【莼凇#縮進(jìn)錯(cuò)誤
因?yàn)閠emplate的數(shù)據(jù)只是內(nèi)嵌插入耘沼,是一個(gè)‘動(dòng)作’屠尊,而非‘函數(shù)’,即不能通過管道傳遞給其他函數(shù)耕拷,來進(jìn)行格式化讼昆。
include 配合 indent 可以解決這個(gè)問題。
{{ include "mychart.app" . | indent 4 }}
引用 mychart.app 且每一行縮進(jìn)4字符
上面的示例可以改為
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
labels:
{{ include "mychart.app" . | indent 4 }}
data:
myvalue: "Hello World"
{{- range $key, $val := .Values.favorite }}
{{ $key }}: {{ $val | quote }}
{{- end }}
{{ include "mychart.app" . | indent 2 }}
文件訪問
Helm通過.Files對(duì)象提供對(duì)文件的訪問骚烧,例如Files.Get是一個(gè)按名稱獲取文件的函數(shù)(.Files.Get config.ini)浸赫。下面是幾個(gè)要注意的點(diǎn):
向Helm chart添加額外的文件是可以的。這些文件將被捆綁并發(fā)送給Tiller赃绊。不過要注意既峡,由于Kubernetes對(duì)象的存儲(chǔ)限制,chart必須小于1M碧查。
通常出于安全原因运敢,某些文件不能通過.Files對(duì)象訪問。
templates/下的文件忠售。
使用.helmignore排除的文件不能被訪問传惠。
示例:
首先創(chuàng)建三個(gè)文件
config1.toml:
message = Hello from config 1
config2.toml:
message = This is config 2
config3.toml:
message = Goodbye from config 3
然后,用一個(gè)range函數(shù)來遍歷它們并將它們的內(nèi)容注入到ConfigMap中稻扬。
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
{{- $files := .Files }}
{{- range tuple "config1.toml" "config2.toml" "config3.toml" }}
{{ . }}: |-
{{ $files.Get . }}
{{- end }}
其結(jié)果如下:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: quieting-giraf-configmap
data:
config1.toml: |-
message = Hello from config 1
config2.toml: |-
message = This is config 2
config3.toml: |-
message = Goodbye from config 3
Glob 函數(shù)
Glob是一個(gè)可以一次獲取多個(gè)文件的函數(shù)卦方。
假設(shè)這樣的一個(gè)目錄結(jié)構(gòu):
foo/:
foo.txt
foo.yaml
bar/:
bar.go
bar.conf
baz.yaml
則可以這樣引用文件:
{{ $root := . }}
{{ range $path, $bytes := .Files.Glob "**.yaml" }}
{{ $path }}: |-
{{ $root.Files.Get $path }}
{{ end }}
或者這樣:
{{ range $path, $bytes := .Files.Glob "foo/*" }}
{{ $path.base }}: '{{ $root.Files.Get $path | b64enc }}' L┘眩∨慰场b64enc 是base64編碼函數(shù)。
{{ end }}
有時(shí)候想要將文件內(nèi)容放到configmap里逝她,則可以用Glob ,ConfigMap和Secrets配合實(shí)現(xiàn):
apiVersion: v1
kind: ConfigMap
metadata:
name: conf
data:
{{ (.Files.Glob "foo/*").AsConfig | indent 2 }}
---
apiVersion: v1
kind: Secret
metadata:
name: very-secret
type: Opaque
data:
{{ (.Files.Glob "bar/*").AsSecrets | indent 2 }}
按行獲取文件:
data:
some-file.txt: {{ range .Files.Lines "foo/bar.txt" }}
{{ . }}{{ end }}