最近、いろんな案件でVagrantとAnsibleを使って構成管理をするのがだいぶこなれてきたのでメモ代わりに。
構成管理って?
開発環境やステージング環境、本番環境などにおいて、ソフトウェア構成を同じ状態にしておくことは非常に重要になります。
こういった構成を管理することを構成管理というわけですが、近年、「Infrastructure as Code」という概念が取り入れられ、この構成管理自体をソフトウェアによって自動化してやろうという風になってきています。
その自動化をするツールで有名なものにChefというものがありますが、今回紹介するのは同種のツールでAnsibleというものです。
ChefじゃなくてAnsible?
Ansibleを選んだ主な理由は以下のとおりです。
- Chefは管理対象のサーバにもソフトウェアをあらかじめ入れておく必要がありそう
- Ansibleの場合ローカルにさえ入れておけばサーバ側はPythonが入っていてSSHで繋がる環境になっていればOK
- コードがymlを書くだけで良いので読み書きしやすい
- 上記から、シンプルな印象でなんとなくとっつきやすい
Ansibleは、Macの場合はHomebrewで入れるのが簡単だと思います。
brew install ansible
と、するだけです。
Vagrant
Vagrantは構成管理自体には関係しませんが、開発環境をVMで行う場合にものすごく便利なツールです。
また、ChefやAnsibleをプロビジョニングツールとして指定することができるので、Vagrantから仮想マシンを作成した後に自動的に構成管理を実行させることもできます。
開発時のメリット
Vagrant+Ansibleで環境を作っておくと、開発者間で環境を合わせるのにも便利です。
例えば古いやりかたで仮想マシンを共有しようと思ったら作成したVMのイメージを受け渡すことが考えられますが、容量がかなり大きなものになってしまいます。
また、環境がおかしくなってしまった場合にやり直すのもなかなか手間になりますし、開発者間で仮想マシンを動作させるソフトが異なる場合にも困ったことになります。
VagrantとAnsibleできちんと設定をしておけば、やることはVagrantfileとAnsible Playbookを共有するだけです。
vagrant up
するだけでゼロからでも完全な開発環境が構築されるようにできます。
テスト環境・本番環境
テスト環境や本番環境へ開発環境と同じ構成をつくる時にも、Ansibleで開発環境を管理しておけば、inventoryの接続先を変更してAnsibleを実行するだけで出来てしまいます。
ベストプラクティスなディレクトリ構造で作っておけば、環境ごとに設定ファイルを分離することもできます。
注意点
Windows上だとAnsibleの実行環境を作るのがかなり難しいようです。cygwinを入れてもうまくいかないという話もあるみたいで…。
考えたのですが、Vagrantで作ったLinux環境にAnsibleを入れてしまって、そこからlocalhostに対してPlaybookを実行すればいけるんじゃないか?と思います(Windows環境が手元にないので試してはいませんが…)。
最後に
具体的なコードベースでのサンプルなんかは要望と機会があれば書いてみたいと思います。