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<<

あるアンカーを呼び出して、さらに同じレベルで追加します。

用途: ある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などに設定をまとめることで可読性も高めることができる。