概要
今更ながらに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の基本 のサイトの記事を見つけて
環境変数でホストの設定ができることを知り、凄くたすかりました。
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 環境変数がなぜ当たらないか?
サイトからあちこち情報を探してみてると
-
/bin/sh
で実行しているから環境変数が読めていない
ansibleでshellモジュール実行時に環境変数(.bash_profile)が反映されない問題 -
/bin/bash
でも/etc/profileを強制実行してみよう
How to solvettyname failed: Inappropriate ioctl for device
in Vagrant?
といった情報が見つかりました。
で、色々組み合わせた結果、これで環境変数が読みこめるようになったっぽいです。
(rbenv コマンドが実行できてたから。)
- 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個以上)になってました。
ここら辺りの動きがどうなっているか把握できていないので、もうよくわかりません。
思考錯誤の末、結果的には以下の様にして動いているので冗長的ですがこのまま弄らないようにしています。(虎馬)
- name: Install Ruby
poll: 30
async: 10800
shell: bash -lc "rbenv install --skip-existing {{ ruby_version }}"
args:
executable: /bin/bash
適用先の環境変数に頼ったplaybookは今後も苦労しそうです。。。