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で提供されるリソースを利用せず、自前で用意する、という使い方も可能です。