Ruby
chef

今日作りたくなる簡単cookbook [Kim'sキッチン] rbenv

More than 1 year has passed since last update.

以下全ても●みち風に書いたメモ

皆さんおはようございます。
ryurock@githubです。

ペケポン(38歳)
rbenvをセットアップしたいっす。
方法を教えてください。

今日はそんなrbenvが大好きな方に簡単なcookbookをknife-soloでご紹介したいと思います。

レシピ作成時間

約5分

環境

  • mac-osx(ホストOS)
  • centos6.4-x86-minimal (ゲストOS)

事前準備に必要なもの

参考にしたサイト(書籍)

[その1] レシピ名を決める

今回のレシピ名はrubyで行きましょう

cd chef-repo
knife cookbook create ruby -o site-cookbooks

[その2] chef-repo/ruby/recipes/default.rbをコピーする

cp chef-repo/ruby/recipes/default.rb chef-repo/ruby/recipes/rbenv.rb
chef-repo/ruby/recipes/rbenv.rb
# rbenvグループを作成して/usr/local/rbenvを実行権限のユーザーを追加する(今回はvagrantユーザーとveeweeユーザーを追加していますお好みによって変更してください)
group "rbenv" do
  action :create
  members "vagrant"
  append true
end

# gitからrbenvを落としてくる(#{node.user}はrootです)
git "/usr/local/rbenv" do
  repository "git://github.com/sstephenson/rbenv.git"
  reference "master"
  action :checkout
  user "#{node.user}"
  group "rbenv"
end

# ruby-build用のpluginフォルダを作成する
directory "/usr/local/rbenv/plugins" do
  owner "#{node.user}"
  group "rbenv"
  mode "0755"
  action :create
end


# rbenvのbash設定を追加
template "/etc/profile.d/rbenv.sh" do
  owner "#{node.user}"
  group "#{node.user}"
  mode 0644
end

# ruby-buildを落としてくる
git "/usr/local/rbenv/plugins/ruby-build" do
  repository "git://github.com/sstephenson/ruby-build.git"
  reference "master"
  action :checkout
  user "#{node.user}"
  group "rbenv"
end

やっていることは

  • rbenvグループを作る
  • rbenvをgithubから落としてくる
  • rbenvのプラグインフォルダを作成する
  • rbenvのbinのPATHを反映させるprofileファイルを作成する
  • ruby-buildをpluginフォルダにgitで落としてくる

です。

レシピとしては
rbenv入れるところとruby-buildを入れるところで分離してもいいかもしれません。

Chef Resourcesを使用した

で実行します。

[その3]attributesの追加

recipeで使用している#{node.user}の部分の定義です。
ついでにデフォルトで使用したいrubyのバージョンも書いてます。(これは後で使う)

chef-repo/ruby/attributes/default.rb
default["user"] = "root"
default["build"] = "1.9.3-p392"

[その4]profileファイルのテンプレートファイルの作成

template "/etc/profile.d/rbenv.sh" do
.
.

のテンプレートの中身です

chef-repo/rbenv/templates/default/rbenv.sh.erb
export RBENV_ROOT=/usr/local/rbenv
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"

いつものrbenvインストールのPATHのprofile設定ですね。

[その5]installレシピの追加

recipes/default.rbはrbenvのインストールで
recipes/install.rbはrubyのダウンロード&コンパイルです

chef-repo/rbenv/recipes/install.rb
# ruby 1.9.3-p392をインストール
execute "ruby install" do
  not_if "source /etc/profile.d/rbenv.sh; rbenv versions | grep #{node.build}"
  command "source /etc/profile.d/rbenv.sh; rbenv install #{node.build}"
  action :run
end

#globalの切り替え
execute "ruby change" do
  command "source /etc/profile.d/rbenv.sh; rbenv global #{node.build};rbenv rehash"
  action :run
end

先ほど定義したchef-repo/rbenv/attributes/default.rbのbuildを使用しています。これで設定かえるだけですきなrubyバージョンを変更できます。

ポイント

はじめ下記のように書いていたがrbenv install command not foundでエラーになりました。

chef-repo/rbenv/recipes/install.rb
# binのPATHを反映
execute "source export" do
  command "source /etc/profile.d/rbenv.sh;"
  action :run
end

# ruby 1.9.3-p392をインストール
execute "ruby install" do
  not_if "rbenv versions | grep #{node.build}"
  command "rbenv install #{node.build}"
  action :run
end

一つのブロック空間でそれぞれ独立しているんですね。(きっと)
なのでこれでruby installの項目をやると
rbenv initが実行されていない状態になります。

[その6]rbenv cookbookをリモート側で実行する設定を追加

vim chef-repo/nodes/{接続名称(任意)}.json

{"run_list":[
        "rbenv::default",
        "rbenv::install"
]}

run_listをすでに記載している場合は追記でお願いします。
またrbenvのインストールのみで問題ないならrbenvだけでも問題ないです。

[その7] リモート側に実行依頼をする

cd chef-repo
knife solo cook {接続名称(任意)}


Starting Chef Client, version 11.4.0
Compiling Cookbooks...
Converging 3 resources
Recipe: rbenv::default

今日はこれで決まり「rbenv」の完成です

template,attributesなどちょっと使ってますが内容はさほど難しくありませんので、是非使ってみてください。

使ったChef Resources