ZEALOTエンジニアブログ
vagrant_rvm

VagrantでRVMを使うときによくはまること

Pocket

弊社サービスHachikinではfnichol/chef-rvmを使ってRuby環境を構築しているのですが、Vagrantを使っている場合に直ぐにハマってしまうことがあるのでメモがてらまとめておきます。

まず、はじめにVagrantから起動されるサーバで使われるChefをバージョン指定してインストールするための、vagrant-omnibusというプラグインをインストールします。(すでにChefがインストールされている場合は、一旦アンインストールしたほうがいいかと思います。)

Vagrantfileに次の行を追加します。

※ 参考: vagrant-omnibusで簡単Chef Client/Chef Soloインストール

この設定をいれて、vagrant provisionすると以下のディレクトリにChefやRubyがインストールされます。

  • /opt/chef/bin/chef-solo
  • /opt/chef/embedded/bin/ruby

また、chef-rvmのレシピを実行したあとサーバ(Vagrantを使って出来る環境のことをここではサーバと言います)上に/usr/local/bin/chef-solo, /usr/local/bin/chef-clientというファイルができます。これは、RVMを使用している時chef-solo(またはchef-client)コマンドを実行しても、システムにインストールされたRubyの環境でchef-soloを実行してくれるようにするラッパーのようです。

次に、chef-rvmがvagrant-omnibusでインストールしたChefを参照するように以下の設定を追加します。ここで指定したパスが上記のラッパーファイルに記載されます。

因みに、RVMはシステムワイドでインストールしているのでVagrantfileでは以下のように記述しています。(システムワイドでなければ、今回とはまた違った対応になるのかも知れません)

ここまでの設定をまとめると次のような感じです。(以下は今回関係する部分だけを抜き出したものです)

よくでるエラー

2回目以降のvagrant provisionで出るかもしれないエラー

これは、chef-rvmを実行した後に出来るラッパーファイル(/usr/local/bin/chef-solo)に記述されている「システムのchef-solo」の場所が間違っている可能性があります。Vagrantfileに記述する「system_chef_solo」の設定があっているか確認しましょう。そもそも、システムのChefのインストール場所が分からないという場合、そっちから先に解決する必要があります。(vagrant-omnibusの場合、上にも書いているように/opt/chef/bin/chef-soloにあるかもしれません)
ただし、Vagrantfileを直しただけだとvagrant provisionした時に必ず上記のエラーになり先に進めませんので、一旦はサーバ上のラッパーファイル(/usr/local/bin/chef-solo)の内容を直接書き換えておく必要があります。書き換える内容は、ファイルの最後の行のexecのあとのパスです。ここを修正して、もう一度vagrant provisionを試してみましょう。(ここでは/opt/chef/bin/chef-soloに修正しています)

サーバ上のChefを手動で入れようとして色々やったあとに出るかもしれないエラー。

vagrant-omnibusを使う前に、Chefを手動(gem install chef)でバージョンアップしたところ/usr/local/bin/chef-soloにインストールされてしまいました。そのため、rvm-chefのラッパーファイルを上書きしてしまったため上記のエラーが発生しました。この時は、一旦下記のようにRVMデフォルトの設定をシステムに変更して、provisionしなおして対応しました。

こうすることで、一旦はrvmを使わずに常にシステムの方を参照する形になるので、vagrant provisionが正しく動く可能性があります。

Vagrantを使っている場合は、手動でChefをインストールしないほうがいいかもしれません(手動でインストールされた結果/usr/local/binのファイルを上書きしてしまう可能性があるので)。vagrant-omnibusを使っている場合は、/opt/chef以下にインストールされるので競合することは今のところありません。

というわけで、色々ハマりどころがあります。久しぶりにChefを使おうとするといつもここでつまづきます。Vagrant、Chef等色々便利なのでどうやって動いているのかほとんど意識することはないのですが、時々分かっていないと大ハマリするので基礎的な動作原理もある程度知っておく必要がありますね。

Pocket