Rails開発のための仮想環境をvagrantでつくる


## 追記

Dockerでの構築方法を以下にまとめました。参考にしてみてください。
[Docker で Rails5 の開発環境を「rails new」から構築する](http://qiita.com/kawasin73/items/d5836007c715b7f7885f)

## はじめに

Railsの開発を進めたいが、手元のパソコンの環境は不用意に壊したくないという時、仮想環境で開発を行うと思います。
そのために、すぐに開発に使えるVagrantfileを作成しました。
こちらのgithubリポジトリで公開しています。

[https://github.com/kawasin73/vagrant-centos-rails](https://github.com/kawasin73/vagrant-centos-rails)

## インストールされるもの

- CentOS 6.7
- rbenv
- ruby 2.2.2
- sqlite
- MySQL
- Nokogiriに必要なライブラリ
- ImageMagickに必要なライブラリ
- Git
- その他、必要そうなライブラリ

## 必要となる環境

開発環境は、VirtualBox と Vagrant を用いて構築します。

Mac OSX では、VirtualBox と Vagrant を Homebrewでインストールできます。

```bash
brew cask install virtualbox
brew cask install vagrant
vagrant plugin install vagrant-vbguest
```

Windows でインストールするときは、公式サイトからダウンロードしてください。

- [VirtualBox](https://www.virtualbox.org/)
- [Vagrant](https://www.vagrantup.com/downloads.html)

`vagrant-vbguest` は、Guest Additionを最新に更新してくれるpluginです。
このプラグインがない場合、２回目以降の`vagrant up`で、mount に失敗することがあります。
また、`vagrant-vbguest` をインストールした場合でも、`vagrant up`に失敗してしまうことがあるようです。その場合は、以下の記事を参考にしてください。

- [vagrant-vbguestプラグインがGuestAdditionsを無効にしてしまう](http://qiita.com/hapicky/items/a7f9d56588f96d005fad)

## 利用方法

```bash
git clone https://github.com/kawasin73/vagrant-centos-rails
cd vagrant-centos-rails
vagrant up
vagrant ssh
```

`vagrant up` を実行すると、CentOSのboxのダウンロードが始まりCentOSが立ち上がります。そして、初回起動時はprovisionが行われ、上に挙げたライブラリがインストールされます。
provisionerはShellなので、Vagrant と VirtualBox 以外に必要となる依存はありません。

また、ゲストOS上の`~/data`にホストOSのカレントディレクトリをマウントしているので、ホストOSのIDEを使っての開発もできます。

`vagrant ssh` に成功したら、

```bash
cd data
gem install rails
rails new . --database=mysql --skip-turbolinks
rake db:create
bundle install
```

とするとRailsの開発を進められます。
詳しくは、@masuidriveさんの [@masuidrive のRailsプロジェクトの始め方](http://qiita.com/masuidrive/items/0e0e5294bc2dc81a52c2)を参考にすると良いと思います。

## Vagrantfile

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

Vagrant.configure(2) do |config|

  GUEST_RUBY_VERSION = '2.2.2'

  config.vm.box = "bento/centos-6.7"

  config.vm.hostname = "centos-6-for-rails"

  config.vm.network "forwarded_port", guest: 3000, host: 3000

  config.vm.network "private_network", ip: "192.168.33.10"

  config.vm.synced_folder ".", "/home/vagrant/data"

  config.vm.provider "virtualbox" do |vb|
    # Display the VirtualBox GUI when booting the machine
    vb.gui = false

    # Customize the amount of memory on the VM:
    vb.memory = ENV["VM_MEMORY"] || "1024"
  end
  
  config.vm.provision "shell", privileged: true, inline: <<-SHELL
    function install {
      echo installing $1
      shift
      yum -y install "$@" >/dev/null 2>&1
    }
    yum -y update >/dev/null 2>&1
    install "development tools"  gcc-c++ glibc-headers openssl-devel readline libyaml-devel readline-devel zlib zlib-devel
    install "Git" git
    install "sqlite" sqlite sqlite-devel
    # mysql 5.6
    yum install -y http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm >/dev/null 2>&1
    install "MySQL" mysql mysql-server mysql-devel
    chkconfig --add mysqld
    chkconfig --level 345 mysqld  on
    echo "Start and Initialize MySQL"
    service mysqld start >/dev/null 2>&1
    mysql -uroot <<SQL
-- SET ROOT PASSWORD --
UPDATE mysql.user SET Password=PASSWORD('password') WHERE User='root';
-- REMOVE ANONYMOUS USERS --
DELETE FROM mysql.user WHERE User='';
-- REMOVE REMOTE ROOT --
DELETE FROM mysql.user
WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
-- REMOVE TEST DATABASE --
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
-- RELOAD PRIVILEGE TABLES --
FLUSH PRIVILEGES;
CREATE USER 'rails'@'localhost';
SET PASSWORD FOR 'rails'@'localhost' = PASSWORD('password');
CREATE DATABASE development_db  DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE DATABASE test_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON development_db.* to 'rails'@'localhost';
GRANT ALL PRIVILEGES ON test_db.* to 'rails'@'localhost';
SQL
    install "Nokogiri dependencies" libxml2 libxslt libxml2-devel libxslt-devel
    install "ImageMagick" ImageMagick ImageMagick-devel
    cp /etc/localtime /etc/localtime.org
    ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
    echo "ZONE=\"Asia/Tokyo\"" > /etc/sysconfig/clock
    service crond restart
  SHELL

  config.vm.provision "shell", privileged: false, inline: <<-SHELL
    echo installing rbenv
    git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
    git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
    echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
    echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
    source ~/.bash_profile
    echo 'gem: --no-ri --no-rdoc' >> ~/.gemrc
    echo installing ruby#{GUEST_RUBY_VERSION}
    rbenv install #{GUEST_RUBY_VERSION}
    rbenv global #{GUEST_RUBY_VERSION}
    echo installing Bundler
    gem install bundler -N >/dev/null 2>&1
  SHELL
end
```

MySQLは、初期化とユーザーの作成、データベースの作成まで行っています。

## 今後について

PostgreSQLやRedisなども入れることができたらなぁと思っています。
皆さん使ってみてください！

## 参考URL

- [rails-dev-box](https://github.com/rails/rails-dev-box)
- [@masuidrive のRailsプロジェクトの始め方](http://qiita.com/masuidrive/items/0e0e5294bc2dc81a52c2)
- [CentOS 6 / RHEL 6 に MySQL 5.6 を yum インストールする手順](http://weblabo.oscasierra.net/installing-mysql-rhel6-with-yum/)

@masuidriveさんのVagrantfileは、ubuntuだったので、それのCentOS版を今回作りました。