Vagrantのboxファイルを作成してAtlasで共有する手順
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)
登録したイメージは、以下のようにVagrantfile
のconfig.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を開発者間で共有することが出来るようになりました。
この手順に加えて、Vagrantfile
のconfig.vm.provision
に構成スクリプトを設定すれば、同じ構成の開発環境をより作りやすくなると思います。
このエントリをまとめるにあたって、以下のエントリを参考にさせて頂きました。ありがとうございます。
Packer 用のテンプレート集 Box-Cutter を使ってみる - akishin999の日記:
http://d.hatena.ne.jp/akishin999/20140702/1404302238