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について紹介したいと思います。

備考