ytt で単純な data values の代入
この記事では、ytt で単純に data values を代入する方法について説明します。
ytt
ytt はオープンソースのツール群である Carvel のうちの 1 ツール。ytt は YAML Templating Tool の略。d
Carvel は、アプリケーションのビルド、設定、Kubernetes へのデプロイを支援するツール群になります。 信頼性の高く、単一の目的を持ち、コンポーザブルなツールであることを特徴としています。
現在 Carvel には、以下のツールが含まれます。
- ytt
- kbld
- kapp
- imgpkg
- kapp-controller
- vendir
ytt の概要
ytt では、YAML の Templating と Overlay を行うことができます。
Templating では、コメントとして記述された Starlark ライクな言語を含む YAML ファイルで YAML ファイルのテンプレートを記述します。そして、そのテンプレートの入力となるデータも YAML ファイルで与えることになります。もちろんコマンド実行時に引数として渡すことも可能です。
Overlay では、コメントとして記述された Starlark ライクな言語を含む複数の YAML ファイルを合成することができます。
どのように動作するかは、本家のこのイメージがわかりやすいでしょう。
処理の流れは、以下のようになります。
- [Calculate Data Values] インプットとなる YAML ファイル (Data Values {,Schema} Document) を入力として Final Data Value を算出
- [Evaluate Templates] Final Data Value とテンプレートのもととなる YAML ファイル ({Plain, Templated, Overlay} Document) を入力として、Evaluated Document と Overlay Document を出力
- [Apply Overlay] Evaluated Document と Overlay Document を入力として、Overlay 処理を行い、Output Document を出力
- [Serialize] Output Document を入力として、シリアライズ処理を行い YAML ファイルを生成
Templating のみの場合は、[Apply Overlay] の実質処理がなくなります。
[Calculate Data Values] では、コマンド実行時に引数として Data Values を渡すことができます。
単純な値の代入
それでは、単純な値の代入を行ってみます。
出力したい YAML ファイル
fruits:
orange: 2
pineapple: 10
lychee: 5
ここで lychee
の値が可変となるようにしたいとします。
その場合は、lychee
を可変にするために data.values.lychee
をコメントとして追加します。
data.values
は Data Values のための構造体で、lychee
はテンプレートの場所と入力時のデータを結びつけるキーとなります。
#@ load("@ytt:data", "data")
fruits:
orange: 2
pineapple: 10
lychee: #@ data.values.lychee
冒頭の #@ load("@ytt:data", "data")
は、1つ目の load() の引数 - ytt の組み込みライブラリ @ytt:data
を、2つ目の load() の引数 - data
という構造体を data
という変数でロードする、という意味になります。2つ目の引数である data
が 2 回登場していますが、これは #@ load("@ytt:data", "data")
が #@ load("@ytt:data", data="data")
の簡略表記であるためです。もし data.values
を少しでも短くしたいならば
#@ load("@ytt:data", d="data")
fruits:
orange: 2
pineapple: 10
lychee: #@ d.values.lychee
と書くこともできます。
さて話をもとに戻し、このファイルを fruits.yaml
とし、ytt
の入力とし実行すると、以下の出力が得られます。
> cat fruits.yaml
#@ load("@ytt:data", "data")
fruits:
orange: 2
pineapple: 10
lychee: #@ data.values.lychee
> ytt -f fruits.yaml --data-value-yaml lychee=5
fruits:
orange: 2
pineapple: 10
lychee: 5
以上の処理をイメージすると以下のような感じになります。
fruits.yaml
の #@ data.values.lychee
と ytt
コマンドのオプション --data-value-yaml lychee=5
が紐付けられ、fruits.yaml
の #@ data.values.lychee
に 5 という値が渡ります。そして、最終的な YAML が生成されます。
--data-value-yaml
は入力を YAML のルールでパースします。この例では、lychee=5
の 5 を String の “5” ではなく Integer の 5 として渡します。もし -v
や --data-value
とすると、その入力は String として認識されてしまいます。
> ytt -f fruits.yaml -v lychee=5
fruits:
orange: 2
pineapple: 10
lychee: "5"
jsonnet や jo の代わりに使う
–output json オプションをつけると、出力を JSON 形式にすることができます。
> ytt -f fruits.yaml -v lychee=5 --output json
{
"fruits": {
"lychee": 5,
"orange": 2,
"pineapple": 10
}
}
最近は REST を扱うことが多く、Request Body となる JSON の作成に辟易していました。 jo コマンドや jsonnet コマンドなどを渡り歩き、Kubernetes に関わることになり YAML ファイルを生成する機会も増えてきたため、ytt を使うようになりました。 出来上がりの JSON ファイルをイメージしながら YAML ファイルを作成するのは、そこそこ大変ではありますが、ytt の Templating の機能が強力なのでしばらくは ytt と戯れることが増えそうです。