このエントリーをはてなブックマークに追加

書評: 初めてのAnsible

「初めてのAnsible」 という本がオライリージャパンから発売されました。その本を頂いたので、読んでみました。

結論

結論から述べますと、この本は「初めての」と付きますが、これから使いたい人だけでなく、今現在も使っている人にとっても買うべき本だと思います。

Ansibleの実行方法、Playbook、Task、InventoryといったAnsibleを使う上での重要なところが一から順序良く書かれており、すぐに理解できるようになると思います。そういう点で初心者向けです。

それでいて、かなり注釈が多く、初心者向け、ということだけではなく、YAMLの引っかかりやすい文法上の問題や、localhostが暗黙的にinventoryに追加されるというような細かいところまできちんと書いており、現在使っている人に取っても有意義だと思います。特に、筆者はこう考えてこういうルールを適用してplaybookを書いている、といった設計に関することが書かれているのはとてもありがたいです。

また、翻訳もこなれており、読んで引っかかるところはありません。

2.0対応

2.0への対応状況というのが気になるところだと思います。この本は、Ansible: Up and Runningという本の翻訳です。原著が執筆された時にはAnsible 2.0はまだ出ていませんでしたので、当然内容は1.9対応です。

しかし、日本語訳された時に、書かれているPlaybookがすべて2.0.0.2で動作確認をしたとのことです。あまり時間もなかったでしょうに、素晴らしい。ということで、1.9互換の箇所については何の問題もありません。

さらに、付録として「Ansible 2.0」が付いており、ブロックなどの新機能について説明されています。

各章のみどころ

ここからは、各章について独断と偏見で述べていきます。これだけ読んでもよく分からないと思いますので、気になる方はぜひ買って読んでみてください。

1章: イントロダクション

Ansibleをなぜ選択するか、といったことやインストール方法などが書かれています。

Inventoryファイルはやっぱりリポジトリ内にあったほうがいいですよね。なんでデフォルトが/etc/ansible/hostsなんだろう。

2章: Playbook: はじめてみよう

Playbookの書き方と、タスクやPlayといったAnsible用語の定義です。特にYAMLの引用符が必要になるところは、ハマることが結構あるので読んでおくと良いですね。

惜しむらくはcowsayについてあんまり書いてないことです。しかも無効化する方法を書くなんて!

ハンドラについては、ぼくも必須とまでは思っていなかったので、同意ですね。あったほうがtask自体はシンプルになるので良いのですが、確かにハマるところでもあります。ちなみに、--force-handlersオプションを付けることで強制的にハンドラーを起動させることが出来ますが、ハマるときはそういうことに気が付かないものです。

3章: インベントリ: サーバーの記述

インベントリファイルです。Vagrantを使って説明しているのは良いですね。

特に、動的なインベントリについて例を上げて記述されているのが良いです。動的なインベントリは10台以上の場合は使ったほうがいいとぼくも思っています。group_byは…ぼくも使ったことが無いですねぇ…。Ansible Towerのインストールなどには使われているので、「このディストリビューションの時はまとめてこれ」とかではいいのかもしれません。

4章: 変数とファクト

変数とファクトです。とても重要です。

ローカルファクトがちゃんと書いてあるのはいいですね。これ、設置に一手間必要なのであんまり使われてないかもしれませんが、かなり便利ですよ。あと、優先順位「このリストに載っていないすべての方法」とざっくりまとめられてちょっと吹き出しましたが、正しいですね。

5章: Mezzanineの紹介

かなり純粋にMezzanineの紹介です。すいません、これ知りませんでした。

6章: Mezzanineのデプロイ

Vagrantを使った実際のデプロイです。この章を読めば、実本番環境でも対応できるようになると思います。まあ、djangoアプリに寄ってますので、その他の場合はいろいろ変更が必要だとは思いますが、基本的な流れは十分に分かります。

xip.ioは知りませんでした。便利なサービスですね。今度使おう。

7章: 複雑なplaybook

6章で説明しなかった機能の解説です。local_actionrun_oncechange_when/failed_whenなど、重要な機能がいっぱいです。とはいえ、6章と7章を読めば一通りなんでもできるようになりますね。

この章の見どころは「独自のフィルタの作成」と「独自のルックアッププラグインの作成」ですね。さっくりと飛ばしていますが、言及があるのが良いです。自分でフィルタやルックアップを作れるようになると、Ansibleでできることが飛躍的に大きくなります。「YAMLプログライミングで複雑だ」と思っている人は一度自分でフィルタを作ってみると良いと思います。

