変数
関数、パイプライン、オブジェクト、制御構造を理解した上で、多くのプログラミング言語におけるより基本的な概念の1つである変数について見ていきましょう。テンプレートでは、変数はそれほど頻繁に使用されません。しかし、変数を使用してコードを簡素化し、with
と range
をより効果的に使用する方法を見ていきます。
以前の例では、このコードが失敗することを確認しました
{{- 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 }}
最初の反復では、$key
は drink
、$val
は coffee
になり、2回目の反復では、$key
は food
、$val
は pizza
になります。上記を実行すると、次のようになります
# 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つは、複数のテンプレートを宣言して一緒に使用できることです。次のセクションでは、これについて説明します。