Vagrantで自分達の開発に必要な設定を行ったboxファイルを作成し、Atlasで共有する手順をまとめました。
このエントリではRails開発用に、CentOS6にRuby/nodejs/MySQL/Redisをセットアップしたboxイメージを作成してみます。

Vagrant/Packerのインストール

VirutalBoxのサイトから、ダウンロードしてインストーラの指示に従いインストールします。

VirtualBox:
https://www.virtualbox.org/

$ virtualbox --help
Oracle VM VirtualBox Manager 5.0.0
(C) 2005-2015 Oracle Corporation
All rights reserved.

** 以下省略 **

Vagrantのサイトから、ダウンロードしてインストーラの指示に従いインストールします。

Vagrant:
https://www.vagrantup.com/

$ vagrant -v
Vagrant 1.7.4

Packerのサイトからダウンロードしたzipファイルを「~/packer」に展開し、パスを通します。

Packer:
https://www.packer.io/

$ export PATH=$PATH:~/packer
$ packer -v
0.8.2

BoxCutterでベースとなるイメージを作成

BoxCutterというpackerのテンプレートがあるので、これを使ってOSイメージの入ったベースになるboxを作成します。

Boxcutter:
https://github.com/boxcutter

以下のように入力して、VirtualBox用のCentOS6.6のboxを作成します。「virtualbox/centos66」部分を書き換えると、必要なイメージを作成できます。一覧はmake listで確認できます。

$ git clone git@github.com:boxcutter/centos.git
$ cd centos
$ make virtualbox/centos66

今回は、make時にエラーが出たので、script/vmtool.shを以下のように書き換えて、makeをやり直しました。

echo "==> Removing packages needed for building guest tools"
#yum -y remove gcc cpp libmpc mpfr kernel-devel kernel-headers perl
yum -y remove gcc cpp mpfr kernel-devel kernel-headers perl

再度makeすると、box/virtualbox配下にboxイメージができます。

$ make virtualbox/centos66

作成したイメージを以下のようにvagrant box addで登録します。登録した結果はvagrant box listで確認します。

$ vagrant box add centos66 ../centos/box/virtualbox/centos66-nocm-2.0.2.box
$ vagrant box list
centos66              (virtualbox, 0)

登録したイメージは、以下のようにVagrantfileconfig.vm.boxに設定して利用出来ます。

  config.vm.box = "centos66"

Rails開発用のカスタマイズイメージを作成

次に、Rails開発用にRuby/nodejs/MySQL/Redisをインストールしたイメージを作成します。

まず、scripts/ruby_rails.shに 以下のようなインストール用シェルスクリプトを作成します。

#!/bin/bash -eux

RUBY_VERSION=2.1.2
RUBY_VERSION_MAJOR=2.1
NODEJS_VERSION=v0.10.29

echo "==> Installing MySQL"
yum -y install mysql-server
chkconfig mysqld on

echo "==> Installing Redis"
rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
sed -i 's/enabled=1/enabled=0/g' /etc/yum.repos.d/epel.repo
yum -y install redis --enablerepo=epel
chkconfig redis on

echo "==> Building ruby"
yum -y install tar git gcc gcc-c++ zlib-devel openssl-devel sqlite-devel mysql-devel postgresql-devel libxml2-devel libxslt-devel readline-devel
curl -o /tmp/ruby-$RUBY_VERSION.tar.gz https://cache.ruby-lang.org/pub/ruby/$RUBY_VERSION_MAJOR/ruby-$RUBY_VERSION.tar.gz \
 && cd /tmp \
 && tar zxvf ruby-$RUBY_VERSION.tar.gz \
 && cd /tmp/ruby-$RUBY_VERSION \
 && ./configure && make && make install \
 && /usr/local/bin/gem install bundler --no-ri --no-rdoc \
 && /usr/local/bin/gem install nokogiri --no-ri --no-rdoc -- --use-system-libraries -v '1.6.3.1' \
 && /usr/local/bin/bundle config build.nokogiri --use-system-libraries \
 && rm -rf /tmp/ruby-$RUBY_VERSION \
 && rm /tmp/ruby-$RUBY_VERSION.tar.gz
su - vagrant -c '/usr/local/bin/bundle config build.nokogiri --use-system-libraries'

