Kekeの日記

エンジニア、読書なんでも

YamlのAnchor&、Extend<<、Extended Inline<< &について

本記事

CIやKubernetesなどインフラに関する設定項目は、多くの場合yamlで書くようになります。

つまり、yamlをマスターすることが、CIやPaasなどのドキュメントを読むくらい大事なのです。

CircleCIやテンプレートを書くときなど、yamlを書くことは多い一方で、肥大化しまいがちです。 &<<を使うことで簡単にファイル内モジュール化のようなことができるので紹介します。

注意

アンカーとして定義するfooは出力されないと仮定します。

yamlは外部ファイルなどにモジュールをまとめられないのか?」とよく聞かれますが、できないようです。

ちなみに文字列連結などもできないようなので、できることが非常に限られています。

Anchor&

&を使ってアンカーを定義し、*で呼び出すことができます。

用途は使いまわしたいときです。変数代入のような感覚で使うことができます。

foo: &foo
 name: "Pupu"
 age: 12

bar: *foo
{
    "bar": {
        "name": "Pupu"
        "age": 12
    }
}

のようになります。

イメージとしてはfooの中身を渡しています

Extend<<

あるアンカーを呼び出して、さらに同じレベルで追加します。Keyに<<を使うため、Keyに紐付かないです

用途: あるAnchorの内容を同じレベルで渡したい時に使う。

<<: *[アンカー名]のように使います。

foo: &foo
 name: "Pupu"
 age: 12

bar:
   <<: *foo
   email: "kukakuka@gmail.exp"
{
    "bar": {
        "name": "Pupu"
        "age": 12
        "email": "kukakuka@gmail.exp"
    }
}

Extendもあるように<<を書いたオブジェクトに挿入して拡張します。

イメージとしては<<と同じレベルで内容を渡しています

Extended Inline << &

一部しか継承したくないときに使用する。

用途: とあるアンカーをextend<<したいが、一部しかしたくないとき

foo:  &foo
 <<: &foo_password
   password: "nemeneme"
 name: "Pupu"
 age: 12

bar:
   <<: *foo_password
   email: "kukakuka@gmail.exp"
{
    "bar": {
        "password": "nemeneme",
        "email": "kukakuka@gmail.exp"
    }
}

少し複雑ですね。

デバッグ方法のすすめ

yqというpythonのライブラリを使うと簡単に確認をすることができます。

pip install yq

cat config.yml | yq "."

まとめ

  • anchorextendを使ってyamlで書かれた設定を管理しやすくすることができる。
  • また、refercensesなどに設定をまとめることで可読性も高めることができる。