Vagrant は VirtualBox を使って VM を簡単に構築できるプロダクトです。既に多くの情報が出回ってるのでここでは詳しく説明しませんが、開発者にとっては非常に役立つツールとなっていますね。今回はただ Vagrant を使って VM を構築するだけではなく librarian-chef という gem を使って、より簡単に環境構築することを目指します。
librarian-chef
librarian-chef は Chef 版の Bundler のようなツールです。 Cheffile というファイルに (Bundler の Gemfile みたいだ) 必要なクックブックの名前やリポジトリを指定していきます。
インストール
まずはインストールします。 gem なのでインストールはコマンド一発。
$ gem install librarian-chef
これで librarian-chef
というコマンドが使えるようになっているはずです。 rbenv などを使っている場合は
$ rbenv rehash
も忘れずに。
Cheffile の作成
インストールが終わったら
$ librarian-chef init
とコマンドを実行します。するとカレントディレクトリに Cheffile というファイルが以下のような内容で出来ているはずです。
#!/usr/bin/env ruby
#^syntax detection
site 'http://community.opscode.com/api/v1'
# cookbook 'chef-client'
# cookbook 'apache2', '>= 1.0.0'
# cookbook 'rvm',
# :git => 'https://github.com/fnichol/chef-rvm'
# cookbook 'postgresql',
# :git => 'https://github.com/findsyou/cookbooks',
# :ref => 'postgresql-improvements'
実は Chef のクックブックは Chef の開発元である Opscode のコミュニティに、有志が作ったレシピが沢山保存されています。
librarian-chef では主にこの Opscode のコミュニティで公開されている Chef のクックブックを、依存関係を解決して取得してきてくれます。また、デフォルトの Cheffile を見てもわかるように git リポジトリから取得することも出来ます。
今回はとりあえず
- apache2
- php5
- mysql5
- git 管理する独自のクックブック
を入れてみたいと思います。そうすると以下のような Cheffile になります。
#!/usr/bin/env ruby
#^syntax detection
site 'http://community.opscode.com/api/v1'
cookbook 'apache2'
cookbook 'php'
cookbook 'mysql'
cookbook 'my_cookbook', :git => 'https://github.com/tkengo/my_cookbook'
apache2, php5, mysql5 をインストールした後にアプリケーションに必要なユーザーや初期ディレクトリの作成を行なってくれる my_cookbook レシピという想定です。
クックブックのインストール
Cheffile の準備ができたらクックブックのインストールをします。これもコマンド1発で出来ます。
$ librarian-chef install
こうすることで Cheffile に書かれたクックブックの依存関係を解決して必要なクックブックを全てダウンロードしてきてくれます。このコマンドを実行した後は Cheffile と同じ場所に cookbooks
というディレクトリが出来ています。この中にダウンロードされたクックブックが全て入っています。
$ ls -l cookbooks
total 0
drwxr-xr-x 15 kengo staff 510 4 11 00:19 apache2/
drwxr-xr-x 12 kengo staff 408 4 11 00:19 build-essential/
drwxr-xr-x 15 kengo staff 510 4 11 00:19 my_cookbook/
drwxr-xr-x 15 kengo staff 510 4 11 00:19 mysql/
drwxr-xr-x 10 kengo staff 340 4 11 00:19 openssl/
drwxr-xr-x 15 kengo staff 510 4 11 00:19 php/
drwxr-xr-x 10 kengo staff 340 4 11 00:19 xml/
apache や mysql 以外にもクックブックがダウンロードされてきて、依存関係が解決されていることがわかります。
Vagrant
Vagrant もちゃっちゃと準備していきます。
インストール
Vagrant にはパッケージ版と gem 版があります。今回は手軽な gem 版の方を使いたいと思います。
$ gem install vagrant
これだけ。
box の追加
ベースのとなる VM をダウンロードしてきてそれを box として追加して Vagrant に認識させてあげます。box は http://www.vagrantbox.es/ を見るとたくさんあります。今回は Chef を使うので最初から Chef が入っているイメージを選びましょう。とりあえず http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.3-i386-v20130101.box このあたりからダウンロード。
$ vagrant box add centos6 /path/to/download/CentOS-6.3-i386-v20130101.box
$ vagrant box list
これで box が追加されて、追加された box を確認することができます。
Vagrantfile の作成
box の追加が終わったら
$ vagrant init
とコマンドを実行します。するとカレントディレクトリに Vagrantfile というファイルが出来ています。初期状態ではごちゃごちゃ書かれてますが全てコメントアウトされた状態です。これを以下のような感じにします。
Vagrant::Config.run do |config|
config.vm.box = "centos6" # さっき作った box と同じ名前にする
# chef の設定
config.vm.provision :chef_solo do |chef|
# クックブックがあるパス。
# librarian-chef でインストールしたならデフォルトで cookbooks 以下にあります。
chef.cookbooks_path = "cookbooks"
# VM 起動時に自動実行するレシピ一覧
chef.add_recipe "apache2"
chef.add_recipe "mysql"
chef.add_recipe "php"
chef.add_recipe "my_cookbook"
end
end
VM の起動
Vagrantfile の準備ができたら VM を起動します。
$ vagrant up
これで VM が立ち上がって、その後に Chef のレシピが自動的に実行されます。
VM 起動時にレシピを修正して再読み込みさせたい場合は
$ vagrant provision
で VM の再起動なしにいけます。