knife-solo を vagrant の組み合わせでは、古い chef-solo が利用されてしまう問題

みんな大好き knife-solo ですが、今日使ってみて一個ハマりました。

knife-solo は sudo 経由で chef-solo コマンドを呼び出しているのですが、
現在のバージョンは単に sudo chef-solo しているだけなので、

  • /usr/local/bin 以下に chef-solo がインストールされていて…
  • PATH に /usr/local/bin が入っている環境

では、prepare でインストールされた chef-solo ではなく、
システムに入っていた /usr/local/bin/chef-solo が利用されます。

同じ環境にふたつも chef-solo 入れないだろう、ハハハ、と笑い飛ばしたくなりますが、
chef 使いが必ず使っているであろうツールのひとつ、vagrant では
ほぼすべての VM イメージ(box)の /usr/local/bin 以下に chef-solo がインストールされています。

つまり、knife-solo と vagrant を組み合わせている人は、prepare でインストールした最新版の chef-solo は利用せず、
vagrant box に含まれている古い chef-solo を使っているようです。

古い box を使うとよりハマりそう

しかも、インストールされている古い chef-solo が 0.10.4 以前のものの場合、以下のエラーがでて knife-solo で cook することができません。
パスの問題なので、メッセージ通りに prepare をしても現象が変わることがなさそうです。

ERROR: RuntimeError: Couldn't find Chef >=0.10.4 on xxx.xxx.xxx.xxx. Please run `knife solo prepare xxx.xxx.xxx.xxx` to ensure Chef is installed and up to date.

どうすりゃいいの?

さきほど調べた限りでは、よい解決策は見当たらないようです。
とりあえず /usr/local/bin/chef-solo を消してみると回避できそうです。

追記(5/1 18:00):
気になってどうやって回避すべきなのか聞いてみたところ、

  • vagrant では knife solo prepare しないのがいいんじゃね? 古いかもしれないけど。
  • knife solo cook 時に -s (--startup-script) を指定して PATH を書き換えるといいんじゃね?
  • vagrant の機能(shell provisioner とか)を使って不要な(/usr/local/bin に入っている) chef を消したら?

という回答をいただきました。

knife-solo としては、登録されいてる PATH を信用するのが一番という方針のようです。
vagrant と knife-solo を組み合わせて利用される方はご注意ください。