Vagrant -> Ansible -> ruby_その3(Ansible - playbook)


概要

今更ながらにVagrant+Ansibleの環境構築を初めてやってみました。
満足できる環境が出来上がるまでおおよそ1ヶ月。
せっかく苦労して書いたのに何もかも忘れていくのも寂しいので、
こちらに記述しておくことにしました。

本記事はAnsble-playbookを使ってサーバの環境を整えた際に
私の思いを記述していきます。

本記事は連載シリーズです。全3回です。
Vagrant -> Ansible -> ruby_その1(概要)
Vagrant -> Ansible -> ruby_その2(Vagrantfile)
[Vagrant -> Ansible -> ruby_その3(Ansible - playbook)]

ソース

Githubに公開しております。

playbook 作成中に思ったこと

その1 実行コマンドが長い

playbookを適用させるたびに ansible-playbook -i ~/playbook/hosts_ansible ~/playbook/site.xmlとコマンドうってましたが、手がつかれました。
ansibleの基本 のサイトの記事を見つけて
環境変数でホストの設定ができることを知り、凄くたすかりました。
bash:/etc/profile.d/ansible_conf.sh
export ANSIBLE_INVENTORY=~/playbook/hosts_ansible

ログイン時に環境変数を設定して、コマンドが短く(ansible-playbook ~/playbook/site.xml)できるようになりました。

その2 ベストプラクティスって素晴らしい

いくつかあるようですが、今回はDirectory Layoutに習って作成しました。
わけも分からずこれをやっていましたが、スルメのように段々ありがたみわかってきました。
このプラクティスの場合、同じ資産(role単位)の使い回しが凄く便利なのがわかりました。
新しいsite2.ymlとかを作ってrolesの指定で必要な部品を選ぶだけで
別のサイトのplaybookが出来上がるので、面倒でもディレクトリを深く掘った恩恵を受けてます。

その3 日本語化は最後の最後(もしくはやらない)

Vagrantで日本語化を見送って、いざ!とばかりにAnsibleでやってみましたが、
日本語化によって文字化けが発生してエラーが文字化けてしまって途方にくれました。
例)

TASK [ruby : Install Ruby 1] ****************************************************************************************************************************************************
fatal: [172.16.20.102]: FAILED! => {"changed": true, "cmd": "rbenv rehash\n", "delta": "0:00:00.006822", "end": "2019-06-09 17:40:20.165372", "msg": "non-zero return code", "rc": 127, "start": "2019-06-09 17:40:20.158550", "stderr": "/bin/bash: rbenv: ????????????", "stderr_lines": ["/bin/bash: rbenv: ????????????"], "stdout": "", "stdout_lines": []}
TASK [ruby : Install Ruby 1] ****************************************************************************************************************************************************
fatal: [172.16.20.102]: FAILED! => {"changed": true, "cmd": "rbenv rehash\n", "delta": "0:00:00.006819", "end": "2019-06-09 03:24:47.786502", "msg": "non-zero return code", "rc": 127, "start": "2019-06-09 03:24:47.779683", "stderr": "/bin/bash: rbenv: command not found", "stderr_lines": ["/bin/bash: rbenv: command not found"], "stdout": "", "stdout_lines": []}

rbenv: command not foundが出力されるので修正方針の助けになりました。

その4 rbenv(ruby)のplaybook構築って大変

rbenv-ruby環境ののplaybook を作成しました。これはホントに苦労しました。

  その4−1 何が大変?

rbenvインストール → ruby-build プラグイン導入 → rubyインストール
までをplaybook一発でやってしまおうとするわけで環境変数まわりの設定が思った様に適用できず、
汎用性を欠きながら無理やりrubyの最新版をインストールしています。
結論言ってしまいますが、環境変数を読み込むのは諦めました。
もしも参考にして頂ける場合、rbenv,rubyのインストール先は/opt/rubyに固定してありますので、
各自で変更してください。

  その4−2 環境変数がなぜ当たらないか?

サイトからあちこち情報を探してみてると

  1. /bin/shで実行しているから環境変数が読めていない
    ansibleでshellモジュール実行時に環境変数(.bash_profile)が反映されない問題

  2. /bin/bashでも/etc/profileを強制実行してみよう
    How to solve ttyname failed: Inappropriate ioctl for device in Vagrant?

といった情報が見つかりました。
で、色々組み合わせた結果、これで環境変数が読みこめるようになったっぽいです。
(rbenv コマンドが実行できてたから。)

環境変数を読み込んだ時のplaybook(上手く動かないので真似しないでください)
- name: Install Ruby
  shell: bash -lc "BASH_ENV=/etc/profile rbenv install --skip-existing {{ ruby_version }}"

  その4ー3 実行できたらできたで、、、、、

なかなかrubyのインストールがおわりません。。。。。。

playbookの適用先のサーバに直接ssh接続して状態を見てみると、

$ ps -ef | grep rbenv 
...
root     30707 30706  1 08:47 pts/1    00:00:00 bash /opt/ruby/bin/rbenv init -
root     30710 30707  0 08:47 pts/1    00:00:00 bash /opt/ruby/bin/rbenv init -
root     30711 30710  1 08:47 pts/1    00:00:00 bash /opt/ruby/bin/rbenv init -
root     30714 30711  0 08:47 pts/1    00:00:00 bash /opt/ruby/bin/rbenv init -
root     30715 30714  1 08:47 pts/1    00:00:00 bash /opt/ruby/bin/rbenv init -
root     30718 30715  0 08:47 pts/1    00:00:00 bash /opt/ruby/bin/rbenv init -
root     30719 30718  1 08:47 pts/1    00:00:00 bash /opt/ruby/bin/rbenv init -
root     30722 30719  0 08:47 pts/1    00:00:00 bash /opt/ruby/bin/rbenv init -
...

rbenvプロセスの大量生産(1000個以上)になってました。
ここら辺りの動きがどうなっているか把握できていないので、もうよくわかりません。
思考錯誤の末、結果的には以下の様にして動いているので冗長的ですがこのまま弄らないようにしています。(虎馬)

環境変数を読み込んだ時のplaybook(こっちは動きました)
- name: Install Ruby
  poll: 30
  async: 10800
  shell: bash -lc "rbenv install --skip-existing {{ ruby_version }}"
  args:
    executable: /bin/bash

適用先の環境変数に頼ったplaybookは今後も苦労しそうです。。。