カテゴリー
Linux

【Ansible】【Vagrant】CentOS 7 での 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 する時のコツ

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'

... 略 ...

全ユーザがログインしただけで Ruby が使用できるようにシステムワイドにインストールする

上述で試してきたのは、root ユーザのみが Ruby を使用できる状態でしたの。

yum でインストールしたときのように、全ユーザが Ruby を使えるようにしたいと考え、試してみました。

今までで手順がわかっていたので、次のページを参考に、つまづくこと無く完成しましたわ♪

おわりに

Ruby も構築できるようになりましたので、次は Redmine と考えております♪

楽しみですわ♪

以上です。

コメントを残す