<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                模板函數和管道是通過轉換信息并將其插入到YAML文件中的強大方法。但有時候需要添加一些比插入字符串更復雜一些的模板邏輯。這就需要使用到模板語言中提供的控制結構了。 控制流程為我們提供了控制模板生成流程的一種能力,Helm 的模板語言提供了以下幾種流程控制: - `if/else` 條件塊 - `with` 指定范圍 - `range` 循環塊 除此之外,它還提供了一些聲明和使用命名模板段的操作: - `define`在模板中聲明一個新的命名模板 - `template`導入一個命名模板 - `block`聲明了一種特殊的可填寫的模板區域 ## 1. if/else 條件 `if/else`塊是用于在模板中有條件地包含文本塊的方法,條件塊的基本結構如下: ```c {{ if PIPELINE }} # Do something {{ else if OTHER PIPELINE }} # Do something else {{ else }} # Default case {{ end }} ``` 當然要使用條件塊就得判斷條件是否為真,如果值為下面的幾種情況,則管道的結果為 false: - 一個布爾類型的假 - 一個數字零 - 一個空的字符串 - 一個nil(空或null) - 一個空的集合(map、slice、tuple、dict、array) 除了上面的這些情況外,其他所有條件都為真。 同樣還是以上面的 ConfigMap 模板文件為例,添加一個簡單的條件判斷,如果 python 被設置為 `django`,則添加一個web: true:(`tempaltes/configmap.yaml`) ```bash apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: myvalue: {{ .Values.hello | default "Hello World" | quote }} k8s: {{ .Values.course.k8s | upper | quote }} python: {{ .Values.course.python | repeat 3 | quote }} {{ if eq .Values.course.python "django" }}web: true{{ end }} ``` 在上面的模板文件中我們增加了一個條件語句判斷`{{ if eq .Values.course.python "django" }}web: true{{ end }}`,其中運算符eq是判斷是否相等的操作,除此之外,還有ne、lt、gt、and、or等運算符都是 Helm 模板已經實現了的,直接使用即可。這里我們`{{ .Values.course.python }}`的值在values.yaml文件中默認被設置為了`django`,所以正常來說下面的條件語句判斷為真,所以模板文件最終被渲染后會有`web: true`這樣的的一個條目: ```bash $ helm install --dry-run --debug . [debug] Created tunnel using local port: '40143' ...... --- # Source: mychart/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: fallacious-prawn-configmap data: myvalue: "Hello World" k8s: "DEVOPS" python: "djangodjangodjangodjangodjango" web: true ``` 可以看到上面模板被渲染后出現了`web: true`的條目,如果我們在安裝的時候覆蓋下 python 的值呢,比如我們改成 `ai`: ```bash helm install --dry-run --debug --set course.python=ai . [debug] Created tunnel using local port: '42802' ...... --- # Source: mychart/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: dull-mite-configmap data: myvalue: "Hello World" k8s: "DEVOPS" python: "aiaiai" ``` 根據我們模板文件中的定義,如果`{{ .Values.course.python }}`的值為django的話就會新增`web: true`這樣的一個條目,但是現在我們是不是通過參數`--set`將值設置為了 ai,所以這里條件判斷為假,正常來說就不應該出現這個條目了,上面我們通過 debug 模式查看最終被渲染的值也沒有出現這個條目,證明條件判斷是正確的。 ## 2. 空格控制 上面我們的條件判斷語句是在一整行中的,如果平時經常寫代碼的同學可能非常不習慣了,我們一般會將其格式化為更容易閱讀的形式,比如: ```bash {{ if eq .Values.course.python "django" }} web: true {{ end }} ``` 這樣的話看上去比之前要清晰很多了,但是我們通過模板引擎來渲染一下,會得到如下結果: ```bash $ helm install --dry-run --debug . [debug] Created tunnel using local port: '44537' ...... --- # Source: mychart/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: bald-narwhal-configmap data: myvalue: "Hello World" k8s: "DEVOPS" python: "djangodjangodjango" web: true ``` 我們可以看到渲染出來會有多余的空行,這是因為當模板引擎運行時,它將一些值渲染過后,之前的指令被刪除,但它之前所占的位置完全按原樣保留剩余的空白了,所以就出現了多余的空行。YAML文件中的空格是非常嚴格的,所以對于空格的管理非常重要,一不小心就會導致你的YAML文件格式錯誤。 我們可以通過使用在模板標識{{后面添加破折號和空格{{-來表示將空白左移,而在}}前面添加一個空格和破折號-}}表示應該刪除右邊的空格,另外需要注意的是換行符也是空格! 使用這個語法,我們來修改我們上面的模板文件去掉多余的空格:`(templates/configmap.yaml)` ```bash apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: myvalue: {{ .Values.hello | default "Hello World" | quote }} k8s: {{ .Values.course.k8s | upper | quote }} python: {{ .Values.course.python | repeat 3 | quote }} {{- if eq .Values.course.python "django" }} web: true {{- end }} ``` 現在我們來查看上面模板渲染過后的樣子: ```bash $ helm install --dry-run --debug . [debug] Created tunnel using local port: '34702' ...... --- # Source: mychart/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mangy-olm-configmap data: myvalue: "Hello World" k8s: "DEVOPS" python: "djangodjangodjango" web: true ``` 現在是不是沒有多余的空格了,另外我們需要謹慎使用`-}}`,比如上面模板文件中: ```bash python: {{ .Values.course.python | repeat 3 | quote }} {{- if eq .Values.course.python "django" -}} web: true {{- end }} ``` 如果我們在if條件后面增加`-}}`,這會渲染成: ```bash python: "djangodjangodjango"web: true ``` 因為`-}}`它刪除了雙方的換行符,顯然這是不正確的。 ## 3. 使用 with 修改范圍 接下來我們來看下with關鍵詞的使用,它用來控制變量作用域。還記得之前我們的`{{ .Release.xxx }}`或者`{{ .Values.xxx }}`嗎?其中的.就是表示對當前范圍的引用,.Values就是告訴模板在當前范圍中查找Values對象的值。而with語句就可以來控制變量的作用域范圍,其語法和一個簡單的if語句比較類似: ```bash {{ with PIPELINE }} # restricted scope {{ end }} ``` `with`語句可以允許將當前范圍.設置為特定的對象,比如我們前面一直使用的`.Values.course`,我們可以使用`with`來將.范圍指向`.Values.course`:(`templates/configmap.yaml`) ```bash apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: myvalue: {{ .Values.hello | default "Hello World" | quote }} {{- with .Values.course }} k8s: {{ .k8s | upper | quote }} python: {{ .python | repeat 3 | quote }} {{- if eq .python "django" }} web: true {{- end }} {{- end }} ``` 可以看到上面我們增加了一個`{{- with .Values.course }}xxx{{- end }}`的一個塊,這樣的話我們就可以在當前的塊里面直接引用`.python`和`.k8s`了,而不需要進行限定了,這是因為該with聲明將.指向了`.Values.course`,在`{{- end }}`后.就會復原其之前的作用范圍了,我們可以使用模板引擎來渲染上面的模板查看是否符合預期結果。 不過需要注意的是在with聲明的范圍內,此時將無法從父范圍訪問到其他對象了,比如下面的模板渲染的時候將會報錯,因為顯然`.Release`根本就不在當前的.范圍內,當然如果我們最后兩行交換下位置就正常了,因為`{{- end }}`之后范圍就被重置了: ```bash {{- with .Values.course }} k8s: {{ .k8s | upper | quote }} python: {{ .python | repeat 3 | quote }} release: {{ .Release.Name }} {{- end }} ``` ## 4. range 循環 如果大家對編程語言熟悉的話,幾乎所有的編程語言都支持類似于`for`、`foreach`或者類似功能的循環機制,在 Helm 模板語言中,是使用range關鍵字來進行循環操作。 我們在`values.yaml`文件中添加上一個課程列表: ```bash course: k8s: devops python: django courselist: - k8s - python - search - golang ``` 現在我們有一個課程列表,修改 ConfigMap 模板文件來循環打印出該列表: ```bash apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: myvalue: {{ .Values.hello | default "Hello World" | quote }} {{- with .Values.course }} k8s: {{ .k8s | upper | quote }} python: {{ .python | repeat 3 | quote }} {{- if eq .python "django" }} web: true {{- end }} {{- end }} courselist: {{- range .Values.courselist }} - {{ . | title | quote }} {{- end }} ``` 可以看到最下面我們使用了一個`range`函數,該函數將會遍歷`{{ .Values.courselist }}`列表,循環內部我們使用的是一個.,這是因為當前的作用域就在當前循環內,這個.從列表的第一個元素一直遍歷到最后一個元素,然后在遍歷過程中使用了`title`和`quote`這兩個函數,**前面這個函數是將字符串首字母變成大寫,后面就是加上雙引號變成字符串**,所以按照上面這個模板被渲染過后的結果為: ```bash $ helm install --dry-run --debug . [debug] Created tunnel using local port: '34626' ...... --- # Source: mychart/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: dining-terrier-configmap data: myvalue: "Hello World" k8s: "DEVOPS" python: "djangodjangodjango" web: true courselist: - "K8s" - "Python" - "Search" - "Golang" ``` 我們可以看到`courselist`按照我們的要求循環出來了。除了 list 或者 tuple,range 還可以用于遍歷具有鍵和值的集合(如map 或 dict),這個就需要用到變量的概念了。 ## 5. 變量 前面我們已經學習了函數、管理以及控制流程的使用方法,我們知道編程語言中還有一個很重要的概念叫:變量,在 Helm 模板中,使用變量的場合不是特別多,但是在合適的時候使用變量可以很好的解決我們的問題。如下面的模板: ```bash {{- with .Values.course }} k8s: {{ .k8s | upper | quote }} python: {{ .python | repeat 3 | quote }} release: {{ .Release.Name }} {{- end }} ``` 我們在with語句塊內添加了一個`.Release.Name`對象,但這個模板是錯誤的,編譯的時候會失敗,這是因為`.Release.Name`不在該with語句塊限制的作用范圍之內,我們可以將該對象賦值給一個變量可以來解決這個問題: ```bash apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: {{- $releaseName := .Release.Name -}} {{- with .Values.course }} k8s: {{ .k8s | upper | quote }} python: {{ .python | repeat 3 | quote }} release: {{ $releaseName }} {{- end }} ``` 我們可以看到我們在with語句上面增加了一句`{{- $releaseName := .Release.Name -}}`,其中`$releaseName`就是后面的對象的一個引用變量,它的形式就是`$name`,賦值操作使用`:=`,這樣with語句塊內部的`$releaseName`變量仍然指向的是`.Release.Name`,同樣,我們 `DEBUG` 下查看結果: ```bash $ helm install --dry-run --debug . [debug] Created tunnel using local port: '45474' ...... --- # Source: mychart/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: nosy-seagull-configmap data: k8s: "DEVOPS" python: "djangodjangodjango" release: nosy-seagull ``` 可以看到已經正常了,另外變量在`range`循環中也非常有用,我們可以在循環中用變量來同時捕獲索引的值: ```bash courselist: {{- range $index, $course := .Values.courselist }} - {{ $index }}: {{ $course | title | quote }} {{- end }} ``` 例如上面的這個列表,我們在`range`循環中使用`$index`和`$course`兩個變量來接收后面列表循環的索引和對應的值,最終可以得到如下結果: ```bash $ helm install --dry-run --debug . [debug] Created tunnel using local port: '38876' ...... --- # Source: mychart/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: vetoed-anaconda-configmap data: courselist: - 0: "K8s" - 1: "Python" - 2: "Search" - 3: "Golang" ``` 我們可以看到 `courselist` 下面將索引和對應的值都打印出來了,實際上具有鍵和值的數據結構我們都可以使用`range`來循環獲得二者的值,比如我們可以對`.Values.course`這個字典來進行循環: ```bash apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: {{- range $key, $value := .Values.course }} {{ $key }}: {{ $value | quote }} {{- end }} ``` 直接使用`range`循環,用變量`$key`、`$value`來接收字段`.Values.course`的鍵和值。這就是變量在 Helm 模板中的使用方法。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看