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 を組み合わせて利用される方はご注意ください。