OthloBlog - オスロブログ -

名古屋のIT系学生コミュニティOthloTechのブログです。

ChefでRails5の開発環境を手に入れる

こんにちは、よしかわです。 今回は、仮想環境でVagrantとChefを用いて、Rails5の環境構築をしたので、まとめていきたいと思います。 開発環境と本番環境の違いによって生じる無駄なデバッグをなくすためにも、技術を駆使して乗り越えましょう。

対象読者

  • 自分の開発環境を汚したくない人
  • 本番環境と開発環境を近づけたい人
  • 他の人と同一環境にしたい人
  • Railsの開発環境がとにかく欲しい人

事前準備

VirtualBoxとVagrantのダウンロードをしてください。 Macの方は以下のコマンドでダウンロードすることができます。

brew cask install virtualbox vagrant

以下のサイトでソースコードを公開しています。

vagrant-template/ror5 at master · YoshikawaTaiki/vagrant-template · GitHub

Chefとは

Chefは各種設定作業をRubyのコードで自動化するツールです。各種設定作業の手順(ChefではRecipeという)や設定(ChefではAttributeという)をクックブックと呼ばれる単位で記述できます。シェルスクリプトで自動化する方法と比較してChefを利用するメリットとして依存関係を自動で解決してくれたり、簡潔に記述することが出来ます。

ChefDKで開発を行うので、こちらからインストールしてください。

Chef Downloads

Chefのバージョンの確認

$ sudo chef -v
Chef Development Kit Version: 2.5.3
chef-client version: 13.8.5
berks version: 6.3.1
kitchen version: 1.19.2
inspec version: 1.45.13

vagrantのプラグインのインストール

vagrant plugin install vagrant-omnibus vagrant-vbguest vagrant-vbox-snapshot

knife-soloをインストール

$ sudo chef gem install knife-solo

Gemfileの作成&編集

$ rbenv exec bundle init
$ vim Gemfile 

Gemfile

source "https://rubygems.org"

gem "chef"
gem "chef-dk"
gem "knife-solo"
gem "berkshelf"

gemインストール

$ rbenv exec bundle install

chefリポジトリを作成

$ bundle exec knife solo init .

berksfileの編集

source "https://api.berkshelf.com"

cookbook 'git'
cookbook 'build-essential'
cookbook 'yum'
cookbook 'vim'
cookbook 'openssl'
cookbook 'nginx'
cookbook 'ruby_build'
cookbook 'postgresql'
cookbook 'nodejs'
cookbook 'selinux'
cookbook 'ruby_2-5-0', path: './site-cookbooks/ruby_2-5-0'

クックブックの作成

$ chef generate cookbook site-cookbooks/ruby_2-5-0

site-cookbooks/ruby_2-5-0/recipes/default.rb

rbenv_system_install 'foo' do
    git_url "https://github.com/rbenv/rbenv.git"
end 

rbenv_ruby '2.5.0'

rbenv_global '2.5.0'

rbenv_gem 'unicorn' do
    rbenv_version '2.5.0'
end

rbenv_gem 'postgresql' do
    rbenv_version '2.5.0'
end

rbenv_gem 'rails' do
    rbenv_version '2.5.0'
end

コミュニティクックブックのダウンロード

$ bundle exec berks vendor ./cookbooks
$ Vagrant init
$ vim Vagrantfile

Vagrantfileの編集

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

Vagrant.configure("2") do |config|
    config.vm.synced_folder ".", "/vagrant", disabled: false
    #
    if Vagrant.has_plugin?("vagrant-vbguest")
        config.vbguest.auto_update = true
    end
    # cache package
    if Vagrant.has_plugin?("vagrant-cachier")
        config.cache.scope = :box
    end
    
    config.vm.define :develop do |develop|
        DefineMachineEnvironment develop, "rails", "1024"
        # install and update chef_version latest
        develop.omnibus.chef_version = :latest
        develop.vm.hostname = "rails-local"
        develop.vm.box = "centos/7"
        develop.vm.network :private_network, ip: "192.168.86.12"
        develop.vm.network :forwarded_port, guest: "3000", host: "3000"
        
        develop.vm.provision :chef_solo do |chef|
            #chef.log_level = "info"
            chef.cookbooks_path = "./cookbooks"
            chef.add_recipe 'yum'
            chef.add_recipe 'postgresql'
            chef.add_recipe 'git'
            chef.add_recipe 'vim'
            chef.add_recipe 'nginx'
            chef.add_recipe 'nodejs'
            chef.add_recipe "selinux::disabled"
            chef.add_recipe 'build-essential'
            chef.add_recipe 'ruby_build'
            chef.add_recipe "ruby_2-5-0"
            
            
            chef.json = {
                "ruby_rbenv" => {
                    "global" => "2.5.0",
                    "rubies" => "2.5.0",
                    "gems" => {
                        "2.5.0" => [
                            { 'name' => 'bundler' }
                        ]
                    }
                }
            }
        end
    end
    
    ## Define macros
    def DefineMachineEnvironment(tmp, virtualbox_name, use_memory)
        tmp.vm.provider "virtualbox" do |vbox|
            vbox.name   = virtualbox_name
            vbox.memory = use_memory
        end
    end
end

仮想マシンの起動

vagrant up

f:id:yoshikawataiki:20180321162704p:plain

仮想マシンにログイン

vagrant ssh

仮想マシン内で以下のコマンドでGemfile作成

mkdir hello
cd hello

su
bundle init
vim Gemfile

Gemfileの修正

source "https://rubygems.org"

gem "rails"

データベースはPostgreSQL

bundle install
rails new hello --database postgresql
rails s

ローカル環境にRuby on Rails5の開発環境が整いました。

f:id:yoshikawataiki:20180321162229p:plain