HELM語法


模板函數

 

{{ quote .values.drink }}  == {{ .values.drink | quote }}

quote字符加雙引號

upper大寫

repeat [number]重復幾次

default 變量不存在用默認值替換

title 首字母大寫

b64enc 轉化為base64編碼

 

控制結構:

 

if/else 創建條件塊,結束用end

 

{{- if values.drink "ccc" }}

 

-代表刪除空格,前面的刪除前面的空格

 

{{- end }}

 

with 指定一個范圍

 

[root@master test]# cat Values.yaml data: drink: tea food: apple [root@master templates]# cat configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: {{- with .Values.data }} drink: {{ .drink | quote }} test: {{ .tea | default "tea" | quote }} food: {{ .food | repeat 5 | upper | quote }} {{- if eq .drink "tea" }} green: true {{- end -}} {{- end -}}

上面例子就相當於給定了一個范圍在這個范圍內使用范圍內的值,可以省略一些前綴。類似於絕對路徑與相對路徑查看文件。

都一點需要注意如果用with圈定了范圍,其他再從頂級調用值就會失敗。

 

例如在wiht中調用Release.Name。如果還是想在with調用范圍外的,可以在范圍之外把想用的頂級內置函數定義為變量{{- $name := .Release.Name }},在后面引用變量即可。

 

如下:

 

 

[root@master templates]# cat configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data:  {{- $name := .Release.Name }} {{- with .Values.data }} drink: {{ .drink | quote }} test: {{ .tea | default "tea" | quote }} release: {{ $name }} {{- if eq .drink "tea" }} green: true {{- end }} {{- end }} pizza: |- {{- range .Values.pizza }} - {{ . | quote }} {{- end }}

 

range 提供了一個像for樣式的循環(這個有go語言循環的那種特性range key,value := .Values支持匿名函數)

 

[root@master templates]# cat ../Values.yaml data: drink: tea food: apple pizza: - cheese - peppers - apple [root@master templates]# cat configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: {{- with .Values.data }} drink: {{ .drink | quote }} test: {{ .tea | default "tea" | quote }} {{- if eq .drink "tea" }} green: true {{- end }} {{- end }} pizza: |-
#range前面如果有end記得結尾部分不能有去空格字符會報錯,具體原因應該是格式導致的
{{
- range .Values.pizza }} - {{ . | title| quote }}
#點意味着當前范圍的或者換句話說就是頂級目錄test(項目根目錄)/如果類似與在for range的范圍內代表去當前變量中的值
{{
- end }}

 

 

 

 

聲明:

 

define 在模板中宣告一個新的命名模板

 

 

[root@master templates]# cat configmap.yaml {{- define "test.labels" }} labels: app: test date: {{ now | htmlDate }} {{- end }} apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap  {{- template "test.labels" }} data: hello: world

 

可以定義在_helpers.tpl里面,同時也可以添加注釋。方法是{{/*。。。。*/}}

 

 

 

 

 

template 導入一個命名模板

 

有一個細節,在導入模板被呈現的時候,它會接收到模板調用傳入范圍。如果定義的東西有不在范圍內的,那么就會報錯或者不顯示

 

例如:{{- template "test.labels" }}

 

這個很好解決如果沒有范圍,那么我們就給他一個范圍

 

例如:{{- template "test.labels" . }}點意味着當前范圍的或者換句話說就是頂級目錄test(項目根目錄)

 

 

下面是代碼示例:

 

 

[root@master templates]# cat configmap.yaml {{- define "test.labels" }} labels: app: test date: {{ now | htmlDate }}  chart: {{ .Chart.Name }} food: {{ .Values.data.food }} {{- end }} apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap  {{- template "test.labels" }} data: hello: world 執行后報錯如下: [root@master templates]# helm install test  /root/test/ --debug --dry-run -f /root/test/Values.yaml install.go:173: [debug] Original chart version: ""
install.go:190: [debug] CHART PATH: /root/test Error: unable to build kubernetes objects from release manifest: error validating "": error validating data: [unknown object type "nil" in ConfigMap.metadata.labels.chart, unknown object type "nil" in ConfigMap.metadata.labels.food] helm.go:81: [debug] error validating "": error validating data: [unknown object type "nil" in ConfigMap.metadata.labels.chart, unknown object type "nil" in ConfigMap.metadata.labels.food]

 

原因參數不在定義范圍之內。

 

解決辦法:

 

 

[root@master templates]# cat configmap.yaml {{- define "test.labels" }} labels: app: test date: {{ now | htmlDate }} chart: {{ .Chart.Name }} food: {{ .Values.data.food }} {{- end }} apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap {{- template "test.labels" . }} data: hello: world 執行結果正常: # Source: test/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: test-configmap labels: app: test date: 2021-05-02 chart: test food: apple data: hello: world

 

還有一點,請注意,下面示例中app_version在兩個位置上的縮進都是錯誤的。為什么?因為替換的模板的文本右對齊。因為template模板是一個動作不是函數。所以沒有辦法將調用的輸出傳遞給其他函數,數據只會被簡單的插入,那么在Kubernetes中有可能因為格式導致部署失敗。

 

示例如下:

 

 

{{- define "test.labels" -}}
app_name: {{ .Chart.Name }}
app_version: "{{ .Chart.Version }}+{{ .Release.Time.Seconds }}"
{{- end -}}

 

現在說要將此插入到labels:模板的data:部分以及該部分中:

 

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
  labels:
    {{ template "test.labels" .}}
data:
  myvalue: "Hello World"
  {{- range $key, $val := .Values.favorite }}
  {{ $key }}: {{ $val | quote }}
  {{- end }}
{{ template "test.labels" . }}

 

輸出將不會是我們期望的:

 

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: measly-whippet-configmap
  labels:
    app_name: mychart
app_version: "0.1.0+1478129847"
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "pizza" app_name: mychart app_version: "0.1.0+1478129847"

 

 

 

 

解決辦法:

 

Helm提供了一種替代方法,template可以將模板的內容導入到當前管道中,然后可以將其傳遞給管道中的其他功能。

 

{{ include “test.labels” . | indent 2 }}

 

indent縮進得意思,可以理解為空格。

 

indent縮進是根據上級結構計算。如果上級目錄是data就需要與data對齊,不能超過data。

 

.Files通常出於安全原因,某些文件無法通過該對象訪問

 

  • templates/無法訪問中的文件。
  • .helmignore無法訪問使用排除的文件。

 

 

block 聲明一種特殊的可填充模板區域

 

 

判斷為false:

bool false

0

空值

空串

空集合(map,slice,tuple,dict,array)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM