よしかわーるど

プログラミングで世界を変える

2018-07-24

ChefでRailsの環境を作成する

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

対象読者

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

事前準備

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

brew cask install virtualbox vagrant

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

virtualmachine-template

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

仮想マシンにログイン

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 の開発環境が整いました。