ときどきAnsible日記

主にITインフラ基盤の自動化に関する事を書いているブログです

YAMLについて

お疲れ様です。伊藤です。
暑かった夏も終わり季節はすっかり秋....と思いきやまた暑い日が続いております。全く今年はほんとに異常気象ですね。
私はと言えば、相変わらずOpenStackを触っております。う~ん、OpenStackもあまりにも奥が深いのでなんとか沈まないように暴れてギリ浮いている感じ。


さて、今回は実はAnsibleで最初の砦になるんじゃないかと個人的に思っているYAMLです。YAMLはヤメルとかヤムルと読み、データを書くための記法、構文になるものです。で、Ansibleではデータを書く場合にはYAMLが使われますし、ServerSpecでも当たり前に使われておりますが、この辺意外にわかりづらい部分が多く、分かったようで間違ってハマるということが(個人的には)よくあります。というわけで今更感はありますがYAMLについてちょっと今回書いていきたいと思います。

wikipediaによると以下のような感じ

YAML再帰的に定義された頭字語であり "YAML Ain't a Markup Language"(YAMLマークアップ言語ではない)の意味である。初期には "Yet Another Markup Language"(もうひとつ別のマークアップ言語)の意味と言われていたが、マークアップよりもデータ重視を目的としていたために後付されてできた名前である。しかしながら XML(本当のマークアップ言語)がデータシリアライズ目的のために頻繁に使用されるため、 YAMLを軽量マークアップ言語と考えることもできる。類似の規格としてJSONがある。

う~ん...相変わらずこの手の説明は訳が分かりません。要はマークアップ言語(マークアップ言語はXMLみたいなタグで囲むようなやつです、HTMLとか)じゃないよ、ってことでタグ使わないよ、という意味だと思っています。

じゃあどうやってデータを書くの?となりますが、個別にみると非常に簡単です。


ハッシュ
まずはハッシュと言われるデータの書き方。基本はこれです。

キー: 値

キー書いてコロンとスペース入れて値です。実際に値を入れるとこんな感じ

user_name: johnd
user_id: 1040
user_group: admin

Ansibeで使うときは文字列はダブルコーテーションで囲うのが通例かと思います。まあ実際は囲わなくても動きますが...でこのように定義された変数はAnsibleでは下記のように読み込めます。

 - user:
    name: {{user_name}}
    uid: {{user_id}}
    group: {{user_group}}

呼び出し側もYAMLなので分かりづらいですね...userモジュールの詳細はこちらをご参照ください(AnsibleのModule:user - ときどきAnsible日記


リスト
このままだとちょっと意味が無いように見えます。ユーザデータであれば、ユーザー名を複数入力して繰り返し処理とかしたいもの。そこでYAMLにはリストという機能があります。これは一つの項目に複数の値を入れられるというものです。ITっぽく言うと要は配列です。値やキーの頭にハイフンを入れることで複数入力が可能になります。

user_name: 
  - johnd
  - edy
  - michel


ネスト
ここでさりげなくネストを行っています。ネストとは要は頭のスペースでこれを打つことで一段上の項目の子供になります。スペースは2つで1段になります。

親A:
  - A子供1
  - A子供2
  - A子供3
親B:
  - B子供1
  - B子供2
  - B子供3
  

これは親Aというキーに子供という値を複数入れるために値の頭にハイフンが入り、それぞれネストさせています。これで値的には

親A =>[A子供1],[A子供2],[A子供3]
親B =>[B子供1],[B子供2],[B子供3]

と、なり呼び出す際には

親A[2] => A子供2

というように呼べます。
で、同じキー名が並ぶ場合にはキー名の頭にハイフンが入ります。例えば先ほどのuserモジュールに入れる値を配列にして作成しようとすると

user_data: 
  - user_name: johnd
    user_id: 1040
    user_group: admin
  - user_name: edy
    user_id: 1041
    user_group: apache
  - user_name: michel
    user_id: 1042
    user_group: test

というようなイメージになります。このような形であればuserモジュール内で繰り返しユーザを作成するPlaybookを組むことができます。

私の知る限りYAMLはハッシュとリストとネストの組み合わせです。なので分かってしまえば非常に単純なのですがネストやリストが複雑になっているYAMLはやはり読みにくいもの。そのあたりはソース同様読みさすさなども重視する必要があります。


今回は以上です。ちょっとわかりづらいのでまたやるかもしれません。