を作るにあたって、今回も情報源や、勉強になったことなどをノートしていきます♪
全体的に参考にした
- 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 と考えております♪
楽しみですわ♪
以上です。