nigoblog

技術系会社のCEOブログ~私的編~

お手軽環境構築 !chefでrubyのバージョンを2.0.0-p195にする方法 ~CentOS~

以前chefを利用し、ローカル環境構築する方法について書きました。

そこで今回はrubyのバージョンをchefを使って2.0.0-p195にする方法を書いていきます!

  1. chefとvagrantのおさらい
  2. recipeファイルの置き場
  3. recipeファイルの内容
  4. まとめ

chefとvagrantのおさらい

以前何回か説明したようにchefとvagrantを組み合わせることで、コマンド一発でローカル環境を構築できる、大変優れたものです。

参考
Vagrantとchefで簡単お手軽ローカル環境構築 - nigoblog

詳しい方法は上記の記事を参考に!

recipeファイルの置き場

まずVagrantとchef(cookbooks)の関係は次のようになります

Vagrantfile
cookbooks/

このようにファイルとディレクトリを配置します。

そこでcookbooksにrecipeファイルを作ります。
作り方は以下のとおり、

cookbooks/
    rbenv/
        recipes/
        templates/
            default/

ここでrecipes/配下にdefault.rbというファイルを作ります。
また同様にtemplates/default/配下にもファイルを作ります。

recipeファイルの内容

というわけでrecipeファイルを作ります。
そもそもCentOSにrbenvをインストールし、バージョンを上げる方法に関してはこちらを参考にしました。
CentOSでsystem wideなrbenv+ruby-build環境を構築する - 飲んだり寝たり

要するに上記の記事の手順を自動化するということです。

それでは早速default.rbを見ていきます

git "/usr/local/rbenv" do                                                                                                                                                         
  repository "git://github.com/sstephenson/rbenv.git"
  reference "master"
  action :sync
end

%w{/usr/local/rbenv/shims /usr/local/rbenv/versions}.each do |dir|
  directory dir do
    action :create 
  end 
end

git "/usr/local/ruby-build" do  
  repository "git://github.com/sstephenson/ruby-build.git"
  reference "master"
  action :sync
end

bash "install_ruby_build" do
  cwd "/usr/local/ruby-build"
  code <<-EOH
    ./install.sh
  EOH
end

template "rbenv.sh" do
  path "/etc/profile.d/rbenv.sh"
  owner "root"
  group "root"
  mode "0644"
  source "rbenv.sh.erb"
end

%w{make gcc zlib-devel openssl-devel readline-devel ncurses-devel gdbm-devel db4-devel libffi-devel tk-devel libyaml-devel}.each do |pkg|
  yum_package pkg do
    action :install
  end 
end

execute "rbenv install 2.0.0-p195" do
  command "rbenv install 2.0.0-p195"
  action :run
  not_if { ::File.exists?("/root/.rbenv/versions/2.0.0-p195") }
end

execute "rbenv global 2.0.0-p195" do
  command "rbenv global 2.0.0-p195"
  action :run
end

execute "rbenv global 2.0.0-p195" do
  command "rbenv global 2.0.0-p195"
  action :run
end

execute "rbenv rehash" do
  command "rbenv rehash"
  action :run
end   

かなり長くなってしまいましたが、こんな感じになります。
上から順に説明します。
まずはgithubからrbenvをインストールします。
この時、chefのgitというリソースを用います。

git "/usr/local/rbenv" do                                                                                                                                                         
  repository "git://github.com/sstephenson/rbenv.git"
  reference "master"
  action :sync
end

ここでいうリソースとは

resources "~" do
end

のresourcesの部分の命令のことを言います。
gitリソースはgitリポジトリからcloneしたりするのに使います。
オプションにはリポジトリ、ブランチ、そしてアクションを指定。
アクションのsyncは既にあればpull, なければcloneします。

次にディレクトリの作成です

%w{/usr/local/rbenv/shims /usr/local/rbenv/versions}.each do |dir|
  directory dir do
    action :create 
  end 
end

ディレクトリ操作はdirectoryというリソースを使います。
eachで上記のディレクトリを作っていくというような感じになります。
オプションはaction :create
またここは
owner, groupの指定もでき、defaultではどちらもrootです。

次はruby-buildのインストールです。

git "/usr/local/ruby-build" do  
  repository "git://github.com/sstephenson/ruby-build.git"
  reference "master"
  action :sync
end

bash "install_ruby_build" do
  cwd "/usr/local/ruby-build"
  code <<-EOH
    ./install.sh
  EOH
end

rbenv同様gitリポジトリからcloneしてきます。
またinstall.shを実行するために
bashというリソースを使っています。

ここではrbenvのPATHを通します。

template "rbenv.sh" do
  path "/etc/profile.d/rbenv.sh"
  owner "root"
  group "root"
  mode "0644"
  source "rbenv.sh.erb"
end

先程少し説明したtemplateファイルを読み込み、保存します。
templateファイルは
templates/default/rbenv.sh.erb
という名前で保存し、次のようになります

export RBENV_ROOT="/usr/local/rbenv"                                                                                                                                             
export PATH="/usr/local/rbenv/bin:$PATH"
eval "$(rbenv init -)"

最後はrubyのインストールです。

%w{make gcc zlib-devel openssl-devel readline-devel ncurses-devel gdbm-devel db4-devel libffi-devel tk-devel libyaml-devel}.each do |pkg|
  yum_package pkg do
    action :install
  end 
end

これはrubyの最新版をインストールするのに必要なものです。
yumのepelが必要なので予めepelを使えるようにしといてください。

execute "rbenv install 2.0.0-p195" do
  command "rbenv install 2.0.0-p195"
  action :run
  not_if { ::File.exists?("/root/.rbenv/versions/2.0.0-p195") }
end

execute "rbenv global 2.0.0-p195" do
  command "rbenv global 2.0.0-p195"
  action :run
end

execute "rbenv rehash" do
  command "rbenv rehash"
  action :run
end 

最後はrbenvコマンドを実行していきます。
コマンドの実行はexecuteリソースを使い、オプションで実行するコマンドを設定します。

以上簡単でしたが、chefでrubyのバージョンを上げる方法でした!

まとめ

いちいち同じ事をするのは大変なので環境構築は是非とも自動化しましょう。
chefは電子書籍で良い本があるのでこちらを参考に

入門Chef Solo - Infrastructure as Code

入門Chef Solo - Infrastructure as Code

関連書籍

Software Design (ソフトウェア デザイン) 2012年 10月号 [雑誌]

Software Design (ソフトウェア デザイン) 2012年 10月号 [雑誌]


こちらもかなりよく書かれております。

WEB+DB PRESS Vol.75

WEB+DB PRESS Vol.75


web db press最新版も書かれておりました。