浮浪者はゲストでシェフを検出できませんでした!
これはMacBookAirにVagrant+Chefで環境構築する時に、「世界で一つだけのエラー」が出た時の対処方法です。
世界で一つだけのエラーと言っても、正確にはGoogle検索で全世界で1件しかヒットしないエラーです。
厳密には2件ヒットするのですが、うち1件はただのエラーログです。もう一件はGoogleのvagrantグループです。
「こんなエラーが出るんだけど?」←「VMぶっ壊してみたら?」という暖かいやりとりが楽しめます。
あと結論が役に立たないです。
そんなエラーと戯れて、一応解決して原因もそこはかとなく見えたので、ここに公開します。
世界初公開ですね。
キーワード
-
MacBookAir(Yosemite)
Vagrant
Chef-repo
CookBooks
なりゆき
とあるところからプロジェクトを引き継ぐことに。
Vagrant+Chefです。
しかしこれが長年漬け込まれた「秘伝のタレ」になっています。
シェフご自慢のタレってヤツです。
レシピが書かれたCookBooksはあちこち破れたり汚れたりしていて、老舗の歴史を物語っています。
でもシェフは「レシピは俺の頭にある!」と言って、あまり気にしていません。
窮貧の惨憤クッキング開始
ソース一式はgitで持ってこれるとして、問題は環境。
vagrant provisionするとこんなエラーが出ます。
PC039:resaku.jp daisuke_sumitani$ vagrant provision ==> default: Running provisioner: chef_solo… default: Installing Chef (latest)… Vagrant could not detect Chef on the guest! Even after Vagrant attempted to install Chef, it could still not find Chef on the system. Please make sure you are connected to the Internet and can access Chef’s package distribution servers. If you already have Chef installed on this guest, you can disable the automatic Chef detection by setting the ‘install’ option in the Chef configuration section of your Vagrantfile: chef.install = false |
Google翻訳に叩き込むとこんな感じです。
浮浪者はゲストでシェフを検出できませんでした!後でさえもベイグラント
シェフをインストールしようとしました、それはまだシステム上でシェフを見つけることができませんでした。
あなたがインターネットに接続され、アクセスすることができることを確認してください
シェフのパッケージ配布サーバ。あなたは既にシェフを持っている場合
このゲストにインストールされている、あなたは自動シェフの検出を無効にすることができます
のシェフの構成セクションで、「インストール」オプションを設定することにより、
あなたVagrantfile:chef.install=偽
浮浪者はゲストでシェフを検出できませんでした!
なんて斬新なエラーなんでしょう!
きっとネット上は話題沸騰、解決策はいっぱい上がっているに決まっています。
という訳でこの斬新な一行を完全一致で検索にかけます。
「”Vagrant could not detect Chef on the guest!”」
・・・・ヒット2件。
それが冒頭の「世界で一つだけのエラー」なエピソードに繋がるのです。
もっとも「VagrantでChefがうまく入らない」だけなら割とメジャーな話です。
よくある解決策がVagrantファイルに以下2行を追加する方法です。
config.vm.provision :shell, :inline => “gem install –no-ri –no-rdoc chef” config.omnibus.chef_version = :latest |
さあ、再度vagrant provisionしてみましょう。
するとこんなエラーになります。
PC039:resaku.jp daisuke_sumitani$ vagrant provision <~ここに長い長い実行文(正常系っぽいノリです)~> ==> default: ERROR: Error installing chef: ==> default: mixlib-shellout requires Ruby version >= 1.9.3. The SSH command responded with a non-zero exit status. Vagrant assumes that this means the command failed. The output for this command should be in the log above. Please read the output to determine what went wrong. |
これもかなり多く見られるエラーです。
「Rubyのバージョンが1.9.3未満ですよ」というヤツです。
実際にはRubyのバージョンが余裕で2以上あるのに出るヤツです。
これはこれで解決方法があるらしいのですが、本題から外れる上に、本題の解決には全く不要だったのは衝撃です。
しかし当時純粋だった私は表示されたエラーをそのまま信じて、そのまま取り組みます。
・Rubyの入れ直し
・rbenv入れ直し
・brew install readline
・brew search gccおよびその付帯作業
・もう一回Rubyの入れ直し
・rbenv global 2.2.0とかなんとか
・gem install bundler
・gem install rails RubyならやっぱりRailsだよね!
・bundle install
とかなんとかやって、そもそも最初からバージョン2.2だったRubyはバージョン2.2となりました。
つまりそのままですね。
そして結局「1.9.3.未満だよ!」と言われる状況は変わりません。
つまりこれだけやっても解決しない上に、仮に解決してもシェフの件の解決には実は全然関係ありません。
正解は「Vagrantファイルに追加した2行をコメントアウトして、再度vagrant provisionを実行する」です。
#config.vm.provision :shell, :inline => “gem install –no-ri –no-rdoc chef” #config.omnibus.chef_version = :latest |
と言っても、この2行が不要だったのではありません。
1回目は必要で、2回目は不要(というか入れてはいけない)なのです。
解説(レンジに出来合いのモノが入っていた)
「Vagrantファイルに追加2行あり」だけでも「Vagrantファイルに追加2行なし」だけでも、vagrant provisionは失敗します。
「Vagrantファイルに追加2行あり」でvagrant provisionを実行し、そのあとに「Vagrantファイルに追加2行なし」でvagrant provisionを実行すると成功するのです。
この両者はデッドロックの関係ですね。
一方だけだともう一方が妨害しますが、順番に実行すると幸せになれます。
微妙に2回繰り返すことがポイントですね。
まとめ
vagrant provision実行
↓
浮浪者シェフエラー発生
↓
Vagrantファイルに以下2行追記
config.vm.provision :shell, :inline => “gem install –no-ri –no-rdoc chef” config.omnibus.chef_version = :latest |
↓
vagrant provision実行
↓
・「Rubyが1.9.3.未満だよエラー」が出るけど惑わされない。無視する。
・cookbookは入らないけど、この時点でシェフが潜り込んだと推測されます
↓
Vagrantファイルに追記した2行を無効に
#config.vm.provision :shell, :inline => “gem install –no-ri –no-rdoc chef” #config.omnibus.chef_version = :latest |
↓
vagrant provision実行
↓
・cookbookが入ります。
・この時点でVagrantファイルは「浮浪者シェフエラー」と同じ状態に戻っている
・しかしシェフが潜り込み済みなので、cookbookを受け取れるのだ!
↓
完成
結論
タレは二度づけしよう。
adpc
adpc
関連記事
-
glibcをバージョンアップする
JVNVU#97236594 glibc にバッファオーバーフローの脆弱性 なん …
- PREV
- gitで今いるブランチ名を常に表示させる方法
- NEXT
- WordPress講座レポートin神保町