ちなみに、この章ではルックアップの次に複雑なループが書いてあります。これ、実はwith_hogeなどのループはルックアッププラグインとして実装されているからなのですが、きちんと書いてあるのが良いですね。

8章: ロール

ロールです。ロールはAnsibleの一番大事な機能です。ロールがきっちりと理解できていると、複雑な構成に対しても簡潔なplaybookで対応できるようになります。

varsとdefaultsの差は、結構悩みどころです。著者は上書きされる可能性があるものはdefaultsで、通常の変数はvarsで、という話を書いています。それは正しいのですが、往々にして後から上書きしたくなることが出てくるものです。個人的にはすべてdefaultsでいいのではないか、と思っています。

ちなみに、Ansible Galaxyについてちょっと触れていますが、ansible-galaxyコマンドはAnsible Galaxyサイト以外も指定できるようになったので、共有ロールをプライベートなgit repositoryにおいておき、組織内でansible-galaxyコマンドで共有する、というのができるようになりました。

さらに、-rオプションで、どこからどのロールを入れるかということをテキストファイルで指定できるようになったので、リポジトリに一個そのファイルを置いておくだけで、初期設定ができるようになっています。この点から考えても、ロールに分けることの重要性が分かるかと思います。

9章: Ansibleの高速化

ssh multiplexingとかです。EC2等の場合に、too long for Unix domain socketというエラーが返されることがある点について解説しているのは良いですね。pipeliningについても書いてあるのは良いです。

ファクトのキャッシュは、あんまり使ったことないですね。ファクトの収集は、通常のマシンだと(他の処理と比例して)そんなに時間がかからないので、キャッシュの不整合の方を気にしています。ただ、本当にちょっとしたtaskしか実行しない、あるいは遅いマシンの場合だと劇的に効く場合がありますので、「Ansible遅いんだけど」という方はためしてみるのもいいかと思います。

10章: カスタムモジュール

はい、カスタムモジュールです。Ansibleをちょっと深く使おうとするならば、モジュールの自作が一番です。YAMLでなんとかしようと頑張るのはナンセンスです。

この章では、Pythonでのモジュールの作り方に加えて、少しですがbashでのモジュールの作成方法も記載されています。Pythonでのモジュール作成はかなり充実したヘルパー関数が用意されているので、多くのことに対応できるため、本格的に作るならばpython一択となります。ただし、ちょっとした操作をモジュール化するのであれば、使い慣れた言語の方が良いですので、bashでの作成方法が書かれているのはとても便利だと思います。

11章: Vagrant

Vagrantとansibleプロビジョナの説明です。Vagrantで並列プロビジョンをやるやり方は知らなかったので勉強になりました。

12章: Amazon EC2

EC2です。とはいえ、AWSに限らずセキュリティグループやAMIの取得まで記載されています。この章のうち、tagとグループの関係については、頭に入れておいたほうが良いでしょう。あと、packerについても記載があるので、使ってみるのもいいかもしれません。

メモ: P.230の脚注がなにか編集段階のが残ったままになっている?

13章: Docker

Dockerです。この章では、AnsibleとDockerの関わりについて以下の二点があると書かれています。

  1. 複数のDockerを指定した順番で確実に起動するために使う
  2. Docker imageを作成する時にAnsibleを使う

このうち、1.に関しては、docker-composeのほうが良い気がします。2.についてですが、Ansibleを入れたコンテナを使う方法が記載されています。しかし、Ansible 2.0では、docker connection pluginが標準で添付されていることから、直接dockerのイメージを扱ったほうが良いでしょう。しかし、13.5.5で書かれているように、筆者はdockerイメージ作成はビルドプロセスの一部だという考えがあり、AnsibleでDocker Imageを構築はしていません。ぼくもこの考えに賛成です。

14章: Playbookのデバッグ

playbookのデバッグに役立つtipsが書かれています。ちなみに、ぼくが以前Software DesignでAnsibleに関する記事を書かせて頂いた時に、debugモジュールを真っ先に挙げました。これは、debugモジュールはデバグに必ず使うからです。

まとめ

本書はAnsibleを初めて使う人だけでなく、今実際に使っている人にもオススメの一冊です。ぜひ買いましょう。