Ansible で rbenv & ruby をインストールするときに自分が勘違いがわかった話
あまつさえ、それをブログ化していることに驚きを隠せなかった私だった(まる)
事の始まり
昔々の事(と、言っても半年前)、こんなまとめ記事を書いていました。 kayo-tozaki.hatenablog.com
ここ最近、再びAnsibleを使って、自動でサーバ群が構築できる様なPlaybookを作ろうと思い立ったのですが...
実は、このブログを見るまで、昔似たようなモノを作ってあったということを忘れていました。
はて、何をやっているんだか...と言う感じでしたが、残念な事に、その時のファイルは全部行方不明。 諦めて全部作りなおすことにしたのですが、せっかくなのでより良い感じにしたいなと。
簡単に、今回のまとめを記述すると、こんな感じ↓
OverView
今回やりたいこと
普通にガリガリAnsibleを書けばいいのでしょうが...
前回でも今回でも詰まった点
rbenv install
コマンドが動かなくて、rubyがインストールできない
解決方法
マニュアルをしっかり読む
rbenvのプラグインruby-build
を~/.rbenv/plugin
に突っ込んでおく
解決後
$ rbenv install 2.0.0-p598
が普通に動いた。感動
原因と解決までのみちのり
rbenvのインストール方法のおさらい
至ってシンプルで簡単なインストールなのに、なぜここまで手間取っていたのか...と今更思うが、マニュアルをななめ読みする私が悪いんです。
そう、インストール方法は簡単。
- 必要なパッケージをインストールする(git,zlib,zlib-devel,openssl-devel,readline,readline-devel,sqlite-devel)
git clone https://github.com/sstephenson/rbenv.git インストール対象のディレクトリ
echo 'export PATH="インストール対象のディレクトリ/bin:/sbin/:${PATH}"' >> ~/.bashrc
echo 'eval "$(rbenv init -)" >> ~/.bash_profile'
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
rbenv install 任意のバージョン
rbenv global インストールしたバージョン
と、まとめるとこれだけである。なんと簡単か。
コマンドだけならいいが、これをAnsibleで書くと、また一手間かかってしまったのはご愛嬌...
Playbook化したときに詰まった点
パッケージのインストール時のsudo
権限
詰まったというか悩んだだけです。
playbookの書き方で対処しました。方法は幾つかあるかと。
今回は、パッケージをインストールするtaskとrbenv本体をgit clone
するtask^1のみ、hostsから分離して、become: yes
と記述しました。
Pathの追加
Ansible の lineinfile
が大活躍。
前回では、予め.bashrc
を作成していたのですが、今回はしっかりと追記することに。
今回は、.bashrc
にひとまとめにしました。手抜き感満載。
rbenv install command not found
の謎を解いた方法
簡単にいうと、このコマンドを打ち込んだだけ。
パスのexport先が ~/.rbenv
になっている事に違和感を覚えて、別の所で色々とマニュアルを見なおしてみると...
私の勘違いが一気に晴れた気がしました。
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もどきを乗せておくので、欲しい方は参考にしてみてください。
ではでは