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


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

皆さんおはようございます。
[ryurock@github](http://qiita.com/users/ryurock@github)です。

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

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


## レシピ作成時間
約5分

## 環境
* mac-osx（ホストOS）
* centos6.4-x86-minimal (ゲストOS)

## 事前準備に必要なもの
* virtualbox
* ruby 1.9.3p327 (rbenv) ※1.9.3-p286でもいけた
* chef ※入れていない方は```gem install chef```とshellから打ってください
* vagrant ※入れていない方は[chef-soloで使用するvirtualbox(vagrant)をveeweeを使用して作る](http://qiita.com/items/3cb756a9c951371a4089)を参考に入れておいてください
* git
* knife-soloのセットアップ ※やっていない方は[今日作りたくなる簡単cookbook [Kim'sキッチン] yumsetup(yum-fastestmirrorにyum update添え)](http://qiita.com/items/c99215e25bd2ff846207)の前準備を参考にしてやっておいてください。

## 参考にしたサイト（書籍）
* [入門ChefSolo-InfrastructureasCode-1.0.0](http://tatsu-zine.com/books/chef-solo)(達人出版)
* [rbenvを使ってシステムワイドにrubyをインストールする方法](http://qiita.com/items/8e973a544b592376a07e)


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

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

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

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

```sh
cp chef-repo/ruby/recipes/default.rb chef-repo/ruby/recipes/rbenv.rb
```
```ruby: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](http://docs.opscode.com/resource.html)を使用した

* [group](http://docs.opscode.com/resource_group.html)
* [git](http://docs.opscode.com/resource_git.html)
* [directory](http://docs.opscode.com/resource_directory.html)
* [template](http://docs.opscode.com/resource_template.html)

で実行します。

## [その3]attributesの追加

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

```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
.
.
```
のテンプレートの中身です

```ruby: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のダウンロード&コンパイルです

```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でエラーになりました。

```ruby: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をリモート側で実行する設定を追加

```shell
vim chef-repo/nodes/{接続名称（任意）}.json

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

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

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

```shell
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](http://docs.opscode.com/resource.html)

----

* [group](http://docs.opscode.com/resource_group.html)
* [git](http://docs.opscode.com/resource_git.html)
* [directory](http://docs.opscode.com/resource_directory.html)
* [template](http://docs.opscode.com/resource_template.html)
* [execute](http://docs.opscode.com/resource_execute.html)