Vagrant -> Ansible -> ruby_その３（Ansible - playbook）

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

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

本記事は連載シリーズです。全３回です。
[Vagrant -> Ansible -> ruby_その１（概要）](https://qiita.com/drafts/608aa74ed458ec628f4d)
[Vagrant -> Ansible -> ruby_その２（Vagrantfile）](https://qiita.com/KurokoSin/items/6e28e634aa719ac04245)
[Vagrant -> Ansible -> ruby_その３（Ansible - playbook）]

# ソース
[Github](https://github.com/kurokoSin/Burgessochaeta/)に公開しております。

# playbook 作成中に思ったこと
## その１　実行コマンドが長い
playbookを適用させるたびに　`ansible-playbook -i ~/playbook/hosts_ansible ~/playbook/site.xml`とコマンドうってましたが、手がつかれました。
[ansibleの基本](http://joemphilips.com/post/ansible/) のサイトの記事を見つけて
環境変数でホストの設定ができることを知り、凄くたすかりました。
```bash:/etc/profile.d/ansible_conf.sh
export ANSIBLE_INVENTORY=~/playbook/hosts_ansible
```
ログイン時に環境変数を設定して、コマンドが短く（`ansible-playbook ~/playbook/site.xml`）できるようになりました。

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

## その３　日本語化は最後の最後（もしくはやらない）
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`が出力されるので修正方針の助けになりました。


## その４　rbenv(ruby）のplaybook構築って大変
rbenv-ruby環境ののplaybook　を作成しました。これはホントに苦労しました。

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

###　　その４−２　環境変数がなぜ当たらないか？
サイトからあちこち情報を探してみてると

1. `/bin/sh`で実行しているから環境変数が読めていない
[ansibleでshellモジュール実行時に環境変数(.bash_profile)が反映されない問題](https://www.bunkei-programmer.net/entry/2015/05/16/162020)

1. `/bin/bash`でも/etc/profileを強制実行してみよう
[How to solve `ttyname failed: Inappropriate ioctl for device` in Vagrant?](https://superuser.com/questions/1160025/how-to-solve-ttyname-failed-inappropriate-ioctl-for-device-in-vagrant)

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

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

###　　その４ー３　実行できたらできたで、、、、、
なかなかrubyのインストールがおわりません。。。。。。

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

```bash
$ 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個以上）になってました。
ここら辺りの動きがどうなっているか把握できていないので、もうよくわかりません。
思考錯誤の末、結果的には以下の様にして動いているので冗長的ですがこのまま弄らないようにしています。（虎馬）

```yml:環境変数を読み込んだ時のplaybook（こっちは動きました）
- name: Install Ruby
  poll: 30
  async: 10800
  shell: bash -lc "rbenv install --skip-existing {{ ruby_version }}"
  args:
    executable: /bin/bash
```
適用先の環境変数に頼ったplaybookは今後も苦労しそうです。。。