Blend day's Note

思い立ったことをメモする

Ansible で rbenv & ruby をインストールするときに自分が勘違いがわかった話

あまつさえ、それをブログ化していることに驚きを隠せなかった私だった(まる)

事の始まり

昔々の事(と、言っても半年前)、こんなまとめ記事を書いていました。 kayo-tozaki.hatenablog.com

ここ最近、再びAnsibleを使って、自動でサーバ群が構築できる様なPlaybookを作ろうと思い立ったのですが...

実は、このブログを見るまで、昔似たようなモノを作ってあったということを忘れていました。

はて、何をやっているんだか...と言う感じでしたが、残念な事に、その時のファイルは全部行方不明。 諦めて全部作りなおすことにしたのですが、せっかくなのでより良い感じにしたいなと。

簡単に、今回のまとめを記述すると、こんな感じ↓

OverView

今回やりたいこと

  • Ansibleを使って、対象サーバにrubyをぶち込みたい
  • 使ってるrubyが若干古い(気がする。2.0.0)ので、rbenvを使ってインストールしたい

普通にガリガリAnsibleを書けばいいのでしょうが...

前回でも今回でも詰まった点

rbenv install コマンドが動かなくて、rubyがインストールできない

解決方法

マニュアルをしっかり読む rbenvのプラグインruby-build~/.rbenv/pluginに突っ込んでおく

解決後

$ rbenv install 2.0.0-p598 が普通に動いた。感動

原因と解決までのみちのり

rbenvのインストール方法のおさらい

至ってシンプルで簡単なインストールなのに、なぜここまで手間取っていたのか...と今更思うが、マニュアルをななめ読みする私が悪いんです。

そう、インストール方法は簡単。

  1. 必要なパッケージをインストールする(git,zlib,zlib-devel,openssl-devel,readline,readline-devel,sqlite-devel)
  2. git clone https://github.com/sstephenson/rbenv.git インストール対象のディレクトリ
  3. echo 'export PATH="インストール対象のディレクトリ/bin:/sbin/:${PATH}"' >> ~/.bashrc
  4. echo 'eval "$(rbenv init -)" >> ~/.bash_profile'
  5. git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
  6. rbenv install 任意のバージョン
  7. rbenv global インストールしたバージョン

と、まとめるとこれだけである。なんと簡単か。

コマンドだけならいいが、これをAnsibleで書くと、また一手間かかってしまったのはご愛嬌...

Playbook化したときに詰まった点

パッケージのインストール時のsudo権限

詰まったというか悩んだだけです。

playbookの書き方で対処しました。方法は幾つかあるかと。 今回は、パッケージをインストールするtaskとrbenv本体をgit cloneするtask^1のみ、hostsから分離して、become: yesと記述しました。

Pathの追加

Ansible の lineinfileが大活躍。

前回では、予め.bashrcを作成していたのですが、今回はしっかりと追記することに。

gist.github.com

今回は、.bashrcにひとまとめにしました。手抜き感満載。

rbenv install command not found の謎を解いた方法

簡単にいうと、このコマンドを打ち込んだだけ。

gist.github.com

パスのexport先が ~/.rbenv になっている事に違和感を覚えて、別の所で色々とマニュアルを見なおしてみると...

tsuchikazu.net

私の勘違いが一気に晴れた気がしました。

rbenv = ruby のバージョンスイッチャー

ruby-build = ruby のインストール簡単化プラグイン

こういうことでした。さらに、プラグインのディレクトリは、~/.rbenv/plugin/という始末...

これで、万事解決です。

rbenvのインストールと冪等性の保ち方

これは、前に書いた記事でも書いたのですが、参考までに。

rbenvコマンドの実行は、bashで行う ^2 & PATHの設定が必要

なので、次の様に実行する必要がある。

 - name: check ruby installed version
   shell: bash -lc "rbenv versions"

ちなみに、冪等性チェックは、こんな感じです。全くもってザルである。

- name: check ruby installed version
  shell: bash -lc "rbenv versions"
  register: ruby_installed_version

- name: install ruby via rbenv 
  shell: bash -lc "rbenv install 2.0.0-p598"
  when: ruby_installed_version.stdout_lines.count("{{ ruby_version }}")

.stdout_lines.countは(おそらく)指定した語句がある行が出力されているか否かを判定してる(んじゃないかなぁ...?)

まとめ

書いている途中で「この記事の意味は...?」となってきたので簡単にまとめました。

gistに今回使ったplaybookもどきを乗せておくので、欲しい方は参考にしてみてください。

gist.github.com

ではでは