不思議の国のAnsible – 第4話


 
logo


不思議の国のAnsible1

第4話 全ては脚本のままに

 

前回より続く

 

はじめての playbook

 


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

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


icon_bob01よしっ、それでは早速 playbook を書いていこう!
icon_alice01はい! お願いします!
icon_bob01と、その前に……以前 ansible コマンドを実行したとき
SSH接続のための鍵の設定をしたのを覚えてる?
icon_alice01はい。
icon_bob01実は、鍵の設定を Ansible の hosts ファイルに書いておくこともできる。
こうすれば playbook を実行するときにもその鍵を使ってログインできるんだ。

/etc/ansible/hosts

icon_bob01このように、ansible_ssh_user と ansible_ssh_private_key_file を指定しておこう。
icon_alice01はい。できました。

icon_alice01ちゃんとつながりますね。
icon_bob01よし、ではこのような YAML ファイルを作ってみよう。
04-01.yml

icon_alice01たったこれだけですか?
icon_bob01うん。playbook として必要な最低要素はこれだけなんだ。

まず最上位にシーケンスを作って、その中にマッピングを書く。
マッピングには hosts と tasks という 2つの名前が定義されているね。

hosts には値を文字列として書いて、
tasks にはさらに内部にシーケンス書く。そのシーケンスの中身が、ping という名前のマッピングだね。

icon_alice01きちんと YAML のフォーマットに沿っていますね。
icon_bob01hosts の箇所には、どのサーバに対して処理を行うかを書く。
今回は all と書いてあるので、さっき書いた Ansible の hosts ファイル中に登録されている全てのサーバが対象となる。

tasks には、実行すべきモジュールとそのパラメータをシーケンスとして書くんだけど
ping モジュールはパラメータを必要としないので、値は空になっている。

tasks の直下のシーケンス一個一個がそれぞれタスクとして認識されるんだ。

icon_alice01Python で構造をチェックしてみますね。

icon_alice01ping に対応する部分には None が入るんですね。

それでは、実行してみましょうか。

icon_bob01ちょっと待って。その前に構文チェックをしてみよう。

環境によっては以下のようなメッセージが表示されることがあります。
これは EPEL のビルド済みパッケージのバージョンが原因で表示される警告であり、対応するライブラリ(gmp)を更新すれば解消されます。

Ansible の動作上は問題ないのでメッセージは無視して構いません。

icon_bob01このように表示されればOKだ。

icon_alice01大丈夫でした!
icon_bob01ちなみに、例えば hosts を書き忘れるとこんな感じになる。

icon_alice01書き間違いにすぐ気づけるのは便利ですね。
icon_bob01–list-hosts や –list-tasks も、事前に情報を確認するための便利オプションだ。

icon_bob01では playbook を実行してみよう。ansible-playbook コマンドのパラメータとして YAML ファイルのパスを渡すだけでいい。

icon_alice01ok と結果が返ってきましたね。
icon_bob01おめでとう!
ちなみに -v オプションを付けると、詳細な情報を表示できる。
-vv , -vvv まで 3段階で詳細度を変えられるよ。


 

playbook を繰り返し実行する

 

icon_bob01次は、新しく覚えたモジュール yum を使ってみよう。
icon_alice01はい。
icon_bob01これは、その名の通り yum コマンドを ansible で実行するためのモジュールなんだ。
icon_alice01ansible-doc で使い方を調べると、具体的な使用例が出てきました。

icon_bob01だいぶ慣れてきたようだね。
今回はそうだな……Webサーバの Nginx2をインストールしてみようか。
icon_alice01あ、はい。Nginx は使ったことがありますっ!
icon_bob01標準リポジトリにはないので、まずは EPEL リポジトリをインストールして、
その後で Nginx をインストールする YAML ファイルを書くよ。
icon_alice01わかりました。
icon_bob01ping モジュールの時と同じように tasks の下のシーケンスに yum と書いて、値にこんなふうに書いてみよう。
04-02.yml

このように パラメータ=設定値 という形式で書くことで、Ansible の中でモジュールのオプションを指定することができるんだ。

icon_alice01なるほど。name に指定するのは URL でもパッケージ名でもいいんですね。
icon_bob01その通り。
icon_alice01state=present というのはどういう意味ですか?
icon_bob01パッケージがインストールされていなかったら最新版をインストールして、
既にインストールされていたら何もしないという意味だよ。

他のオプションとしては、常に最新版をインストールする state=latest、
パッケージを削除するための state=absent がある。

icon_alice01では実行してみますね。一応構文チェックもやってみます。

icon_alice01あら、エラーになってしまったみたいです。
icon_bob01あ、そうだ、yum コマンドの実行には root 権限が必要だったんだ。

こんなふうに sudo: True という項目をマッピングに追加すれば、サーバ上の全てのコマンドを sudo 付きで実行してくれるよ。

icon_alice01はい。
icon_bob01そうそう、ansible-playbook には –check というオプションもある。

実際の変更を一切行わずに、どのような挙動が起こるかをあらかじめチェックできるんだ。

icon_alice01やってみます!

icon_alice011個エラーになってしまいました。
icon_bob01メッセージをよく見てごらん。
‘nginx’ というパッケージが見つからなかったみたいだけど、まだ EPEL をインストールしていない状態なのでこれは仕方ないんだ。

他は大丈夫そうだね。では本番、実行してみよう。

icon_alice01はい。

icon_alice01うまくいったみたいです!
changed=2 というのが 2つのパッケージのインストールが成功したという意味でしょうか。
icon_bob01ためしにもう一度、同じコマンドを実行してごらん。

icon_alice01今度は changed=0 になりました。
TASK の下の行も changed から ok に変わりましたね。
icon_bob011回目はまだインストールされていない状態なので、インストール処理、つまり変更が行われた。
それが成功したので「changed」と表示されたんだ。
2回目は既にインストール済みで、それが正しい状態であるので変更は行われず、
「ok」とされた。

こんなふうに、何回やっても状態が変わらないから、playbook を繰り返し実行しても安心なんだ。

icon_alice01なるほど。
icon_bob01実際に Nginx がインストールされたか確かめてみる?

icon_alice01ちゃんと、EPEL 経由で Nginx がインストールされています。
icon_bob01よかった。これで一安心だ。
あと、細かいところだけど表示されるタスクの表示名は、YAMLファイルで
こんなふうに指定することもできる。
04-03.yml

icon_alice01動かしてみます。

icon_alice01表示がだいぶスッキリしました……
ほんと、同じタスクを何度も動かせるのはいいですね。
icon_bob01「今どこまでやったっけ」ということを気にする必要がないからね。
特に、前回の作業から一定の期間が空いていたりするサーバだと、ありがたみが倍増する。
icon_alice01Ansible の世界の心地よさがちょっとだけ分かった気がします。
これから、playbook の使い方やモジュールをもっと覚えていきたいです。
icon_bob01Ansible の構成はすごくシンプルだから、アリスならきっとすぐにマスターできるよ!
icon_alice01ありがとうございます!

満足感に包まれたアリスは眩しい光に包まれていく。
するとアリスはこの不思議な夢から覚めて、日常の世界へと戻っていた。

次回へつづく

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


  1. 画像素材 http://kage-design.com/wp/ []
  2. http://nginx.org/ja/ []