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はやはり読みにくいもの。そのあたりはソース同様読みさすさなども重視する必要があります。
今回は以上です。ちょっとわかりづらいのでまたやるかもしれません。