YAMLの書き方・使い方と記法あれこれのメモ
みなさん、YAMLはご存知ですか?Ansibleを導入することになって使っている方も多いかと思います。かくいう私も職場でYAMLに触れる機会があったので、備忘録も兼ねてYAMLの書き方や便利な記法などを紹介したいと思います。
何が良いのか
- 可読性が高い(特にプログラマには)
- 複雑なデータ構造が記述できる
- Ruby, Pythonなんかと相性が良い
ぶっちゃけXMLがオワコン
1. 基本系
YAMLは複雑なデータ構造を簡潔に書くことができるので非常に便利です。基本形として『配列』『ハッシュ』があり、これらを組み合わせることでデータを表現します。早速見ていきましょう。
配列
基本形の1つ『配列』です。以下のように-
(ハイフン)と半角スペースで表します。
- AAA
- BBB
- CCC
これは
['AAA', 'BBB', 'CCC']
と同義です。もちろんネスト(入れ子)表現もできるので
- AAA
- - aaa
- bbb
- BBB
という表現は
['AAA', ['aaa', 'bbb'], 'BBB']
になります。
ハッシュ
いわゆる連想配列ですね。:
(コロン)と半角スペースを用いて、以下のように記述します。
AAA: aaa
これは
{'AAA': 'aaa'}
こうですね。もちろんネストも可能で、半角スペース2つを頭に付けて書きます。
AAA:
BBB: bbb
CCC: ccc
は
{'AAA': {'BBB': 'bbb'}, 'CCC': 'ccc'}
と同義です。
2. ブロックスタイル、フロースタイル
上記までの例は、ブロックスタイルという記法で紹介しました。しかしこれでは、多数の要素を表現したい場合に無駄に改行が必要になります。そこで用いるのがフロースタイルです。実は、リストとハッシュのワンライナーの書き方をそのまま使えるんです。
taro:
- bag: {note: [Japanese, English]}
- game
hanako:
bag: {note: 4, pencil: 5}
このように、要所で組み合わせることで、見やすくなりますね。
3. アンカー、エイリアス
ここでYAMLの便利機能の1つ、アンカー&
とエイリアス*
を紹介しましょう。これは既に定義してあるデータをそのままコピーするような用途で使用します。
# パソコンの種類
PC:
- &w10m4
OS: Windows10
Memory: 4GB
- &w10m8
OS: Windows10
Memory: 8GB
- &mXm8
OS: OS_X
Memory: 8GB
# ユーザー
Taro:
PC: *w10m8
Hanako:
PC: *mXm8
これをユーザーTaro
で取得すると以下のようになります。
{'Taro': {'PC': {'Memory': '8GB', 'OS': 'Windows10'}}}
共通設定なんかを記述するときに重宝しますね。この時点でXMLの選択肢がなくなりました笑
ちなみにもちろんハッシュでもアンカーを設定することができますし、フロースタイルで書くこともできます。
MyPC: &MyPC {OS: Windows10, Memory: 4GB}
Jiro: {PC: *MyPC}
結果
{
'MyPC': {'Memory': '4GB', 'OS': 'Windows10'}
'Jiro': {'PC': {'Memory': '4GB', 'OS': 'Windows10'}}
}
4. マージ
さらに、エイリアスを指定するだけでなく、上書きしたりマージしたい時がありますね。そんなときはこのマージ<<:
機能を使います。
PC:
- &mXm8
OS: OS_X
Memory: 8GB
Taro:
PC:
Display: Retina
<<: *mXm8
Memory: 16GB
結果
{'Taro': {'PC': {'Display': 'Retina', 'Memory': '16GB', 'OS': 'OS_X'}}}
Display
が追加され、Memory
が上書きされていることがわかりますね。これは非常に便利な機能なので、是非活用しましょう。