KCLは、YAMLを安全かつ可読性高く記述できる設定言語です。Kubernetesとの相性が良く、マニフェストがYAMLであることに悩まされている方にはぜひ試してほしい言語です。
KCLは一見すると単なる"Better YAML"です。しかし、KCLの真の力は単なる"Better YAML"としての使用にとどまりません。本稿では、kcl run
コマンドの引数機能を活用して、KCLを動的なYAMLジェネレーターへと進化させる方法を解説します。
なぜYAMLジェネレーターが必要か?
Infrastructure as Code (IaC)やKubernetesの設定ファイルなど、現代のクラウドネイティブな環境では大量のYAMLファイルを管理する必要があります。環境やパラメータによって微妙に異なる設定ファイルが必要になることも多々あります。
これらの課題に対して、KCLを「YAMLジェネレーター」として使用することで:
- 環境ごとの設定値を動的に注入
- 共通部分のテンプレート化
- 型安全性の確保
といった利点を得ることができます。
基本的な使い方:静的なYAML生成
まず、シンプルなKCLファイルから始めてみましょう:
message = "Hello Alice"
このファイルをkcl run
コマンドで実行すると:
kcl run main.k
次のようなYAMLが出力されます:
message: Hello Alice
これだけでは単なる"Better YAML"ですね。では、これを動的なジェネレーターに進化させていきましょう。
YAMLジェネレーターへの進化:引数の導入
Step 1: 基本的な引数の受け取り
KCLの「Top-level argument」機能を使って、実行時に値を注入できるようにします:
_name = option("name")
message = "Hello ${_name}"
実行時に引数を渡すことで、動的にYAMLを生成できます:
kcl run main.k -D name=Bob
出力:
message: Hello Bob
💡 Tips: 変数名の先頭の_
(アンダースコア)には特別な意味があります。アンダースコアで始まる変数は最終的なYAML出力から除外されます。これにより、生成に使用する中間変数とYAMLに出力したい変数を明確に区別できます。
Step 2: 堅牢性の向上
必須引数の設定
実行時の引数忘れを防ぐため、必須パラメータを設定できます:
_name = option("name", required=True)
message = "Hello ${_name}"
引数なしで実行すると、親切なエラーメッセージが表示されます:
EvaluationError
--> /path/to/main.k:1:1
|
1 | _name = option("name", required=True)
| option('name') must be initialized, try '-D name=?' argument
|
デフォルト値の設定
オプショナルな引数にはデフォルト値を設定できます:
_name = option("name", default="Alice")
message = "Hello ${_name}"
この場合:
# デフォルト値が使用される
kcl run main.k
message: Hello Alice
# 引数で上書き可能
kcl run main.k -D name=Bob
message: Hello Bob
Step 3: 型安全性の確保
数値を扱う場合など、型の制約が重要なケースではtype
パラメータを使用します:
number = option("number", type="int")
next_number = number + 1
不正な型の値を渡すと、コンパイル時にエラーが検出されます:
kcl run main.k -D number=foo
EvaluationError
--> /path/to/main.k:1:1
|
1 | number = option("number", type="int")
| cannot use 'foo' as type 'int'
|
まとめ
KCLの引数機能を活用することで:
- 静的なYAML定義から動的なYAMLジェネレーターへ
- 環境やパラメータに応じた柔軟な設定生成
- 型安全性による堅牢な設定管理
- テンプレート化による設定の再利用性向上
が実現できます。
これにより、KCLは単なる"Better YAML"から一歩進んで、より強力な設定管理ツールとして活用できます。大規模なシステムの設定管理や、マルチ環境対応が必要なプロジェクトで、その真価を発揮するでしょう。