変数

関数、パイプライン、オブジェクト、制御構造を理解した上で、多くのプログラミング言語におけるより基本的な概念の1つである変数について見ていきましょう。テンプレートでは、変数はそれほど頻繁に使用されません。しかし、変数を使用してコードを簡素化し、withrange をより効果的に使用する方法を見ていきます。

以前の例では、このコードが失敗することを確認しました

  {{- with .Values.favorite }}
  drink: {{ .drink | default "tea" | quote }}
  food: {{ .food | upper | quote }}
  release: {{ .Release.Name }}
  {{- end }}

Release.Name は、with ブロックで制限されているスコープ内にありません。スコープの問題を回避する1つの方法は、現在のスコープに関係なくアクセスできる変数にオブジェクトを代入することです。

Helmテンプレートでは、変数は別のオブジェクトへの名前付き参照です。$name の形式に従います。変数は、特別な代入演算子 := を使用して代入されます。上記を書き直して、Release.Name に変数を使用することができます。

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  {{- $relname := .Release.Name -}}
  {{- with .Values.favorite }}
  drink: {{ .drink | default "tea" | quote }}
  food: {{ .food | upper | quote }}
  release: {{ $relname }}
  {{- end }}

with ブロックを開始する前に、$relname := .Release.Name を代入していることに注意してください。これで、with ブロック内でも、$relname 変数はリリース名を指しています。

これを実行すると、次のようになります

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: viable-badger-configmap
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "PIZZA"
  release: viable-badger

変数は range ループで特に役立ちます。リストのようなオブジェクトで使用して、インデックスと値の両方をキャプチャできます

  toppings: |-
    {{- range $index, $topping := .Values.pizzaToppings }}
      {{ $index }}: {{ $topping }}
    {{- end }}    

range が最初に来て、次に変数、次に代入演算子、次にリストが来ることに注意してください。これは、整数インデックス(0から始まる)を $index に、値を $topping に代入します。実行すると、次のようになります

  toppings: |-
      0: mushrooms
      1: cheese
      2: peppers
      3: onions      

キーと値の両方を持つデータ構造の場合、range を使用して両方を取得できます。たとえば、.Values.favorite を次のようにループできます

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

最初の反復では、$keydrink$valcoffee になり、2回目の反復では、$keyfood$valpizza になります。上記を実行すると、次のようになります

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: eager-rabbit-configmap
data:
  myvalue: "Hello World"
  drink: "coffee"
  food: "pizza"

変数は通常「グローバル」ではありません。宣言されたブロックのスコープを持ちます。 eerder hebben we $relname toegewezen aan het hoogste niveau van de template. Die variabele is beschikbaar voor de hele template. Maar in ons laatste voorbeeld zijn $key en $val alleen beschikbaar binnen het {{ range... }}{{ end }} blok.

ただし、常にグローバルな変数が1つあります - $ - この変数は常にルートコンテキストを指します。これは、範囲内でループしていて、チャートのリリース名を知る必要がある場合に非常に役立ちます。

これを示す例

{{- range .Values.tlsSecrets }}
apiVersion: v1
kind: Secret
metadata:
  name: {{ .name }}
  labels:
    # Many helm templates would use `.` below, but that will not work,
    # however `$` will work here
    app.kubernetes.io/name: {{ template "fullname" $ }}
    # I cannot reference .Chart.Name, but I can do $.Chart.Name
    helm.sh/chart: "{{ $.Chart.Name }}-{{ $.Chart.Version }}"
    app.kubernetes.io/instance: "{{ $.Release.Name }}"
    # Value from appVersion in Chart.yaml
    app.kubernetes.io/version: "{{ $.Chart.AppVersion }}"
    app.kubernetes.io/managed-by: "{{ $.Release.Service }}"
type: kubernetes.io/tls
data:
  tls.crt: {{ .certificate }}
  tls.key: {{ .key }}
---
{{- end }}

これまで、1つのファイルに宣言された1つのテンプレートのみを見てきました。しかし、Helmテンプレート言語の強力な機能の1つは、複数のテンプレートを宣言して一緒に使用できることです。次のセクションでは、これについて説明します。