システムワイドにrbenvを入れる

Rubyのいろいろなバージョンを使う際のrbenv、特定ユーザのホームディレクトリ配下に入れる資料は多いのだけれど、システムワイドに入れる資料が少なめであるのと、それをansibleでやる場合にちょっとコツが必要だったりもするのでメモ(VagrantBox CentOS65やさくらVPSの標準OSで動作確認済。確か「install packages」のコメントアウトを外せばAmazonLinuxでもOKだった気がする)。

「ansibleでやる場合にちょっとコツが必要」というのは、システムワイドにやるために「/etc/profile.d/rbenv.sh」に初期設定を入れていて、全ユーザがログインした際にそれが発動するようにしているものの、(ssh接続でリモートでansibleを実行している場合)sourceとかで再読込しても後続タスクでは有効にはならないので、「/bin/bash -lc "..."」などとして明示的にログインシェルで実行されるする必要がある。

あと、この方法で入れた場合、その後のコマンドでも「sudo rbenv install ...」などとするとやはり上記と同じ状態になるので、rbenvの管理コマンドを使う際などは一回rootになって実行した方がよい。

以下、ansibleのplaybook片だけれども「ansible使わないよ!」という向きはコマンドラインに読み替えて実行するよろし。

vars/development.yml

---
ruby:
  version: 2.1.6

roles/ruby/tasks/main.yml

---
- name: check rbenv
  stat: path=/etc/profile.d/rbenv.sh
  register: rbenv_sh

- name: get rbenv
  git: repo=https://github.com/sstephenson/rbenv.git dest=/usr/local/rbenv
  when: not rbenv_sh.stat.exists

- name: get ruby-build
  git: repo=https://github.com/sstephenson/ruby-build.git dest=/usr/local/rbenv/plugins/ruby-build
  when: not rbenv_sh.stat.exists

- name: copy global profile for rbenv
  copy: src=rbenv.sh dest=/etc/profile.d/rbenv.sh
  when: not rbenv_sh.stat.exists

- name: check ruby
  shell: /bin/bash -lc "rbenv versions | grep {{ ruby.version }}"
  register: ruby_installed
  failed_when: ruby_installed.rc not in [0, 1]

- name: remove old ruby
  yum: name={{ item }} state=absent
  with_items:
    - ruby
    - ruby-devel
  when: ruby_installed|failed

- name: install packages
  yum: name={{ item }} state=present
  with_items:
    - openssl
    - openssl-devel
    - readline
    - readline-devel
#    - gcc
#    - make
#    - automake
#    - autoconf
#    - curl-devel
#    - zlib-devel
#    - httpd-devel
#    - apr-devel
#    - apr-util-devel
#    - sqlite-devel
  when: ruby_installed|failed

# use login shell
# see http://qiita.com/FGtatsuro/items/2366c93131c47aef8dfe
# see https://github.com/ansible/ansible/issues/4854
- name: install ruby
  shell: /bin/bash -lc "rbenv install {{ ruby.version }} && rbenv rehash && rbenv global {{ ruby.version }}"
  when: ruby_installed|failed

roles/ruby/files/rbenv.sh

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