QA@IT

knife で生成した cookbooks を GitHub で公開して、Vagrant から使おうとしても Chef::Exceptions::CookbookNotFound になってしまう

5998 PV

以前、knife で生成し、自分で育てた cookbooks を GitHubに公開し、
Vagrant + chef-solo で使おうとしたのですが、Chef::Exceptions::CookbookNotFound になってしまいます。
どなたか詳しい方、いらっしゃいませんか?
以下、作業ログです。

$ vi Vagrantfile
Vagrant::Config.run do |config|

 config.vm.provision :chef_solo do |chef|
   chef.recipe_url = 'https://github.com/hokkai7go/cookbooks/tarball/master'
   chef.add_recipe 'curl'
 end
end

vagrant provision や、 vagrant reload を実行すると以下のように表示されます。

[2013-01-14T12:19:34+01:00] INFO: *** Chef 10.14.2 ***
[2013-01-14T12:19:34+01:00] INFO: Setting the run_list to ["recipe[curl]"] from JSON
[2013-01-14T12:19:34+01:00] INFO: Run List is [recipe[curl]]
[2013-01-14T12:19:34+01:00] INFO: Run List expands to [curl]
[2013-01-14T12:19:34+01:00] INFO: Starting Chef Run for lucid32.hsd1.ca.comcast.net.
[2013-01-14T12:19:34+01:00] INFO: Running start handlers
[2013-01-14T12:19:34+01:00] INFO: Start handlers complete.
[2013-01-14T12:19:34+01:00] ERROR: Running exception handlers
[2013-01-14T12:19:34+01:00] ERROR: Exception handlers complete
[2013-01-14T12:19:34+01:00] FATAL: Stacktrace dumped to /tmp/vagrant-chef-1/chef-stacktrace.out
[2013-01-14T12:19:34+01:00] FATAL: Chef::Exceptions::CookbookNotFound: Cookbook curl not found. If you're loading curl from another cookbook, make sure you configure the dependency in your metadata

元になった box は lucid32 なんですが、なぜこの表示になるのか…
[2013-01-14T12:19:34+01:00] INFO: Starting Chef Run for lucid32.hsd1.ca.comcast.net.

$ vagrant ssh
$ sudo less /tmp/vagrant-chef-1/chef-stacktrace.out
Chef::Exceptions::CookbookNotFound: Cookbook curl not found. If you're loading curl from another cookbook, make sure you configure the dependency in your metadata

肉さんのご指摘を受けて確認してみました。

$ grep cookbook_path /tmp/vagrant-chef-1/solo.rb
cookbook_path ["/tmp/vagrant-chef-1/cookbooks/cookbooks"]
$ ls /tmp/vagrant-chef-1/cookbooks/         
hokkai7go-cookbooks-0400c59
$ ls /tmp/vagrant-chef-1/cookbooks/hokkai7go-cookbooks-0400c59
apache2  apt  byobu  curl  git-core  libavahi-common3  postgresql84  rvm  timezone  tomcat6  vagrant_main  vim  zsh

ここに展開されていました。意図しないところに展開されていたので、アドバイスに沿ってやってみます

回答

vagrant 上で,期待しているディレクトリに cookbook が展開されていないように思えます.

僕のvagrant環境の場合だと vagrant 上で

$ grep cookbook_path /tmp/vagrant-chef-1/solo.rb
cookbook_path ["/tmp/vagrant-chef-1/chef-solo-1/cookbooks"]
$ ls /tmp/vagrant-chef-1/chef-solo-1/cookbooks
apt  build-essential  chef-solo-search  cmigemo  emacs-snapshot  exuberant-ctags  git  java  locale  locale-gen  nodejs  rbenv  readline  ruby_build  screen  subversion  sudo  timezone  users  xml  zlib  zsh

というように cookbook_path で指定したディレクトリへ cookbooks が展開されています.
そちらの環境ではどうですか?

追記
githubからダウンロードしてきた tar を解凍した際のディレクトリ構造が,
chef-soloの説明に書いてあるように

cookbooks/
   |---- cbname1/
          |--attributes/ ... etc
   ...
   |---- cbname2/
          |--attributes/

となっていないようですね.

ローカルで

foo/
   |---- Vagrantfile
   |---- cookbooks
        |-- curl
        ...

という構造を作って

Vagrant::Config.run do |config|

  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = 'cookbooks'
    chef.add_recipe 'curl'
  end
end

とするのが一番簡単な気がします.

編集 履歴 (1)
  • ありがとうございます。
    確認してみたところ、
    ```
    $ grep cookbook_path /tmp/vagrant-chef-1/solo.rb
    cookbook_path ["/tmp/vagrant-chef-1/cookbooks/cookbooks"]
    ```
    となっていました。cookbooks/cookbookというpathは意図しないものですね。
    -
  • 僕の場合は recipe_url を利用していないので、パスが異なるかもしれません。
    solo.rb は設定ファイルなので、そこに cookbooks/cookbook というパスが書いてあるなら、それでも動作します。
    $ ls /tmp/vagrant-chef-1/cookbooks/cookbook はどうなりますか?curl などの recipe があることを想定しています。
    -
  • /tmp/vagrant-chef-1/cookbooks/cookbook ではなく、
    /tmp/vagrant-chef-1/cookbooks/hokkai7go-cookbooks-0400c59
    として展開されているので、NotFoundになっているみたいです。
    -
  • 確かに、https://nodeload.github.com/hokkai7go/cookbooks/legacy.tar.gz/master でダウンロード & 解凍すると、 hokkai7go-cookbooks-0400c59というフォルダができて、その中に curl などの recipe があります。 -
  • niku さんは、submodule として GitHub にある recipe を使っているんですねぇ〜。そっちのほうがいいのかな。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。