を作るにあたって、今回も情報源や、勉強になったことなどをノートしていきます♪
全体的に参考にした
- rbenv/rbenv: Groom your app’s Ruby environment
- 【連載01】214.(Ansible)Rbenvを使用してRuby環境をインストールする – Qiita
- Ansible で rbenv & ruby をインストールするときに自分が勘違いがわかった話 – 鯖構築運用雑記
echo ‘export PATH=”$HOME/.rbenv/bin:$PATH”‘ >> ~/.bash_profile をプレイブックで表現する
Ansible で echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile を冪等性をできるだけ保つようにタスク化したいですわ。
を拝見しますと、lineinfile モジュールを使用してらっしゃいますの。
も確認しつつ、次のように書きました。
---
... 略 ...
- name: Add ~/.rbenv/bin to your $PATH for access to the rbenv command-line utility
  lineinfile:
    path: ~/.bash_profile
    line: 'export PATH="$HOME/.rbenv/bin:$PATH"'
    create: yes
ところが
fatal: [default]: FAILED! => {“changed”: false, “failed”: true, “msg”: “unsupported parameter for module: path”}
というエラー><。
公式ドキュメントの lineinfile モジュールの path オプションには、バージョン 2.3 よりも前なら dest と指定しないとダメ、とございましたの。
The file to modify.
Before 2.3 this option was only usable as dest, destfile and name.aliases: dest, destfile, name
構築したい環境を確かめてみますと、たしかに Ansible のバージョンは 2.3 より小さい値でしたわ。
$ ansible --version ansible 2.2.1.0 config file = /etc/ansible/ansible.cfg configured module search path = Default w/o overrides $
dest のみ使用できることに気がついたのは、次のページの例を実際に試したからでしたの。感謝いたします!
ホームディレクトリは ~ の他に {{ ansible_env.HOME }} が使える
[ansible ホームディレクトリ] で調べると、{{ ansible_env.HOME }} で取得できる。
実際に、shell モジュールや、dest オプション等で使用できましたの。
---
- name: git clone rbenv
  git:
    repo: 'https://github.com/rbenv/rbenv.git'
    dest: "{{ ansible_env.HOME }}/.rbenv"
- name: Try to compile dynamic bash extension to speed up rbenv
  shell: "cd {{ ansible_env.HOME }}/.rbenv && src/configure && make -C src"
... 略 ...
~ を使用するときと異なるのは、/root といったフルパスが出力される点。ここを覚えておきたいですわね♪
Ansible で rbenv install する時のコツ
- bash -lc “rbenv install 2.4.1” などとして実行する。
- bash -l: 新規ログインしてから起動されたかのようにして実行する。
- bash -c: 指定した string をコマンドとして実行する。
- .bash_profile に rbenv などを追記したものの、この時点では rbenv コマンドが見えないため。
- rbenv 公式ページにも、rbenv を有効にするには bash を再起動(ターミナルの新しいタブを開く)する、とある。
 > Restart your shell so that PATH changes take effect. (Opening a new terminal tab will usually do it.) Now check if rbenv was set up:
- 以下のページが参考になった。
Ansible で rbenv install の冪等性を保つコツ
例えば bash -lc “rbenv install 2.4.1” を複数回実行すると、2回目でエラーとなりますの><。
“stderr”: “rbenv: /root/.rbenv/versions/2.4.1 already exists”,
そこで、インストール済みのバージョンの文字列を取得し、インストールしたいバージョンが未インストールの場合のみ、インストールするようにいたしました。
やり方は、"hogehoge".count("fuga") == 0 で判定できます。
hogehoge 文字列に fuga が含まれている個数が 0 なら true という意味ですの。これは Python の count 関数を使っており、つまり、Ansible の when に書く判定ロジックは Python となりますわね。
もしくは、"fuga" not in "hogehoge" でも判定できますの。
hogehoge 文字列に fuga が含まれていないなら true という意味ですわね。
こちらのほうがやりたいことを素直に表現しているので、こちらを使用いたしました♪
installed_ruby_versions.stdout_lines は使用しておりません
。
これは各要素がバージョン情報の文字列リストですの。
各要素に検索したい文字列が含まれるかどうか、という判定をわたくしたちが簡潔に書けませんでしたため、使えませんでしたの><。
---
... 略 ...
- name: Get installed Ruby versions
  shell: bash -lc "rbenv versions"
  register: installed_ruby_versions
  changed_when: false # 常に changed にならない
  failed_when: false # 常にfailed にならない
# デバッグ用に中身を確認
- name: test1
  debug:
    msg: "{{ installed_ruby_versions }}"
# 結果は、例えば次のように出力される
# ok: [default] => {
#     "msg": {
#         "changed": false, 
#         "cmd": "bash -lc \"rbenv versions\"", 
#         "delta": "0:00:00.149061", 
#         "end": "2017-04-11 22:26:24.889190", 
#         "failed": false, 
#         "failed_when_result": false, 
#         "rc": 0, 
#         "start": "2017-04-11 22:26:24.740129", 
#         "stderr": "", 
#         "stdout": "  2.1.0\n* 2.4.1 (set by /root/.rbenv/version)", 
#         "stdout_lines": [
#             "  2.1.0", 
#             "* 2.4.1 (set by /root/.rbenv/version)"
#         ], 
#         "warnings": []
#     }
# }
- name: Install Ruby via rbenv
  shell: bash -lc "rbenv install 2.4.1"
#  when: installed_ruby_versions.stdout.count("2.4.1") == 0
  when: '"2.4.1" not in installed_ruby_versions.stdout'
... 略 ...
- Ansible で rbenv & ruby をインストールするときに自分が勘違いがわかった話 – 鯖構築運用雑記
- Tricorn Labs » Ansible の shell や command モジュールで冪等性を保つ方法
- Pythonの「文字列に○○が含まれているか」の判定について気になったこと – print ”laco’s blog”
全ユーザがログインしただけで Ruby が使用できるようにシステムワイドにインストールする
上述で試してきたのは、root ユーザのみが Ruby を使用できる状態でしたの。
yum でインストールしたときのように、全ユーザが Ruby を使えるようにしたいと考え、試してみました。
今までで手順がわかっていたので、次のページを参考に、つまづくこと無く完成しましたわ♪
- インストール場所を /usr/local/rbenv にする。今までは ~/.rbenv だったが、ディレクトリ名のドットを付けない、隠しディレクトリではなく通常のディレクトリして扱う。
- .bash_profile に追記した内容は、/etc/profile.d/ に rbenv.sh を作成してそこに記述するようにした。
- centos7でRubyをrbenvでバージョン管理する~システムワイドと特定ユーザ~ – Qiita
おわりに
Ruby も構築できるようになりましたので、次は Redmine と考えております♪
楽しみですわ♪
以上です。
