post-thumb

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 ファイルを合成することができます。

どのように動作するかは、本家のこのイメージがわかりやすいでしょう。

ytt のパイプライン処理

処理の流れは、以下のようになります。

  1. [Calculate Data Values] インプットとなる YAML ファイル (Data Values {,Schema} Document) を入力として Final Data Value を算出
  2. [Evaluate Templates] Final Data Value とテンプレートのもととなる YAML ファイル ({Plain, Templated, Overlay} Document) を入力として、Evaluated Document と Overlay Document を出力
  3. [Apply Overlay] Evaluated Document と Overlay Document を入力として、Overlay 処理を行い、Output Document を出力
  4. [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

以上の処理をイメージすると以下のような感じになります。

Simple Pipeline

fruits.yaml#@ data.values.lycheeytt コマンドのオプション --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 と戯れることが増えそうです。

comments powered by Disqus