kakakakakku blog

Weekly Tech Blog: Keep on Learning!

ytt を使ってテンプレートから YAML を生成する

記述したテンプレートから YAML を生成するツール 「ytt」 を試す.ytt は YAML に対して「テンプレート機能」「オーバーレイ機能」が使える.VMware 社を中心に開発されているツールセット Carvel に含まれている.

carvel.dev

YAML のテンプレート機能やオーバーレイ機能と言えば,特に Kubernetes の文脈だと KustomizeHelm が代表的だと思う.ytt も似たように使えるけど Kubernetes に限らず「汎用的に使える」というメリットがある.他にはテンプレート構文を含めても「YAML フォーマットとしては valid のまま」という点もメリットに挙げられると思う.汎用的に使えるということは,例えば AWS CloudFormation テンプレートを生成することにも活用できる.ytt と関連ツールの違いは以下のドキュメントに詳細に載っている.

carvel.dev

インストール

今回は Homebrew で macOS にインストールする.最新版 v0.41 を使う.

$ brew tap vmware-tanzu/carvel
$ brew install ytt
$ ytt version
ytt version 0.41.1

ドキュメントに載っている Shell Completion を設定すれば ytt コマンドの補完も使えるようになる.

$ ytt completion zsh > /usr/local/share/zsh/site-functions/_ytt

$ ytt [tab] 
completion  -- Generate the autocompletion script for the specified shell
fmt         -- Format YAML templates
help        -- Help about any command
template    -- Process YAML templates (deprecated; use top-level command -- e.g. `ytt -f-` instead of `ytt template -f-`)
version     -- Print version
website     -- Starts website HTTP server

carvel.dev

もし ytt をササッと試すならドキュメントに含まれている「Interactive Playground」を使うと便利!

ytt を試す : テンプレート機能

ytt では YAML のコメント記法 #@ を使ってテンプレートを記述する.そして ytt -f xxx.yaml のように ytt コマンドを実行すると YAML を生成できる.基本的な構文を試していく.

1. 変数

ytt YAML

#@ title = 'kakakakakku blog'
#@ author = 'kakakakakku'
#@ url = 'https://kakakakakku.hatenablog.com/'
blog:
  title: #@ title
  author: #@ author
  url: #@ url

生成した YAML

blog:
  title: kakakakakku blog
  author: kakakakakku
  url: https://kakakakakku.hatenablog.com/

2. if (boolean)

ytt YAML

#@ is_debug = True

#@ if is_debug:
debug: enabled
#@ else:
debug: disabled
#@ end

生成した YAML

debug: enabled

3. if (>=)

ytt YAML

#@ score = 70
#@ threshold = 80

#@ if score >= threshold:
result: pass
#@ else:
result: fail
#@ end

生成した YAML

result: fail

4. for (index)

ytt YAML

ids:
#@ for id in range(0, 5):
- #@ id + 1
#@ end

生成した YAML

ids:
- 1
- 2
- 3
- 4
- 5

5. for (value)

ytt YAML

users:
#@ for name in ['alice', 'bob', 'kakakakakku']:
- #@ name
#@ end

生成した YAML

users:
- alice
- bob
- kakakakakku

6. 関数

ytt YAML

#@ on_sale = True
#@ def price(x):
#@   if on_sale:
#@     return x * 0.7
#@   else:
#@     return x
#@   end
#@ end

price: #@ price(1000)

生成した YAML

price: 700

ytt を試す : オーバーレイ機能

オーバーレイ機能を使うと YAML を部分的に書き換えられる.例えば「プロダクション環境」「開発環境」で YAML の値を変えられる.そして ytt -f _config.yaml -f xxx.yaml のように ytt コマンドを実行すると YAML を生成できる.

1. 上書き

ytt YAML (template)

autoscaling:
  min: 1
  max: 1

ytt YAML (config)

#@ load("@ytt:overlay", "overlay")

#@overlay/match by=overlay.all
---
autoscaling:
  min: 5
  max: 20

生成した YAML

autoscaling:
  min: 5
  max: 20

2. 追加

ytt YAML (template)

users:
- admin

ytt YAML (config)

#@ load("@ytt:overlay", "overlay")

#@overlay/match by=overlay.all
---
users:
- prd-user1
- prd-user2
- prd-user3

生成した YAML

users:
- admin
- prd-user1
- prd-user2
- prd-user3

まとめ

記述したテンプレートから YAML を生成するツール 「ytt」 を使って基本的な「テンプレート機能」「オーバーレイ機能」を試した.Kubernetes に限らず「汎用的に使える」のは便利だと思う.そして簡単に使えるので導入自体もしやすいと思う.テンプレート構文を含めても「YAML フォーマットとしては valid のまま」なのもメリットだとは思うけど,YAML のコメント記法 #@ に依存している仕組みは複雑になりすぎると個人的にはちょっと可読性の観点でデメリットになりそうだと感じた.なお #@ に続いて書く擬似コードは Starlark に準拠している.

ytt のドキュメントを読んだら他にも多くの構文をサポートしていた.使えそうな機会があったら導入してみるぞ!

github.com