背景
- 似たようなYAMLを毎回コピペするのは運用が辛い
- ConfigMapのYAMLをdev, stg, prdで出し分けたい
- CircleCIのpath filteringでparameterを自動的に増やしたい
といったようなケースでは、似たようなYAMLをパラメータだけ変更して自動生成したくなります。
そのような時はyttというツールが課題を解決できます。
環境
- ytt 0.44.3
yttとは
Bazelでも使用されているStarlark言語をベースとしたYAMLのテンプレート&パッチツールです。
yttの良い点としては
- Go製でシングルバイナリなのでインストールが楽
- テンプレート機能がある
- 変数を外部ファイルで扱えるのでサービス毎であったり、dev/prdといった個別化が可能
- オーバーレイ(パッチ)機能があるのでベースのテンプレートを柔軟に編集できる
- 関数定義ができるのでアンカーで頑張らずともモジュール化ができる
といったところでしょうか。
Kubernetes、Docker Compose、CircleCI、Github ActionsなどYAMLで設定を書くことは多いですが、複数のサービスを扱ったりすると同じようなYAMLを何度も用意する(コピペ)必要が出てきます。
さらに共通化ができていないとアクティブじゃないサービスはメンテされなかったりと運用が辛くなってきます。
yttはそれらの再利用性を向上することが可能なツールです。
他プロダクトとの比較は公式ドキュメントにも載っています。
基本的な使い方
インストール方法は以下です。
$ 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にコメントを残す機能は現状提供されていないです。
まとめ
yttのメリットと基本的な使い方を説明しました。
次回は変数に外部ファイルから値を注入したり、オーバーレイによるパッチ方法を解説しようと思います。