不思議の国のAnsible – 第3話


 
logo


不思議の国のAnsible1

第3話 脚本のつくりかた

 

前回より続く

 

YAML Ain’t Markup Language

 

icon_alice01でもこうやってコマンドを実行できるのは確かに便利ですけど、
手で作業するのとあんまり変わらないような気もします……
icon_bob01うん、実はサーバの構築や運用にあたって ansible コマンドを直接実行
する場面はほとんどない。
Ansible では あるべき状態をファイルに記述して、それを実行するという
スタイルが普通なんだ。

icon_bob01ところでアリス、きみは普段の仕事でメモを取っているかい?
icon_alice01ええ。メモアプリ使ったり、手書きでノートに書いたり……とか色々ですけど、なるべく書くようにはしていますね。

『自分の行動を記録する(ログる)のがインフラエンジニアの基本』ですから。
(先輩の受け売りだけど……)

icon_bob01いい心がけだね。
もしそのメモが自動的に動き出したら、素敵じゃない?
icon_alice01えっ? そんなこと、あるわけないですよ……
icon_bob01その動かせるメモが playbook なんだ。
icon_alice01動かせる……なるほど! 勝手に働いてくれる手順書みたいなものですかね。
icon_bob01最初はメモだったものも、積み重ねるとやがて壮大な脚本になっていく。
とはいえ千里の道も一歩から。まずはフォーマットを覚えることからはじめよう。
icon_bob01playbook は、YAML2と呼ばれる形式で書く必要がある。
icon_alice01わいえーえむえる? XML の仲間でしょうか?
icon_bob01さすが鋭いね。XML や JSON のような構造化されたデータの記述方式の一つなんだけど、シンプルで人が読みやすいという特徴がある。
ちなみに「やむる」と読むのが一般的かな。
icon_alice01何の略なんですか?
icon_bob01YAML Ain’t Markup Language。
直訳すると「YAMLはマークアップ言語ではない」となる。
icon_alice01……って、あれ? 説明自体に略称が含まれていますね……結局 YAML の Y って何なのでしょう?
icon_bob01ははは、これはある種の言葉遊びだから 3、そんなに深く考えなくていいさ。
icon_bob01さて、本題に戻ると……
YAML の書き方を覚えて、playbook を書けるようになろう。
ポイントはそんなに多くないけどね。
icon_alice01はい、がんばります!
icon_bob01まずファイルの先頭の行にハイフン(-)を3つ書く。
これが、ここから YAML 文書の記述が始まる、という合図になる。

icon_alice01はい。
icon_bob01次に、シーケンスの書き方。
他のプログラミング言語で配列とかリストとか呼ばれる概念に近いけど、同じ階層の要素を順番に並べて書くときに使う。
行の先頭にハイフン(“-”)と半角スペース(” “)を書いて、その後に続けて内容を書くよ。
03-01.yml

icon_alice01はい。ファイルを作って書いてみました。何か確認する方法はあるのでしょうか?
icon_bob01やり方は色々あるけど……
そうさね、たとえば Python を使って YAML を読み込んでみよう。
さっきの内容を 03-01.yml として保存してこんなコマンドを打てば
Python のオブジェクトとして解釈された内容が表示される。
そうそう、ファイルの拡張子は “.yml” を使うといいよ。

icon_alice01やった! うまくいきました。
icon_bob01内容をシングルクォーテーション(‘)やダブルクオーテーション(“)で囲むと、
内部的に文字列として扱われるようになる。
今回はもともと文字列なので、同じ結果になるね。
03-02.yml

icon_bob01シーケンスの値として、中にシーケンスを入れることもできるよ。
03-03.yml

icon_bob01この場合、インデントの位置によって階層が決まっていくんだ。
インデントはスペース2個にすることが多いね。
icon_alice01あれっ? 何だかエラーが出てしまったみたいです。

icon_bob01アリス、作ったファイルを見せてくれるかい?
icon_alice01あ、はい。これなんですけど……
03-04.yml (フォーマットエラー)

icon_bob01フムフム。ファイルをよく見てごらん、一箇所インデントがずれているところがあるよ。
icon_alice01ほんとだ…… b2の部分ですね。ハイフンの前のスペースが1個足りませんでした。
icon_bob01このように、YAML ではインデントの位置が厳しくチェックされる。
インデントとしてタブ文字を使ってもエラーになるから注意してね。
icon_bob01次はマッピングを使ってみよう。
マッピングというのは、要は名前と値の組み合わせで、他のプログラミング言語におけるハッシュマップとかマップ、ディクショナリ、キーバリューペアと呼ばれる概念に対応するものだ。

まぁ例を見せたほうが早いか。こんな感じで、名前と値をコロンで区切って記述するよ。

03-05.yml

icon_alice01表示される順番が変わりましたね。
icon_bob01うん、マッピングの場合、値にアクセスする時にはその名前(キー)だけが手がかりになる。
書いた順番は評価されないんだ。

逆に、同じ名前(キー)を同じ階層で複数書くと正しく認識されない4 ので気をつけよう。

icon_alice01はい。
icon_bob01シーケンスとマッピングを組み合わせると、こんなふうに構造化されたデータが作れる。
03-06.yml

icon_alice01直感的で分かりやすいですね!
icon_bob01シーケンスとマッピングの書き方さえ覚えれば、もう YAML はほとんどマスターしたようなもんさ。

そうそう、さっきのファイルだけど、True や False というキーワードは
文字列でなくて真偽値(ブール値)として評価されている。このようなキーワードは他にもあるんだ。

プログラムでどのように評価されているか、注意深くみてほしい。

03-07.yml

icon_alice01なるほど。よくわかりました。
icon_bob01# で始まる行はコメントとして扱われ、実際のデータとしては見なされない。
行の途中でコメントを書くこともできる。これは Shell Script や Python と同じだね。
03-08.yml

icon_alice01ちなみに、複数行にまたがる文章をデータとして登録することはできるのですか?
icon_bob01もちろん可能さ。改行を含んだ文章を書くときは、その要素の先頭の行にこんな風に
縦棒(パイプ)を書けばいい。
03-09.yml

icon_bob01\n というのが改行を意味しているよ。
YAMLファイルの 3行目以降、インデントを揃えることに注意してね。
icon_alice01ありがとうございます。
だいたい YAML の書き方をイメージできるようになりました。
icon_bob01素晴らしい! どうやらまたレベルアップしたみたいだね。


アリスは レベルが上がった!

コマンド ansible-playbook を手に入れた!
モジュール yum をおぼえた!


icon_bob01よしっ、それでは早速 playbook を書いていこう!

次回へつづく

 
最後までお読みいただき、どうもありがとうございました。


  1. 画像素材 http://kage-design.com/wp/ []
  2. The Official YAML Web Site []
  3. 再帰的頭字語 – Wikipedia []
  4. あとに書いたもので上書きされる []