Serverkitでrbenvを利用してRubyを入れる

Serverkit というプロビジョニングツールを利用して、ローカルあるいはSSHで接続できる任意のマシン上に、rbenv経由で任意のバージョンのRubyをインストールする方法について説明します。端的に言えば、以下のようなレシピとGemfileを用意し、bundle exec serverkit apply recipe.yml を実行するとインストールできます。

resources:
  - type: rbenv_ruby
    dependencies: true
    global: true
    user: foo
    version: 2.2.0
source "https://rubygems.org"

gem "serverkit"
gem "serverkit-rbenv"

レシピ

Serverkitでは複数のリソースの配列まとめたものをレシピと呼んでいます。今回は「rbenv経由で特定のバージョンのRubyをインストールする」というリソースを1つだけ用意しています。1つのリソースは辞書形式で表現され、typeの値に応じてversionなどの幾つかの属性を持ちます。typeはどの種類のリソースか、versionはどのバージョンのRubyをインストールするか、userはどのユーザが対象か、globalはrbenvでそのversionのRubyをglobalに設定するかどうか、dependenciesはもしrbenvやruby-buildがインストールされていない場合に同時にインストールするかどうか、を表しています。

適用すると何が起こるか

ほぼ何も入っていない環境で、先述したレシピを適用すると何が起こるかについて説明します。

rbenv_dependent_packages

まず dependencies: true が指定されているため、rbenvに必要なパッケージがインストールされます。例えばyumを使うOSであれば以下のパッケージがyum経由でインストールされます。

  • gcc
  • gdbm-devel
  • git
  • libffi-devel
  • libyaml-devel
  • ncurses-devel
  • openssl-devel
  • readline-devel
  • zlib-devel

rbenv_rbenv

次にrbenvのインストール。user: foo が指定されているので、https://github.com/sstephenson/rbenv.git がfooユーザのホームディレクトリ以下の .rbenv にgit-cloneされます。一般的には /home/foo/.rbenv になります。

rbenv_ruby_build

次に、ruby-buildがインストールされていない場合、これもインストールされます。これもrbenvと同じく、https://github.com/sstephenson/ruby-build.git.rbenv/plugins/ruby-build にgit-cloneされます。

rbenv_profile

そして、export PATH="$HOME/.rbenv/bin/rbenv:$PATH"eval "$(rbenv init -)" がfooユーザの.bash_profileに追記されます。例えば別の種類のログインシェルを利用している場合であれば、profile_path属性を指定すれば追記先のファイルを変更できます。また、既に該当行が記述されている場合は追記されません。

rbenv_ruby

ここまでで dependencies: true によるrbenvとruby-buildのインストールが終わり、後は指定されたバージョンのRubyを rbenv install 2.2.0 でインストールし、rbenv global 2.2.0 を設定して、インストールは完了します。

serverkit-rbenv

rbenv_rubyというリソースは、serverkit本体ではなくserverkit-rbenvというプラグインで提供されいるため、これをGemfileに記述しておく必要があります。bundle exec serverkit ... と実行すれば、プラグインが読み込まれる仕組みになっています。

source "https://rubygems.org"

gem "serverkit"
gem "serverkit-rbenv"

運用

とりあえず雑にrbenvとRubyを入れたい場合は dependencies: true を使うと良いでしょう。serverkit-rbenvでは、個々の工程を、rbenv_ruby_build、rbenv_profile、rbenv_dependent_packages などのリソースとして提供しているので、インストール先などを細かく管理したい場合は dependencies: true を利用せず、これらのリソースを利用すると良いでしょう。一部の工程だけはserverkit-rbenvで提供されるリソースを利用せず、自前で用意する、という使い方も可能です。