MacでVagrant x Ansibleを使ってRuby on Rails x Minitest自動構築

Vagrant x AnsibleでCentOS 8のRuby on Rails構築ソースがなかったため、趣味で作成して、GitHubに vagrant-ansible-ror を公開しました。

ポイント

  • Vagrantで自動的にCentos 8でRuby on Railsを構築して、構築後にMinitestまで走らせています。
  • AnsibleはFail Firstになっているため、Ansible上にはテスト実装しませんでした(コケたらわかるため)。
  • 冪等性の観点だとGemなどはバージョン固定が望ましいと思うのですが、Bundlerで依存関係を管理していることや、あくまで一時的な開発目的のため、バージョンはあえて固定しませんでした(常に最新インストール)。

環境

  • ホスト(Mac側)
    • ansible-playbook 2.9.3
    • Vagrant 2.2.6
    • macOS Catalina version 10.15.3
  • ゲスト(サーバー側)
    • Frontend: Not specified (Ruby on Rails default)
    • Application: Ruby on Rails 5
    • Middleware: PostgreSQL, Puma
    • OS: CentOS 8
  • 備考
    Ruby version 2.6.5

ハマりポイント

  1. 情報が古い
    GitHubや記述系ブログに公開されているVagrant, Ansibleのソースが古いことが多い。たとえば、rootになる設定として sudo: yes とあるが、最新版は become: yes にしないと動かない。ただし、技術系ブログに、「その情報古いですよ」という記事を書いてくれている人がたくさんいるため、解決できた。

  2. ベストプラクティスがどれかわからない
    Ansible Best Practices に一例が公開されているが、もっとたくさんの参考情報がほしかった。GitHubで探したが、どれがよいのかわからなかった。

  3. ドキュメントがまとまっていない(気がする)
    Kindle本やQiitaを記事を参考にしながら、 Ansible Documentation でキーワード検索して仕様把握する、といったことをやった。しかし、古い情報が混在しているため、StackOverflowとGitHubでソース検索(become:yesとかで検索)しながら検証といった進め方で、かなりハマった。ドキュメントの完成形は Vue.js だと思う。考え方、サンプルコード、サンプル動画、ソース解説、体系的に1から順に整理されていて上から読んでいけば一通りわかる。

  4. 最新版だとコケる
    【CentOS 8.0 (version 1905.1) だとファイル共有するためのvbguestが使えない(rsyncは使えるが、virtualboxが使えない)】
    → GitHubでIssueが切られているが、 CentOS 8 - installing Guest additions fails #367 現在は対応待ち。
    【Ruby 2.7.0 だとRuby on Rails用に必要なGem郡が対応されていない】
    → RailsアプリをRuby 2.7.0で動かして分かったこと に書かれているが、Warningの連続でMinitestすらまともに動かなかったため、バージョンを2.6.5に下げて暫定対応した。

  5. Ansible Playbookのデバッグが難しい
    Ansible Playbookの実行中に、コマンドプロンプトからの質問(削除しますか?(y/n)みたいな)があると、なにも表示されずにフリーズしてしまう。そのため、Playbookでデバッグモード(-vvv)とステップ実行(--step)しながら、フリーズした箇所で、$ vagrant ssh して実際にコマンドを打ってみて、どんな状況になっているのか確認したりと、かなり面倒だった。もしかしたら、もっとうまいやり方があるのかもしれないが、方法わからず。
    自分用のハンドブックになるが、 Ansible Playbook Command にデバッグでよく使用したコマンドを記述した。

  6. 構成管理は意外と時間がかかるし工数がかかる
    冪等性を担保する必要があるため、何度も何度も実行しては設定を修正して、というのを繰り返す必要がある。「ターミナルで打ったコマンドをただ設定するだけだから、そんなに時間かからないだろ」と思っていたが、1回目がうまくいっても2回目にコケる、状況によって環境が変わってしまうなど、冪等性の担保が難しかった。$ rails new するだけのRuby on Railsをただ構築するだけの設定なのに、数週間の工数がかかった(インフラ強いひとであればもっと早いと思うが)。
    その代わり、一度構成管理が完璧に仕上がれば、作業手順書も人手も必要なくなるため、長期手に運用する場合は、工数が大幅に減らせると感じている。