echo "==> Building nodejs"
curl -o /tmp/node-$NODEJS_VERSION-linux-x64.tar.gz http://nodejs.org/dist/$NODEJS_VERSION/node-$NODEJS_VERSION-linux-x64.tar.gz \
  && cd /opt && tar zxf /tmp/node-$NODEJS_VERSION-linux-x64.tar.gz \
  && ln -s /opt/node-$NODEJS_VERSION-linux-x64/bin/node /usr/bin/node \
  && ln -s /opt/node-$NODEJS_VERSION-linux-x64/bin/npm /usr/bin/npm \
  && rm /tmp/node-$NODEJS_VERSION-linux-x64.tar.gz

以下のようにpackerの定義をコピーします。

$ cp centos66.json centos6-rails.json

centos6-rails.jsonのscriptsにRuby/nodejs/MySQL/Redisのセットアップ用シェルスクリプトを追加します。

"scripts": [
  "script/fix-slow-dns.sh",
  "script/sshd.sh",
  "script/update.sh",
  "script/vagrant.sh",
  "script/vmtool.sh",
  "script/cmtool.sh",
  "script/ruby_rails.sh",
  "script/cleanup.sh"
],

以下のように作成した定義でmakeすると、各モジュールをセットアップしたboxイメージができます。

$ make virtualbox/centos66-rails

作成したイメージを以下のようにvagrant box addで登録します。登録した結果はvagrant box listで確認します。

$ vagrant box add centos66-ruby212-mysql-redis ../centos/box/virtualbox/centos66-nocm-2.0.2.box
$ vagrant box list
centos66-ruby222-mysql-redis (virtualbox, 0)

作成したboxを使って、vagrantでRailsの開発が出来るかを確認してみます。

$ mkdir ~/rails-app
$ cd ~/rails-app
$ vagrant init

Vagrantfileを以下のように記載します。

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
  config.vm.box = "centos66-ruby212-mysql-redis"
  config.vm.network "forwarded_port", guest: 3000, host: 3000
end

以下のように、vagrantコマンドで開始・接続、Railsのアプリを作成・起動します。起動したら、ブラウザからhttp://localhost:3000で接続出来ることを確認します。

$ vagrant up
$ vagrant ssh
vagrant $ cd /vagrant
vagrant $ bundle init
vagrant $ echo 'source "https://rubygems.org"' > Gemfile
vagrant $ echo 'gem "rails"' >> Gemfile
vagrant $ bundle install --path vendor/bundle
vagrant $ bundle exec rails new . --skip-bundle
vagrant $ bundle install
vagrant $ bundle rails s --bind=0.0.0.0

作成したboxをAtlasにアップロッド

作成したboxファイルをAtlas(旧VagrantCloud)にアップロードして、公開してみます。

Atlas by HashiCorp
https://atlas.hashicorp.com/

Atlasにログインし、ヘッダのメニューから「Vagrant」を選択後に表示される、一覧から「Create a Vagrant Box with the Web UI」を選びます。

「Create a new box」で以下の項目を設定して、「Create」を実行します。

  • Name: boxの名称
  • Private: 公開/非公開の設定 ※非公開にするとvagrant upする際にログインが必要になります
  • ShortDescription: boxの説明文

box作成後「New Version」からVersionwを作成します。次の項目を設定し、「Create Version」を実行します。

  • Version: Version番号
  • Description: versionの説明

Version作成後、「Create New Provider」からProviderを作成します。Provider(ここではVirtualbox)を選び、作成したboxファイルをアップロードします。

boxをアップロードした直後の状態では、unreleasedとなっているので、ReleaseしたいVersionを選んで「Release Version」を選択することで公開できます。

boxを他のマシンから利用する

Atlasで公開したboxを他のマシンから利用する場合は、以下のようにVagrantfileにbox名を指定します。box名を「ユーザ名/イメージ名」の形式でします。

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
  config.vm.box = "takemikami/centos66-ruby212-mysql-redis"
  config.vm.network "forwarded_port", guest: 3000, host: 3000
end

vagrant upで実行しますが、boxをprivateにしている場合は、vagrant loginでAtlasにログインした状態で、実行する必要があります。

以上の手順で、カスタマイズしたboxを開発者間で共有することが出来るようになりました。
この手順に加えて、Vagrantfileconfig.vm.provisionに構成スクリプトを設定すれば、同じ構成の開発環境をより作りやすくなると思います。

このエントリをまとめるにあたって、以下のエントリを参考にさせて頂きました。ありがとうございます。

Packer 用のテンプレート集 Box-Cutter を使ってみる - akishin999の日記:
http://d.hatena.ne.jp/akishin999/20140702/1404302238