2018/7 VagrantでRails環境構築
前回、Vagrantの基本的な使い方をPostgreSQLを例に紹介しました。 今回は、Rails環境構築する方法を紹介します。
OSの入手
前回と同じCentOSとします。(VM名だけ変更してます)
> vagrant box add rails_box https://github.com/holms/vagrant-centos7-box/releases/download/7.1.1503.001/CentOS-7.1.1503-x86_64-netboot.box
Vagrantfile準備
前回とほぼ同じですが、WindowsブラウザからRailsにアクセスできるようVMの3000ポートを開放します。 あとRailsの開発ソースをWindows側のエディタで編集したソースをVM内のCentOS上でRails起動させるために、WindowsとCentOSをつなぐ共有フォルダ設定を行っています。
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
# VM名
config.vm.box = "rails_box"
config.vm.provider "virtualbox" do |vb|
# 1GBメモリ割当
vb.memory = "1024"
end
# 共有フォルダ(ノーマル版)
config.vm.synced_folder "./src", "/www", create: true, owner: "vagrant", group: "vagrant"
# 共有フォルダ(Rsync版)
# config.vm.synced_folder "./src", "/www", type:"rsync", rsync__exclude: [".git/", "node_modules", "tmp", "log", "cache", "coverage", "public/packs"], owner: "vagrant", group: "vagrant", rsync__chown: true
# Railsポート
config.vm.network "forwarded_port", guest: 3000, host: 3000
# IPアドレス指定
config.vm.network :private_network, ip: "192.168.33.36"
# 環境構築
config.vm.provision "ansible_local" do |ansible|
ansible.playbook = "ansible.yml"
end
end
共有フォルダTips
まず、共有フォルダはWindows側にあるRailsソースmy_project/src
をCentOSの/www
にマウントしています。
そして、上記のように共有フォルダ(ノーマル版)と、コメントアウトしてある共有フォルダ(Rsync版)の2つがあります。
状況に応じて使い分けると良いでしょう。
共有フォルダ(ノーマル版)
ノーマル版は、Windows <-> CentOS双方向に反映されます。 つまりWindowsでファイルを追加したり編集すればCentOSに反映され、CentOSで行えばWindowsに反映されます。 しかし、この共有フォルダはアクセス速度が遅い問題があります。 SSDでは問題にならないのですが、HDDだとRailsで標準でついてくるWebpackerのビルドが遅くて、 ソースを編集してアクセスするたびに30秒~2分ぐらいかかり仕事になりません。 そこで後述でRsync版を紹介します。
(Railsで標準でついてくるWebpacker(CentOS内ビルド)をやめて、 Windows側で自前Webpackすればノーマル版のままでも問題ないかもしれません。)
共有フォルダ(Rsync版)
Rsync版は、Windows -> CentOS片方向に反映されます。 つまりWindowsでファイルを追加したり編集すればCentOSに反映されるが、CentOSで行ってもWindowsに反映されません。
このノーマル版をコメントアウトし、こちらのコメントアウトを外して有効にし、
vagrant rsync-auto
コマンドで自動Rsyncさせる必要があります。
# 起動して
> vagrant up
# 自動Rsync
> vagrant rsync-auto
これで、30秒~2分ぐらいかかっていたのが2~10秒程度に改善され、問題なく仕事ができました。
ansible準備
このようにansible.ymlでRubyインストールしたりRailsインストールすれば整います。
長くなるため今回は省きましたが、このansible.ymlの中に前回で紹介したPostgreSQL設定も追記すれば CentOS内でRailsとPostgreSQLを同居させられます。
- name: provisioning
hosts: all
become: yes
user: vagrant
vars:
# 基本
base_locale: LANG=ja_JP.UTF-8
base_timezone: Asia/Tokyo
work_dir: /usr/local/share
# Rails
rbenv_repos_dir: "{{ work_dir }}/rbenv"
rbenv_branch: master
ruby_version: 2.5.1
tasks:
# 基本 ###################################
- name: yum update
yum:
name=*
state=latest
- name: SELinux無効
selinux: state=disabled
- name: locale設定
command: localectl set-locale {{ base_locale }}
- name: timezone設定
command: timedatectl set-timezone {{ base_timezone }}
- name: ntpインストール
yum: name=ntp state=latest
- name: ntp設定
command: ntpdate ntp.nict.jp
- name: firewalld停止
command: systemctl stop firewalld
become_user: root
become: yes
- name: firewalld無効
command: systemctl mask firewalld
become_user: root
become: yes
# Rails ###################################
- name: Gitインストール
yum: name=git state=installed
- name: rbenvインストール
git: repo=https://github.com/sstephenson/rbenv.git dest={{ rbenv_repos_dir }} version={{ rbenv_branch }} accept_hostkey=yes
- name: RBENV_ROOTパス追加
lineinfile: >
dest=/etc/profile.d/rbenv.sh
line='export RBENV_ROOT="{{ rbenv_repos_dir }}"'
create=yes
- name: rubyパス追加
lineinfile: >
dest=/etc/profile.d/rbenv.sh
line='export PATH="{{ rbenv_repos_dir }}/bin:$PATH"'
create=yes
- name: rbenv init登録
lineinfile: >
dest=/etc/profile.d/rbenv.sh
line='if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi'
create=yes
- name: ruby-buildインストール
git: repo=https://github.com/sstephenson/ruby-build.git dest={{ rbenv_repos_dir }}/plugins/ruby-build version={{ rbenv_branch }} accept_hostkey=yes
- name: Rubyインストール
shell: /bin/bash -lc "rbenv install {{ ruby_version }} && rbenv rehash && rbenv global {{ ruby_version }}"
- name: bundlerインストール
shell: /bin/bash -lc "gem install bundler"
- name: Railsインストール
shell: /bin/bash -lc "gem install rails"
Railsの起動
WindowsからCentOSにSSHするのもvagrantコマンドから簡単に接続できます。
# VM起動
> vagrant up
# SSH接続
> vagrant ssh
# CentOS内
$ cd /www
# Rails起動
$ rails s
本当は、Rails起動する前にbundle install
したりwebpack-dev-server
起動する手順がありますが、
今回はあくまでVagrantでRails環境を構築する方法の紹介なので省きます。
Rsync版の場合は、他コマンドプロンプトでrsync-autoしてください。
> vagrant rsync-auto
最後に
ansible.ymlを整えるが大変ですが、一度整えさえすればチームメンバが環境構築をする負担はだいぶ減ると思います。
次回はDockerについて紹介したいと思います。
備考
- Ruby v2.5.1
- Rails v5.1