けんごのお屋敷

2013-04-09

Vagrant + librarian-chef で作るローカル開発環境

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 の再起動なしにいけます。

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