YAMLの書き方・使い方と記法あれこれのメモ

YAML 2016年1月22日

みなさん、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が上書きされていることがわかりますね。これは非常に便利な機能なので、是非活用しましょう。

slont

金融ベンチャーでWebエンジニア

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.