2
votes

I'm attempting to manage a windows web server with the chef 'iis' cookbook and vagrant.

When I attempt to run chef-solo, it throws an error that the cookbook is not found.

The error message:

sowens-MBP:vagrant-windows sowen$ vagrant provision
==> default: Running provisioner: chef_solo...
==> default: Vagrant does not support detecting whether Chef is installed
==> default: for the guest OS running in the machine. Vagrant will assume it is
==> default: installed and attempt to continue.
Generating chef JSON and uploading...
==> default: Running chef-solo...
==> default: [2015-02-10T16:18:24-08:00] INFO: *** Chef 12.0.3 ***
==> default: [2015-02-10T16:18:24-08:00] INFO: Chef-client pid: 2508
==> default: [2015-02-10T16:18:30-08:00] INFO: Setting the run_list to ["recipe[example-webserver2012]"] from CLI options
==> default:
==> default: [2015-02-10T16:18:30-08:00] INFO: Run List is [recipe[example-webserver2012]]
==> default: [2015-02-10T16:18:30-08:00] INFO: Run List expands to [example-webserver2012]
==> default: [2015-02-10T16:18:30-08:00] INFO: Starting Chef Run for vagrant-2012-r2.nv.com
==> default: [2015-02-10T16:18:30-08:00] INFO: Running start handlers
==> default: [2015-02-10T16:18:30-08:00] INFO: Start handlers complete.
==> default: [2015-02-10T16:18:30-08:00] ERROR: Running exception handlers
==> default:
==> default: [2015-02-10T16:18:30-08:00] ERROR: Exception handlers complete
==> default: [2015-02-10T16:18:30-08:00] FATAL: Stacktrace dumped to C:/var/chef/cache/chef-stacktrace.out
==> default: [2015-02-10T16:18:30-08:00] FATAL: Chef::Exceptions::CookbookNotFound: Cookbook iis not found. If you're loading iis from another cookbook, make sure you configure the dependency in your metadata
Chef never successfully completed! Any errors should be visible in the
output above. Please fix your recipes so that they properly complete.

Vagrantfile:

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(2) do |config|
  config.vm.box = "lmayorga1980/windows-2012r2"
  config.vm.communicator = "winrm"
  config.vm.network "forwarded_port", host: 3389, guest: 3389
  config.vm.provider "virtualbox" do |v|
    v.cpus = 2
    v.memory = 2048
  end

  # Provisioning
  config.vm.provision "chef_solo" do |chef|
    # chef.cookbooks_path = ['C:\vagrant']
    chef.add_recipe "example-webserver2012"
  end
end

Berksfile

source "https://supermarket.chef.io"

metadata

cookbook 'iis'

metadata.rb

name 'foobar'
...
depends 'iis'

recipes/default.rb

iis_site 'Default Web Site' do
  action [:stop, :delete]
end

The entire directory structure looks like this: The cookbook was created with berks cookbook example-webserver2012. There are 2 vagrant files, I'm using the one in the top level.

$ tree vagrant-windows/
vagrant-windows/
├── Vagrantfile
└── cookbooks
    └── example-webserver2012
        ├── Berksfile
        ├── Berksfile.lock
        ├── CHANGELOG.md
        ├── Gemfile
        ├── Gemfile.lock
        ├── LICENSE
        ├── README.md
        ├── Thorfile
        ├── Vagrantfile
        ├── attributes
        ├── chefignore
        ├── files
        │   └── default
        ├── libraries
        ├── metadata.rb
        ├── providers
        ├── recipes
        │   └── default.rb
        ├── resources
        ├── templates
        │   └── default
        └── test
            └── integration

Why is cookbook 'iis' not found?

1

1 Answers

0
votes

The reason the ISS cookbook isn't found is because your wrapper cookbook, example-webserver2012, declares a dependency on the IIS cookbook with Berkshelf. Unfortunately, Vagrant with the Chef solo provisioner does not know how to resolve Berkshelf dependencies out of the box. You have a couple options here.

  • use berks vendor to create a folder containing all the resolved cookbooks, and point the Vagrantfile at that folder.
  • use the vagrant berkshelf plugin to do berkshelf dependency resolution when you run vagrant provision.

From a workflow prospective I find the vagrant berkshelf plugin very useful.

P.S. In your Berksfile, you don't need to declare a dependency on the IIS cookbook, that dependency will be picked up from the metadata.rb because of the metadata line in your Berksfile.