Carpe Diem

備忘録

yttでテンプレートからYAMLを生成【基本編】

背景

  • 似たようなYAMLを毎回コピペするのは運用が辛い
  • ConfigMapのYAMLをdev, stg, prdで出し分けたい
  • CircleCIのpath filteringでparameterを自動的に増やしたい

といったようなケースでは、似たようなYAMLをパラメータだけ変更して自動生成したくなります。
そのような時はyttというツールが課題を解決できます。

Carvel - Carvel - ytt

環境

  • ytt 0.44.3

yttとは

Bazelでも使用されているStarlark言語をベースとしたYAMLのテンプレート&パッチツールです。

yttの良い点としては

  • Go製でシングルバイナリなのでインストールが楽
  • テンプレート機能がある
    • 変数を外部ファイルで扱えるのでサービス毎であったり、dev/prdといった個別化が可能
  • オーバーレイ(パッチ)機能があるのでベースのテンプレートを柔軟に編集できる
  • 関数定義ができるのでアンカーで頑張らずともモジュール化ができる

といったところでしょうか。

Kubernetes、Docker Compose、CircleCI、Github ActionsなどYAMLで設定を書くことは多いですが、複数のサービスを扱ったりすると同じようなYAMLを何度も用意する(コピペ)必要が出てきます。
さらに共通化ができていないとアクティブじゃないサービスはメンテされなかったりと運用が辛くなってきます。

yttはそれらの再利用性を向上することが可能なツールです。

他プロダクトとの比較は公式ドキュメントにも載っています。

Carvel - ytt - ytt vs x

基本的な使い方

インストール方法は以下です。

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

変数定義

変数を定義して値を自由に入れられます。
また外部ファイルから値を注入することもできます。

#@ my_map = {
#@   "key1": "value1",
#@   "key2": "value2",
#@ }

#@ some_list = [my_map, "item2"]

list_with_a_map: #@ some_list

https://carvel.dev/ytt/#example:example-variable

結果

list_with_a_map:
- key1: value1
  key2: value2
- item2

if

if文で処理を分けることが可能です。
ただif文が増えるとテンプレートが複雑化するので、それよりは変数を増やして個別化して行く方がシンプルに保てて筋が良いと思います。

#@ if True:
key1: boolean-if
#@ end

#@ foo = 10
#@ if foo > 0:
key2: int-if
#@ end

#@ if "hoge" == "hoge":
key3: string-if
#@ end

#@ if foo > 10:
key4: then
#@ else:
key4: else
#@ end

結果

key1: boolean-if
key2: int-if
key3: string-if
key4: else

for loop

for文はindexでも扱えますし、rangeがなければ値を直接扱うこともできます。

array:
#@ for j in range(0,4):
- item: #@ j
#@ end

array_with_data:
#@ for val in [1,5,{"key":"val"}]:
- item: #@ val
#@ end

array_with_index:
#@ arr = [1,5,{"key":"val"}]
#@ for i in range(len(arr)):
- val: #@ arr[i]
  index: #@ i
#@ end

結果

array:
- item: 0
- item: 1
- item: 2
- item: 3
array_with_data:
- item: 1
- item: 5
- item:
    key: val
array_with_index:
- val: 1
  index: 0
- val: 5
  index: 1
- val:
    key: val
  index: 2

関数

関数定義をすることでモジュール化ができます。

#@ def some_data():
#@   return [1,2,{"key":"value"}]
#@ end

simple_key: #@ some_data()

結果

simple_key:
- 1
- 2
- key: value

コメント

ytt YAML自体のコメントは#!で書けます。

#! This is my map.
#@ my_map = {
#@   "key1": "value1",
#@   "key2": "value2",
#@ }

#@ some_list = [my_map, "item2"]

list_with_a_map: #@ some_list

結果

list_with_a_map:
- key1: value1
  key2: value2
- item2

しかし生成されたYAMLにコメントを残す機能は現状提供されていないです。

github.com

まとめ

yttのメリットと基本的な使い方を説明しました。
次回は変数に外部ファイルから値を注入したり、オーバーレイによるパッチ方法を解説しようと思います。

参考