Chef feat. Vagrant

Introduction

I've been interested in Chef for some time now. Chef and Puppet actually, but Puppet seemed kind of heavy-weight. They are both free configuration management tools for networks. The idea is to specify in a central repository what each node in the network should be like, as opposed to logging in to them one by one to update software or change settings. One could however use Chef simply to control a single server but that's not a common use case.

Prerequisites

You should have some experience running Linux systems as well as having at least one Linux computer to use as a testbed. Familiarity with Git or some other version management software is highly recommended due to the Chef workflow. As we get into Vagrant virtualization becomes of a focal point, in particular VirtualBox. I didn't know any Ruby before I began but some general scripting knowledge will be of great use to the reader.

It may be useful to know that the full blown Chef deployment is meant to include one or more Chef Server instances as well as workstations and clients. A workstation is a computer which has access to cookbooks and other configuration files and can upload them to the server. A client is just a computer or virtual machine that is configured to fetch instructions from a Chef Server. To get to know Chef it is sensible to use chef-solo which replaces the server and means you have a combined server, workstation and client.

Getting started

First of all you should get Chef install files. Chef client can be obtained from Apt or Yum but I've found the Opscode binaries more user friednly. Chef Server is only available from Opscode to my knowledge. Since I use Ubuntu I went to http://www.opscode.com/chef/install/ and chose Chef Client for starters. Then I chose Ubuntu, version 13.04 and x86_64 architecture. At the time of writing this text the download offered for this configuration is https://opscode-omnibus-packages.s3.amazonaws.com/ubuntu/13.04/x86_64/chef_11.6.0-1.ubuntu.13.04_amd64.deb but that will change over time of course.

Next, choose Chef Server and the right set of options for your platform of choice. Currently the offered package is https://opscode-omnibus-packages.s3.amazonaws.com/ubuntu/12.04/x86_64/chef-server_11.0.8-1.ubuntu.12.04_amd64.deb which as you will note is for Ubuntu 12.04 Precise, which is more than a year old but it will also run on Ubuntu 12.10 Quantal. I have not been able to make it run on Ubuntu 13.04 Raring however.

Start by installing Chef Client only: sudo dpkg -i chef_11.4.4-2.ubuntu.11.04_amd64.deb. Chef Client is sufficient to develop cookbooks or get configuration from a server . Chef Server is best understood as a central library and you usually don't use Chef Server directly but add information to it from a workstation. More about that later.

The repo

Let's start familiarizing ourselves with cookbooks and recipes. Technically you can just write simple Ruby scripts in the Chef language and then test the script by executing chef-apply script.rb, but that soon becomes insufficient. Instead we're going to create a proper Chef repository. Thankfully a properly arranged standard Chef repo is available from Opscode. I fetch it via Git: git clone https://github.com/opscode/chef-repo.git.

We are going to be using the chef-solo executable and need to inform it about where things are located. I put my file under chef-repo/config/chef-solo.rb You could look at a really simple on at http://www.opinionatedprogrammer.com/2011/06/chef-solo-tutorial-managing-a-single-server-with-chef/ but I used one from https://gist.github.com/wilmoore/1039666 which customized for my own system becomes:

# .chef/knife.rb
# SEE: http://wiki.opscode.com/display/chef/Troubleshooting+and+Technical+FAQ
# set some sensible defaults
current_dir = File.dirname(__FILE__)
user        = ENV['OPSCODE_USER'] || ENV['USER']
# 
log_level                :debug
log_location             STDOUT
node_name                `hostname`
client_key               ''
validation_client_name   ''
#validation_key           "#{current_dir}/validation.pem"
chef_server_url          ''
cache_type               'BasicFile'
cache_options( :path => "#{ENV['HOME']}/.chef/checksums" )
cookbook_path            "/home/cjp/Documents/chef-repo/cookbooks"
cookbook_copyright       'CJP'
cookbook_license         'apachev2'
cookbook_email           'johaolof@gmail.com'
#environment_path        "#{current_dir}/../environments"
role_path	             "/home/cjp/Documents/chef-repo/roles"

So we've done a lot of work and what do we have to show for it? Nothing obviously useful is a kind way to describe what we have before us. But now we can create a cookbook!

cjp@ubuntu1304:~$ cd Documents/chef-repo/
cjp@ubuntu1304:~/Documents/chef-repo$ knife cookbook create ntp

Writing recipes

Now we have a new cookbook called ntp. It is a common tutorial cookbook:
https://learnchef.opscode.com/common-use-cases/ntp/ http://blog.afistfulofservers.net/post/2011/03/16/a-brief-chef-tutorial-from-concentrate/ http://www.tikalk.com/alm/writing-chef-cookbook

I won't rehash the tutorials but when you think you have some viable(at least two files: ntp/recipes/default.rb and ntp/templates/ntp.conf.erb) you can try to run the cookbook.

sudo chef-solo -c config/chef-solo.rb -o "recipe[ntp]"

This may work or it may fail. It it fails you hopefully get some meaningfull feedback because the debugging tool chef-shell isn't very helpful. It couldn't find snow in the middle of winter, much less your cookbooks!

Take the opportunity to execute ohai and pipe the output to less or some other pager. It will return a huge array of information about the node you're working on that you can use when writing recipes.

Chef Server

Installing Chef Server using the so-called omnibus installer from Opscode that we fetched before is dead simple. sudo dpkg -i chef-server_11.0.8-1.ubuntu.12.04_amd64.deb. This will take a few minutes. Afterwards you will be asked to execute sudo chef-server-ctl reconfigure which is an automatic process. After that you should be able to go to https://localhost to login to Chef Server's Web UI. If you don't use your server as a workstation you have to write https://(hostname of chef server). IP-addresses don't work so well because Nginx tries to rewrite the URL to tour Chef server's hostname. So if you don't have your DNS server set up properly you can be in for a trying couple of hours. Indeed I finally took the time to set up a proper DNS server on my network while working on this project.

Certificates and configuration files

Chef Server is a real pain because of the confusing or non-existent instructions about how to interact with the server. Let's start out by trying to configure a Chef client without concerning ourselves with these matters. The tool for interacting with a Chef server is called knife:

cjp@ubuntu1304:~$ knife configure
WARNING: No knife configuration file found
Where should I put the config file? [/home/cjp/.chef/knife.rb]

So far so good.

Please enter the chef server URL: [http://ubuntu1304:4000]

Ah... This has the following solution on my network where the workstation isn't the server.

Please enter the chef server URL: [http://ubuntu1304:4000] https://chefserver.svealiden.se

So the following changes are important: httpS instead of http. Next comes the hostname for the Chef server, which I've cleverly set to chefserver. Finally, no port definition at the end. How are you supposed to know this? I have no idea. Let's just continue.

Please enter an existing username or clientname for the API: [cjp]
Please enter the validation clientname: [chef-validator]

I just press enter on these two lines. The first one refers to interacting with the Chef server via a RESTful API. Not my cup of tea.Next is the name used for validating clients. I just keep the default name.

Please enter the location of the validation key: [/etc/chef/validation.pem] /etc/chef/chef-validator.pem

This last change is just because I am lazy. The file being requested is one generated by and located on the Chef server. On Ubuntu the file is found in /etc/chef-server/chef-validator.chef and I just copy it to Chef clients instead of renaming to validation.pem. But the answer to this question must correspond to the file the Chef server calls chef-validator.pem, one way or the other.

Please enter the path to a chef repository (or leave blank): /home/cjp/Documents/chef-repo

This one is very useful as it allows knife to find our cookbooks without us having to supply the path every time we invoke it. After this configuration phase we get a file .chef/knife.rb which on my workstation contains:

log_level                :info
log_location             STDOUT
node_name                'admin'
client_key               '/home/cjp/.chef/admin.pem'
validation_client_name   'chef-validator'
validation_key           '/etc/chef/chef-validator.pem'
chef_server_url          'https://chefserver.svealiden.se'
syntax_check_cache_path  '/home/cjp/.chef/syntax_check_cache'
cookbook_path		     '/home/cjp/Documents/chef-repo/cookbooks'
role_path		         '/home/cjp/Documents/chef-repo/roles'

NOTE the admin.pem key that is also referenced in this configuration file. It is also to be fetched from the Chef server. On Ubuntu it is located in /etc/chef-server/admin.pem along with the other certificates.

I added role_path to the file but that doesn't work as well as I had hoped. Even though I have roles defined in chef-repo/roles/ I can only make use of them by invoking knife role from file roles/basic_setup.rb for instance. This will create a role on the server based on the contents of the given file.

Letting other people do the work

Chef is heavily inspired by Open Source even though Opscode don't share everything under an open license. There are plenty of prepared cookbooks available from the Opscode website, including many that have been uploaded by people and companies who use Chef themselves. I wrote some cookbooks myself. cifs-local and ssh-local install configuration files that I (try to) have on all my computers so that I can easily log in and copy data. Byobu was more of a traditional recipe that both installs software(Byobu) as well as configuration files. In this case my own customized keybindings and status settings. The following cookbooks I downloaded from Opscode:

apache2application
application_java
application_ruby
apt
bluepill
build-essential
chef-client
chef_handler
cifs-client
cron
dmg
duplicity
emacs
erlang
git
google-chrome
iptables
java
jenkins
krb5
line
logwatch
mongodb
mysql
nagios
nano
nfs
nginx
nginx_simplecgi
nodejs
nscd
ntp
ohai
openldap
openssh
openssl
openvz
ossec
passenger_apache2
perl
php
rsync
rsyslog
runit
subversion
tomcat
tomcat-solr
unicorn
windows
xml
yum

You could do this by downloading tar files and extract them but it is much easier to let knife do this:

knife cookbook site install chef-client

This particular cookbook installs services and configuration files to make a Chef client continually check in with the server to fetch potential changes.

Vagrant

Introduction

I use virtualization a lot! Currently I almost always use VirtualBox but I have used VMware ESXi, Xen and Solaris Zones quite a bit over the years as well. VirtualBox is nice in that it runs on a lot of systems and allows for tight integration with the host machine using something called Guest Additions. Vagrant is a kind of scripting framework for virtualization solutions like those mentioned above. It started out being compatible only with VirtualBox but now supports other providers to some extent.

Versions

I started out using Vagrant from the Ubuntu repositories which meant Vagrant 1.0.9 or something like that. It is much better to get Vagrant directly from their web site at vagrantup.com. They have Vagrant 1.2.4 which is oddly referred to as v2. So if you find documentation referring to v2 it means Vagrant 1.2.*.

Boxes

Vagrant has a concept "box" which means a packaged virtual machine prepared to be used with Vagrant. There are plenty of them available out there but I make my own. It's quite straight forward. Create an ordinary VM in VirtualBox. We are advised to install as much of a bare-bone system as possible. I can't be bothered to do that and use the standard Ubuntu server installer that leaves me with a box between 400MB and 650MB in size. The recommended size is just over 300MB but that's mainly because people might want to share them over the internet and then you don't want to have to transfer locales for Mongolian or vi.

Once a basic install is in place you need to create a user account vagrant with password "vagrant". Also try to set the root password to "vagrant". Next you should allow the vagrant user to execute sudo without providing a password. On Ubuntu this is accomplished by creating a file /etc/sudoers.d/vagrant with the following content:

vagrant ALL=(ALL) NOPASSWD: ALL

Also include the default public key for Vagrant to the new user's .ssh/authorized_keys file. The key can be found at https://github.com/mitchellh/vagrant/blob/master/keys/vagrant.pub

vagrant@chefclient1:~$ mkdir .ssh
vagrant@chefclient1:~$ wget https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub
--2013-07-22 21:29:15--  https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub
Resolving raw.github.com (raw.github.com)... 199.27.76.133
Connecting to raw.github.com (raw.github.com)|199.27.76.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 409 [text/plain]
Saving to: vagrant.pub
100%[==================================================>] 409         --.-K/s   in 0s
2013-07-22 21:29:20 (7.26 MB/s) - vagrant.pub saved [409/409]
vagrant@chefclient1:~$ cat vagrant.pub >> .ssh/authorized_keys
vagrant@chefclient1:~$ cat .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7g
HzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkED
o3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR
61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+
FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public
key

Now we need to set the right permissions:

vagrant@chefclient1:~$ chmod 700 .ssh/
vagrant@chefclient1:~$ chmod 600 .ssh/authorized_keys

Finally we should install Guest Additions. For that we need gcc and make. Well, I don't know about make but I install it for good measure.

vagrant@chefclient1:~$ sudo apt-get install gcc make

I let Oracle explain the rest of the procedure http://www.virtualbox.org/manual/ch04.html#idp11306688 though I see they seem to favor dkms which I haven't had much luck with.

Packaging

Now that we have prepared our virtual machine we package it. I called my machines UbuntuQ for Quantal and UbuntuR for Raring so I made my boxes as follows:

vagrant box package --base UbuntuQ --output UbuntuQ.box
vagrant box package --base UbuntuR --output UbuntuR.box

Well both invocations generate a lot of output but you'll see that yourself. Next we need to add our boxes to Vagrant:

vagrant box add Quantal UbuntuQ.box
vagrant box add Raring UbuntuR.box

Above I used a prepared vagrant box to illustrate how to set up SSH keys. It was created as follows:

mkdir ChefClient1
cd ChefClient1/
vagrant init Quantal
vagrant up

To be honest I changed some settings in the Vagrantfile before running vagrant up but we'll get to that soon. Now, it takes some trial and error to get Virtual machines prepared for Vagrant boxing. It easy to forget changing permissions on some file or adding an sudoers file. It is however a simple matter of going back and changing the source VM. Packaging a VM into a box does not change the original VM. so it can just be booted, changed, shut down, repackaged and reimported.

Vagrant semantics

vagrant box package : Package a VirtualBox VM for Vagrant use without checking if it has been properly prepared.vagrant box add : Register a box under a certain name. vagrant box remove : Remove a box based on its name. Does not affect existing Vagrant guests originally based on the box! vagrant up : Start a guest based on a Vagrantfile. Import and initialize the guest if it hasn't already been done. vagrant halt : Shut down a guest, gently if possible. vagrant destroy : Remove everything except the Vagrantfile of a guest. vagrant ssh : Use clever Vagrant auto-configuration to log in as vagrant on a running guest. Assumes you are in the same folder as the Vagrantfile.

Vagrantfile

Vagrantfiles are generated automatically but can be modified. I like adding config.vm.hostname = "newhostname" and also tend to ask that a bridged adapter(called public_network in Vagrant v2) be created as well:

# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
  # All Vagrant configuration is done here. The most common configuration
  # options are documented and commented below. For a complete reference,
  # please see the online documentation at vagrantup.com.
  # Every Vagrant virtual environment requires a box to build off of.
  config.vm.box = "Raring"
  config.vm.hostname = "chefclient1"
  # Create a public network, which generally matched to bridged network.
  # Bridged networks make the machine appear as another physical device on
  # your network.
  config.vm.network :public_network
end

Chef and Vagrant

I omitted a piece from the previous file. That's because I didn't mention that I installed Chef Client on the Vagrant VM before I packaged it. The file looks like this without any editing:

# vi: set ft=ruby :
Vagrant.configure("2") do |config|
  # All Vagrant configuration is done here. The most common configuration
  # options are documented and commented below. For a complete reference,
  # please see the online documentation at vagrantup.com.
  # Every Vagrant virtual environment requires a box to build off of.
  config.vm.box = "Raring"
  config.vm.hostname = "chefclient1"
  # The url from where the 'config.vm.box' box will be fetched if it
  # doesn't already exist on the user's system.
  # config.vm.box_url = "http://domain.com/path/to/above.box"
  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine. In the example below,
  # accessing "localhost:8080" will access port 80 on the guest machine.
  # config.vm.network :forwarded_port, guest: 80, host: 8080
  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  # config.vm.network :private_network, ip: "192.168.33.10"
  # Create a public network, which generally matched to bridged network.
  # Bridged networks make the machine appear as another physical device on
  # your network.
  config.vm.network :public_network
  # If true, then any SSH connections made will enable agent forwarding.
  # Default value: false
  # config.ssh.forward_agent = true
  # Share an additional folder to the guest VM. The first argument is
  # the path on the host to the actual folder. The second argument is
  # the path on the guest to mount the folder. And the optional third
  # argument is a set of non-required options.
  # config.vm.synced_folder "../data", "/vagrant_data"
  # Provider-specific configuration so you can fine-tune various
  # backing providers for Vagrant. These expose provider-specific options.
  # Example for VirtualBox:
  #
  # config.vm.provider :virtualbox do |vb|
  #   # Don't boot with headless mode
  #   vb.gui = true
  #
  #   # Use VBoxManage to customize the VM. For example to change memory:
  #   vb.customize ["modifyvm", :id, "--memory", "1024"]
  # end
  #
  # View the documentation for the provider you're using for more
  # information on available options.
  # Enable provisioning with Puppet stand alone.  Puppet manifests
  # are contained in a directory path relative to this Vagrantfile.
  # You will need to create the manifests directory and a manifest in
  # the file Raring.pp in the manifests_path directory.
  #
  # An example Puppet manifest to provision the message of the day:
  #
  # # group { "puppet":
  # #   ensure => "present",
  # # }
  # #
  # # File { owner => 0, group => 0, mode => 0644 }
  # #
  # # file { '/etc/motd':
  # #   content => "Welcome to your Vagrant-built virtual machine!
  # #               Managed by Puppet.\n"
  # # }
  #
  # config.vm.provision :puppet do |puppet|
  #   puppet.manifests_path = "manifests"
  #   puppet.manifest_file  = "init.pp"
  # end
  # Enable provisioning with chef solo, specifying a cookbooks path, roles
  # path, and data_bags path (all relative to this Vagrantfile), and adding
  # some recipes and/or roles.
  #
  # config.vm.provision :chef_solo do |chef|
  #   chef.cookbooks_path = "../my-recipes/cookbooks"
  #   chef.roles_path = "../my-recipes/roles"
  #   chef.data_bags_path = "../my-recipes/data_bags"
  #   chef.add_recipe "mysql"
  #   chef.add_role "web"
  #
  #   # You may also specify custom JSON attributes:
  #   chef.json = { :mysql_password => "foo" }
  # end
  # Enable provisioning with chef server, specifying the chef server URL,
  # and the path to the validation key (relative to this Vagrantfile).
  #
  # The Opscode Platform uses HTTPS. Substitute your organization for
  # ORGNAME in the URL and validation key.
  #
  # If you have your own Chef Server, use the appropriate URL, which may be
  # HTTP instead of HTTPS depending on your configuration. Also change the
  # validation key to validation.pem.
  #
  config.vm.provision :chef_client do |chef|
    chef.chef_server_url = "https://chefserver.svealiden.se"
    chef.validation_key_path = "chef-validator.pem"
  end
  #
  # If you're using the Opscode platform, your validator client is
  # ORGNAME-validator, replacing ORGNAME with your organization name.
  #
  # If you have your own Chef Server, the default validation client name is
  # chef-validator, unless you changed the configuration.
  #
  #   chef.validation_client_name = "ORGNAME-validator"
end

Note the chef client stuff almost at the end.

  config.vm.provision :chef_client do |chef|
    chef.chef_server_url = "https://chefserver.svealiden.se"
    chef.validation_key_path = "chef-validator.pem"
  end

The first line simple says that we should use Chef Client as opposed to chef-solo. The next line gives the URL of the Chef server. Finally comes our old Nemesis, chef-validator.pem. It's easy to think that this is supposed to be a file inside the guest to be created, but it isn't! The file chef-validator.pem is expected to be located right next to the Vagrantfile. Apparently Vagrant copies the file into the guest itself before running chef-client. However it is done, it works!

The above configuration is a bit weak. It will work but it will not run any recipes and as such will not set chef-client to run repeatedly to stay in line with the settings on the Chef server. Let's try the following:

config.vm.provision :chef_client do |chef|    chef.chef_server_url = "https://chefserver.svealiden.se"
    chef.validation_key_path = "chef-validator.pem"
	chef.add_role "basic_setup"
  end
cjp@vhost:~/ChefTest2$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Importing base box 'Raring'...
[default] Matching MAC address for NAT networking...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
The validation key set for `config.chef.validation_key_path` does not exist! This
file needs to exist so it can be uploaded to the virtual machine.
cjp@vhost:~/ChefTest2$ cp ../ChefTest1/chef-validator.pem .
cjp@vhost:~/ChefTest2$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[default] Fixed port collision for 22 => 2222. Now on port 2201.
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2201 (adapter 1)
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few minutes.
[default] VM booted and ready for use!
[default] Setting hostname...
[default] Configuring and enabling network interfaces...
[default] Mounting shared folders...
[default] -- /vagrant
[default] Running provisioner: chef_client...
Creating folder to hold client key...
Uploading chef client validation key...
Generating chef JSON and uploading...
Running chef-client...
stdin: is not a tty
[2013-07-22T22:12:08+02:00] INFO: *** Chef 11.4.4 ***
[2013-07-22T22:12:09+02:00] INFO: [inet6] no default interface, picking the first ipaddress
[2013-07-22T22:12:09+02:00] INFO: ipaddress and ip6address are set from different interfaces (eth0 & eth1), macaddress has been set using the ipaddress interface
[2013-07-22T22:12:10+02:00] INFO: Client key /etc/chef/client.pem is not present - registering
[2013-07-22T22:12:15+02:00] INFO: Setting the run_list to ["role[basic_setup]"] from JSON
[2013-07-22T22:12:15+02:00] INFO: Run List is [role[basic_setup]]
[2013-07-22T22:12:15+02:00] INFO: Run List expands to [emacs, rsync, nano, byobu, cifs-client, ssh-local, cifs-local, git, chef-client, ntp, chef-client::config]
[2013-07-22T22:12:15+02:00] INFO: Starting Chef Run for chefclient2
[2013-07-22T22:12:15+02:00] INFO: Running start handlers
[2013-07-22T22:12:15+02:00] INFO: Start handlers complete.
[2013-07-22T22:12:16+02:00] INFO: Loading cookbooks [build-essential, byobu, chef-client, chef_handler, cifs-client, cifs-local, cron, dmg, emacs, git, nano, ntp, rsync, runit, ssh-local, windows, yum]
[2013-07-22T22:12:16+02:00] INFO: Storing updated cookbooks/ntp/recipes/disable.rb in the cache.
[2013-07-22T22:12:16+02:00] INFO: Storing updated cookbooks/ntp/recipes/default.rb in the cache.
[2013-07-22T22:12:16+02:00] INFO: Storing updated cookbooks/ntp/recipes/undo.rb in the cache.
[2013-07-22T22:12:16+02:00] INFO: Storing updated cookbooks/ntp/recipes/ntpdate.rb in the cache.
[2013-07-22T22:12:16+02:00] INFO: Storing updated cookbooks/ntp/attributes/default.rb in the cache.
[2013-07-22T22:12:16+02:00] INFO: Storing updated cookbooks/ntp/attributes/ntpdate.rb in the cache.
[2013-07-22T22:12:16+02:00] INFO: Storing updated cookbooks/ntp/.gitignore in the cache.
[2013-07-22T22:12:16+02:00] INFO: Storing updated cookbooks/ntp/Rakefile in the cache.
[2013-07-22T22:12:16+02:00] INFO: Storing updated cookbooks/ntp/metadata.json in the cache.
[2013-07-22T22:12:16+02:00] INFO: Storing updated cookbooks/ntp/LICENSE in the cache.
[2013-07-22T22:12:16+02:00] INFO: Storing updated cookbooks/ntp/.travis.yml in the cache.
[2013-07-22T22:12:16+02:00] INFO: Storing updated cookbooks/ntp/CHANGELOG.md in the cache.
[2013-07-22T22:12:16+02:00] INFO: Storing updated cookbooks/ntp/TESTING.md in the cache.
[2013-07-22T22:12:16+02:00] INFO: Storing updated cookbooks/ntp/chefignore in the cache.
[2013-07-22T22:12:16+02:00] INFO: Storing updated cookbooks/ntp/CONTRIBUTING in the cache.
[2013-07-22T22:12:16+02:00] INFO: Storing updated cookbooks/ntp/README.md in the cache.
[2013-07-22T22:12:16+02:00] INFO: Storing updated cookbooks/ntp/metadata.rb in the cache.
[2013-07-22T22:12:16+02:00] INFO: Storing updated cookbooks/cron/resources/d.rb in the cache.
[2013-07-22T22:12:16+02:00] INFO: Storing updated cookbooks/cron/providers/d.rb in the cache.
[2013-07-22T22:12:16+02:00] INFO: Storing updated cookbooks/cron/recipes/default.rb in the cache.
[2013-07-22T22:12:16+02:00] INFO: Storing updated cookbooks/cron/recipes/test.rb in the cache.
[2013-07-22T22:12:16+02:00] INFO: Storing updated cookbooks/cron/CONTRIBUTING in the cache.
[2013-07-22T22:12:16+02:00] INFO: Storing updated cookbooks/cron/metadata.rb in the cache.
[2013-07-22T22:12:16+02:00] INFO: Storing updated cookbooks/cron/.gitignore in the cache.
[2013-07-22T22:12:16+02:00] INFO: Storing updated cookbooks/cron/Berksfile in the cache.
[2013-07-22T22:12:16+02:00] INFO: Storing updated cookbooks/cron/CHANGELOG.md in the cache.
[2013-07-22T22:12:16+02:00] INFO: Storing updated cookbooks/cron/TESTING.md in the cache.
[2013-07-22T22:12:16+02:00] INFO: Storing updated cookbooks/cron/metadata.json in the cache.
[2013-07-22T22:12:17+02:00] INFO: Storing updated cookbooks/cron/README.md in the cache.
[2013-07-22T22:12:17+02:00] INFO: Storing updated cookbooks/cron/LICENSE in the cache.
[2013-07-22T22:12:17+02:00] INFO: Storing updated cookbooks/cron/.kitchen.yml in the cache.
[2013-07-22T22:12:17+02:00] INFO: Storing updated cookbooks/cron/Gemfile in the cache.
[2013-07-22T22:12:17+02:00] INFO: Storing updated cookbooks/chef-client/recipes/bluepill_service.rb in the cache.
[2013-07-22T22:12:17+02:00] INFO: Storing updated cookbooks/chef-client/recipes/config.rb in the cache.
[2013-07-22T22:12:17+02:00] INFO: Storing updated cookbooks/chef-client/recipes/bsd_service.rb in the cache.
[2013-07-22T22:12:17+02:00] INFO: Storing updated cookbooks/chef-client/recipes/upstart_service.rb in the cache.
[2013-07-22T22:12:17+02:00] INFO: Storing updated cookbooks/chef-client/recipes/arch_service.rb in the cache.
[2013-07-22T22:12:17+02:00] INFO: Storing updated cookbooks/chef-client/recipes/winsw_service.rb in the cache.
[2013-07-22T22:12:17+02:00] INFO: Storing updated cookbooks/chef-client/recipes/daemontools_service.rb in the cache.
[2013-07-22T22:12:17+02:00] INFO: Storing updated cookbooks/chef-client/recipes/cron.rb in the cache.
[2013-07-22T22:12:17+02:00] INFO: Storing updated cookbooks/chef-client/recipes/default.rb in the cache.
[2013-07-22T22:12:17+02:00] INFO: Storing updated cookbooks/chef-client/recipes/runit_service.rb in the cache.
[2013-07-22T22:12:17+02:00] INFO: Storing updated cookbooks/chef-client/recipes/task.rb in the cache.
[2013-07-22T22:12:17+02:00] INFO: Storing updated cookbooks/chef-client/recipes/init_service.rb in the cache.
[2013-07-22T22:12:17+02:00] INFO: Storing updated cookbooks/chef-client/recipes/smf_service.rb in the cache.
[2013-07-22T22:12:17+02:00] INFO: Storing updated cookbooks/chef-client/recipes/launchd_service.rb in the cache.
[2013-07-22T22:12:17+02:00] INFO: Storing updated cookbooks/chef-client/recipes/service.rb in the cache.
[2013-07-22T22:12:17+02:00] INFO: Storing updated cookbooks/chef-client/recipes/delete_validation.rb in the cache.
[2013-07-22T22:12:17+02:00] INFO: Storing updated cookbooks/chef-client/libraries/helpers.rb in the cache.
[2013-07-22T22:12:17+02:00] INFO: Storing updated cookbooks/chef-client/attributes/default.rb in the cache.
[2013-07-22T22:12:17+02:00] INFO: Storing updated cookbooks/chef-client/Berksfile in the cache.
[2013-07-22T22:12:17+02:00] INFO: Storing updated cookbooks/chef-client/CONTRIBUTING in the cache.
[2013-07-22T22:12:17+02:00] INFO: Storing updated cookbooks/chef-client/metadata.json in the cache.
[2013-07-22T22:12:18+02:00] INFO: Storing updated cookbooks/chef-client/TESTING.md in the cache.
[2013-07-22T22:12:18+02:00] INFO: Storing updated cookbooks/chef-client/LICENSE in the cache.
[2013-07-22T22:12:18+02:00] INFO: Storing updated cookbooks/chef-client/CHANGELOG.md in the cache.
[2013-07-22T22:12:18+02:00] INFO: Storing updated cookbooks/chef-client/.gitignore in the cache.
[2013-07-22T22:12:18+02:00] INFO: Storing updated cookbooks/chef-client/metadata.rb in the cache.
[2013-07-22T22:12:18+02:00] INFO: Storing updated cookbooks/chef-client/.kitchen.yml in the cache.
[2013-07-22T22:12:18+02:00] INFO: Storing updated cookbooks/chef-client/README.md in the cache.
[2013-07-22T22:12:18+02:00] INFO: Storing updated cookbooks/yum/resources/repository.rb in the cache.
[2013-07-22T22:12:18+02:00] INFO: Storing updated cookbooks/yum/resources/key.rb in the cache.
[2013-07-22T22:12:18+02:00] INFO: Storing updated cookbooks/yum/providers/repository.rb in the cache.
[2013-07-22T22:12:18+02:00] INFO: Storing updated cookbooks/yum/providers/key.rb in the cache.
[2013-07-22T22:12:18+02:00] INFO: Storing updated cookbooks/yum/recipes/repoforge.rb in the cache.
[2013-07-22T22:12:18+02:00] INFO: Storing updated cookbooks/yum/recipes/elrepo.rb in the cache.
[2013-07-22T22:12:18+02:00] INFO: Storing updated cookbooks/yum/recipes/test.rb in the cache.
[2013-07-22T22:12:18+02:00] INFO: Storing updated cookbooks/yum/recipes/ius.rb in the cache.
[2013-07-22T22:12:18+02:00] INFO: Storing updated cookbooks/yum/recipes/epel.rb in the cache.
[2013-07-22T22:12:18+02:00] INFO: Storing updated cookbooks/yum/recipes/default.rb in the cache.
[2013-07-22T22:12:18+02:00] INFO: Storing updated cookbooks/yum/recipes/yum.rb in the cache.
[2013-07-22T22:12:18+02:00] INFO: Storing updated cookbooks/yum/recipes/remi.rb in the cache.
[2013-07-22T22:12:18+02:00] INFO: Storing updated cookbooks/yum/attributes/default.rb in the cache.
[2013-07-22T22:12:18+02:00] INFO: Storing updated cookbooks/yum/attributes/remi.rb in the cache.
[2013-07-22T22:12:18+02:00] INFO: Storing updated cookbooks/yum/attributes/epel.rb in the cache.
[2013-07-22T22:12:18+02:00] INFO: Storing updated cookbooks/yum/attributes/elrepo.rb in the cache.
[2013-07-22T22:12:18+02:00] INFO: Storing updated cookbooks/yum/metadata.json in the cache.
[2013-07-22T22:12:18+02:00] INFO: Storing updated cookbooks/yum/Berksfile in the cache.
[2013-07-22T22:12:18+02:00] INFO: Storing updated cookbooks/yum/CHANGELOG.md in the cache.
[2013-07-22T22:12:19+02:00] INFO: Storing updated cookbooks/yum/CONTRIBUTING.md in the cache.
[2013-07-22T22:12:19+02:00] INFO: Storing updated cookbooks/yum/LICENSE in the cache.
[2013-07-22T22:12:19+02:00] INFO: Storing updated cookbooks/yum/.gitignore in the cache.
[2013-07-22T22:12:19+02:00] INFO: Storing updated cookbooks/yum/README.md in the cache.
[2013-07-22T22:12:19+02:00] INFO: Storing updated cookbooks/yum/metadata.rb in the cache.
[2013-07-22T22:12:19+02:00] INFO: Storing updated cookbooks/yum/.kitchen.yml in the cache.
[2013-07-22T22:12:19+02:00] INFO: Storing updated cookbooks/build-essential/recipes/suse.rb in the cache.
[2013-07-22T22:12:19+02:00] INFO: Storing updated cookbooks/build-essential/recipes/rhel.rb in the cache.
[2013-07-22T22:12:19+02:00] INFO: Storing updated cookbooks/build-essential/recipes/smartos.rb in the cache.
[2013-07-22T22:12:19+02:00] INFO: Storing updated cookbooks/build-essential/recipes/mac_os_x.rb in the cache.
[2013-07-22T22:12:19+02:00] INFO: Storing updated cookbooks/build-essential/recipes/debian.rb in the cache.
[2013-07-22T22:12:19+02:00] INFO: Storing updated cookbooks/build-essential/recipes/solaris2.rb in the cache.
[2013-07-22T22:12:19+02:00] INFO: Storing updated cookbooks/build-essential/recipes/fedora.rb in the cache.
[2013-07-22T22:12:19+02:00] INFO: Storing updated cookbooks/build-essential/recipes/default.rb in the cache.
[2013-07-22T22:12:19+02:00] INFO: Storing updated cookbooks/build-essential/attributes/default.rb in the cache.
[2013-07-22T22:12:19+02:00] INFO: Storing updated cookbooks/build-essential/README.md in the cache.
[2013-07-22T22:12:19+02:00] INFO: Storing updated cookbooks/build-essential/.kitchen.yml in the cache.
[2013-07-22T22:12:19+02:00] INFO: Storing updated cookbooks/build-essential/LICENSE in the cache.
[2013-07-22T22:12:19+02:00] INFO: Storing updated cookbooks/build-essential/metadata.json in the cache.
[2013-07-22T22:12:19+02:00] INFO: Storing updated cookbooks/build-essential/.gitignore in the cache.
[2013-07-22T22:12:19+02:00] INFO: Storing updated cookbooks/build-essential/CHANGELOG.md in the cache.
[2013-07-22T22:12:19+02:00] INFO: Storing updated cookbooks/build-essential/metadata.rb in the cache.
[2013-07-22T22:12:19+02:00] INFO: Storing updated cookbooks/build-essential/TESTING.md in the cache.
[2013-07-22T22:12:19+02:00] INFO: Storing updated cookbooks/build-essential/CONTRIBUTING in the cache.
[2013-07-22T22:12:19+02:00] INFO: Storing updated cookbooks/build-essential/Berksfile in the cache.
[2013-07-22T22:12:19+02:00] INFO: Storing updated cookbooks/runit/recipes/default.rb in the cache.
[2013-07-22T22:12:19+02:00] INFO: Storing updated cookbooks/runit/libraries/default.rb in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/runit/libraries/resource_runit_service.rb in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/runit/libraries/provider_runit_service.rb in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/runit/attributes/default.rb in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/runit/Berksfile in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/runit/LICENSE in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/runit/CONTRIBUTING.md in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/runit/CHANGELOG.md in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/runit/Rakefile in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/runit/Gemfile in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/runit/metadata.json in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/runit/.gitignore in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/runit/metadata.rb in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/runit/.kitchen.yml in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/runit/README.md in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/chef_handler/resources/default.rb in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/chef_handler/providers/default.rb in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/chef_handler/recipes/json_file.rb in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/chef_handler/recipes/default.rb in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/chef_handler/attributes/default.rb in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/chef_handler/README.md in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/chef_handler/metadata.rb in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/chef_handler/CHANGELOG.md in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/chef_handler/LICENSE in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/chef_handler/CONTRIBUTING in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/chef_handler/metadata.json in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/windows/resources/feature.rb in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/windows/resources/batch.rb in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/windows/resources/reboot.rb in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/windows/resources/auto_run.rb in the cache.
[2013-07-22T22:12:20+02:00] INFO: Storing updated cookbooks/windows/resources/shortcut.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/resources/task.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/resources/registry.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/resources/printer.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/resources/package.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/resources/path.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/resources/zipfile.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/resources/printer_port.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/resources/pagefile.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/providers/package.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/providers/registry.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/providers/printer.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/providers/feature_servermanagercmd.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/providers/pagefile.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/providers/path.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/providers/zipfile.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/providers/feature_dism.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/providers/batch.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/providers/reboot.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/providers/task.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/providers/auto_run.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/providers/shortcut.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/providers/printer_port.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/recipes/default.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/recipes/reboot_handler.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/libraries/windows_privileged.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/libraries/registry_helper.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/libraries/version.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/libraries/helper.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/libraries/feature_base.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/attributes/default.rb in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/LICENSE in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/README.md in the cache.
[2013-07-22T22:12:21+02:00] INFO: Storing updated cookbooks/windows/CONTRIBUTING in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/windows/metadata.rb in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/windows/metadata.json in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/windows/CHANGELOG.md in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/dmg/resources/package.rb in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/dmg/providers/package.rb in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/dmg/recipes/default.rb in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/dmg/attributes/default.rb in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/dmg/metadata.json in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/dmg/LICENSE in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/dmg/README.md in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/dmg/metadata.rb in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/dmg/CONTRIBUTING in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/dmg/CHANGELOG.md in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/git/recipes/default.rb in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/git/recipes/source.rb in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/git/recipes/server.rb in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/git/recipes/windows.rb in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/git/attributes/default.rb in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/git/metadata.rb in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/git/Gemfile in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/git/TESTING.md in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/git/CONTRIBUTING in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/git/README.md in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/git/LICENSE in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/git/.gitignore in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/git/metadata.json in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/git/CHANGELOG.md in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/git/Berksfile in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/git/.kitchen.yml in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/cifs-local/recipes/default.rb in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/cifs-local/README.md in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/cifs-local/metadata.rb in the cache.
[2013-07-22T22:12:22+02:00] INFO: Storing updated cookbooks/cifs-local/CHANGELOG.md in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/ssh-local/recipes/default.rb in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/ssh-local/README.md in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/ssh-local/CHANGELOG.md in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/ssh-local/metadata.rb in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/cifs-client/recipes/default.rb in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/cifs-client/metadata.rb in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/cifs-client/CHANGELOG.md in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/cifs-client/README.md in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/byobu/recipes/default.rb in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/byobu/CHANGELOG.md in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/byobu/metadata.rb in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/byobu/README.md in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/nano/recipes/default.rb in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/nano/README.md in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/nano/metadata.rb in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/nano/metadata.json in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/rsync/resources/serve.rb in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/rsync/providers/serve.rb in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/rsync/recipes/default.rb in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/rsync/recipes/server.rb in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/rsync/recipes/lwrp_test.rb in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/rsync/libraries/blank.rb in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/rsync/attributes/rsyncd.rb in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/rsync/attributes/default.rb in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/rsync/CHANGELOG.md in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/rsync/metadata.rb in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/rsync/LICENSE in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/rsync/CONTRIBUTING in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/rsync/Gemfile in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/rsync/Berksfile in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/rsync/.gitignore in the cache.
[2013-07-22T22:12:23+02:00] INFO: Storing updated cookbooks/rsync/README.md in the cache.
[2013-07-22T22:12:24+02:00] INFO: Storing updated cookbooks/rsync/metadata.json in the cache.
[2013-07-22T22:12:24+02:00] INFO: Storing updated cookbooks/emacs/recipes/default.rb in the cache.
[2013-07-22T22:12:24+02:00] INFO: Storing updated cookbooks/emacs/attributes/default.rb in the cache.
[2013-07-22T22:12:24+02:00] INFO: Storing updated cookbooks/emacs/CONTRIBUTING in the cache.
[2013-07-22T22:12:24+02:00] INFO: Storing updated cookbooks/emacs/Gemfile in the cache.
[2013-07-22T22:12:24+02:00] INFO: Storing updated cookbooks/emacs/Berksfile in the cache.
[2013-07-22T22:12:24+02:00] INFO: Storing updated cookbooks/emacs/CHANGELOG.md in the cache.
[2013-07-22T22:12:24+02:00] INFO: Storing updated cookbooks/emacs/LICENSE in the cache.
[2013-07-22T22:12:24+02:00] INFO: Storing updated cookbooks/emacs/metadata.json in the cache.
[2013-07-22T22:12:24+02:00] INFO: Storing updated cookbooks/emacs/README.md in the cache.
[2013-07-22T22:12:24+02:00] INFO: Storing updated cookbooks/emacs/TESTING.md in the cache.
[2013-07-22T22:12:24+02:00] INFO: Storing updated cookbooks/emacs/.kitchen.yml in the cache.
[2013-07-22T22:12:24+02:00] INFO: Storing updated cookbooks/emacs/.gitignore in the cache.
[2013-07-22T22:12:24+02:00] INFO: Storing updated cookbooks/emacs/metadata.rb in the cache.
[2013-07-22T22:12:24+02:00] WARN: Cloning resource attributes for user[cjp] from prior resource (CHEF-3694)
[2013-07-22T22:12:24+02:00] WARN: Previous user[cjp]: /var/chef/cache/cookbooks/ssh-local/recipes/default.rb:9:in `from_file'
[2013-07-22T22:12:24+02:00] WARN: Current  user[cjp]: /var/chef/cache/cookbooks/cifs-local/recipes/default.rb:9:in `from_file'
[2013-07-22T22:12:25+02:00] WARN: Cloning resource attributes for directory[/var/run/chef] from prior resource (CHEF-3694)
[2013-07-22T22:12:25+02:00] WARN: Previous directory[/var/run/chef]: /var/chef/cache/cookbooks/chef-client/libraries/helpers.rb:77:in `block in create_directories'
[2013-07-22T22:12:25+02:00] WARN: Current  directory[/var/run/chef]: /var/chef/cache/cookbooks/chef-client/libraries/helpers.rb:77:in `block in create_directories'
[2013-07-22T22:12:25+02:00] WARN: Cloning resource attributes for directory[/var/cache/chef] from prior resource (CHEF-3694)
[2013-07-22T22:12:25+02:00] WARN: Previous directory[/var/cache/chef]: /var/chef/cache/cookbooks/chef-client/libraries/helpers.rb:77:in `block in create_directories'
[2013-07-22T22:12:25+02:00] WARN: Current  directory[/var/cache/chef]: /var/chef/cache/cookbooks/chef-client/libraries/helpers.rb:77:in `block in create_directories'
[2013-07-22T22:12:25+02:00] WARN: Cloning resource attributes for directory[/var/lib/chef] from prior resource (CHEF-3694)
[2013-07-22T22:12:25+02:00] WARN: Previous directory[/var/lib/chef]: /var/chef/cache/cookbooks/chef-client/libraries/helpers.rb:77:in `block in create_directories'
[2013-07-22T22:12:25+02:00] WARN: Current  directory[/var/lib/chef]: /var/chef/cache/cookbooks/chef-client/libraries/helpers.rb:77:in `block in create_directories'
[2013-07-22T22:12:25+02:00] WARN: Cloning resource attributes for directory[/var/log/chef] from prior resource (CHEF-3694)
[2013-07-22T22:12:25+02:00] WARN: Previous directory[/var/log/chef]: /var/chef/cache/cookbooks/chef-client/libraries/helpers.rb:77:in `block in create_directories'
[2013-07-22T22:12:25+02:00] WARN: Current  directory[/var/log/chef]: /var/chef/cache/cookbooks/chef-client/libraries/helpers.rb:77:in `block in create_directories'
[2013-07-22T22:12:25+02:00] WARN: Cloning resource attributes for directory[/etc/chef] from prior resource (CHEF-3694)
[2013-07-22T22:12:25+02:00] WARN: Previous directory[/etc/chef]: /var/chef/cache/cookbooks/chef-client/libraries/helpers.rb:77:in `block in create_directories'
[2013-07-22T22:12:25+02:00] WARN: Current  directory[/etc/chef]: /var/chef/cache/cookbooks/chef-client/libraries/helpers.rb:77:in `block in create_directories'
[2013-07-22T22:12:25+02:00] INFO: Processing package[emacs23-nox] action install (emacs::default line 22)
[2013-07-22T22:13:21+02:00] INFO: Processing package[rsync] action install (rsync::default line 20)
[2013-07-22T22:13:21+02:00] INFO: Processing package[nano] action install (nano::default line 20)
[2013-07-22T22:13:21+02:00] INFO: Processing package[byobu] action install (byobu::default line 9)
[2013-07-22T22:13:22+02:00] INFO: Processing template[/usr/share/byobu/profiles/tmux] action create (byobu::default line 12)
[2013-07-22T22:13:22+02:00] INFO: template[/usr/share/byobu/profiles/tmux] backed up to /var/chef/backup/usr/share/byobu/profiles/tmux.chef-20130722221322
[2013-07-22T22:13:22+02:00] INFO: template[/usr/share/byobu/profiles/tmux] updated content
[2013-07-22T22:13:22+02:00] INFO: template[/usr/share/byobu/profiles/tmux] owner changed to 0
[2013-07-22T22:13:22+02:00] INFO: template[/usr/share/byobu/profiles/tmux] group changed to 0
[2013-07-22T22:13:22+02:00] INFO: template[/usr/share/byobu/profiles/tmux] mode changed to 644
[2013-07-22T22:13:22+02:00] INFO: Processing template[/usr/share/byobu/status/status] action create (byobu::default line 18)
[2013-07-22T22:13:22+02:00] INFO: template[/usr/share/byobu/status/status] backed up to /var/chef/backup/usr/share/byobu/status/status.chef-20130722221322
[2013-07-22T22:13:22+02:00] INFO: template[/usr/share/byobu/status/status] updated content
[2013-07-22T22:13:22+02:00] INFO: template[/usr/share/byobu/status/status] owner changed to 0
[2013-07-22T22:13:22+02:00] INFO: template[/usr/share/byobu/status/status] group changed to 0
[2013-07-22T22:13:22+02:00] INFO: template[/usr/share/byobu/status/status] mode changed to 644
[2013-07-22T22:13:22+02:00] INFO: Processing template[/usr/share/byobu/status/statusrc] action create (byobu::default line 24)
[2013-07-22T22:13:22+02:00] INFO: template[/usr/share/byobu/status/statusrc] backed up to /var/chef/backup/usr/share/byobu/status/statusrc.chef-20130722221322
[2013-07-22T22:13:22+02:00] INFO: template[/usr/share/byobu/status/statusrc] updated content
[2013-07-22T22:13:22+02:00] INFO: template[/usr/share/byobu/status/statusrc] owner changed to 0
[2013-07-22T22:13:22+02:00] INFO: template[/usr/share/byobu/status/statusrc] group changed to 0
[2013-07-22T22:13:22+02:00] INFO: template[/usr/share/byobu/status/statusrc] mode changed to 644
[2013-07-22T22:13:22+02:00] INFO: Processing template[/usr/share/byobu/keybindings/keys.tmux] action create (byobu::default line 30)
[2013-07-22T22:13:22+02:00] INFO: template[/usr/share/byobu/keybindings/keys.tmux] updated content
[2013-07-22T22:13:22+02:00] INFO: template[/usr/share/byobu/keybindings/keys.tmux] owner changed to 0
[2013-07-22T22:13:22+02:00] INFO: template[/usr/share/byobu/keybindings/keys.tmux] group changed to 0
[2013-07-22T22:13:22+02:00] INFO: template[/usr/share/byobu/keybindings/keys.tmux] mode changed to 644
[2013-07-22T22:13:22+02:00] INFO: Processing template[/usr/share/byobu/keybindings/emacs-keys.tmux] action create (byobu::default line 36)
[2013-07-22T22:13:23+02:00] INFO: template[/usr/share/byobu/keybindings/emacs-keys.tmux] updated content
[2013-07-22T22:13:23+02:00] INFO: template[/usr/share/byobu/keybindings/emacs-keys.tmux] owner changed to 0
[2013-07-22T22:13:23+02:00] INFO: template[/usr/share/byobu/keybindings/emacs-keys.tmux] group changed to 0
[2013-07-22T22:13:23+02:00] INFO: template[/usr/share/byobu/keybindings/emacs-keys.tmux] mode changed to 644
[2013-07-22T22:13:23+02:00] INFO: Processing package[cifs-utils] action install (cifs-client::default line 10)
[2013-07-22T22:13:49+02:00] INFO: Processing user[cjp] action create (ssh-local::default line 9)
[2013-07-22T22:13:49+02:00] INFO: Processing directory[/home/cjp/.ssh] action create (ssh-local::default line 14)
[2013-07-22T22:13:49+02:00] INFO: Processing template[/home/cjp/.ssh/authorized_keys] action create (ssh-local::default line 22)
[2013-07-22T22:13:49+02:00] INFO: template[/home/cjp/.ssh/authorized_keys] mode changed to 600
[2013-07-22T22:13:49+02:00] INFO: Processing user[cjp] action create (cifs-local::default line 9)
[2013-07-22T22:13:49+02:00] INFO: Processing directory[/home/cjp/Documents] action create (cifs-local::default line 13)
[2013-07-22T22:13:49+02:00] INFO: directory[/home/cjp/Documents] created directory /home/cjp/Documents
[2013-07-22T22:13:49+02:00] INFO: directory[/home/cjp/Documents] owner changed to 1000
[2013-07-22T22:13:49+02:00] INFO: directory[/home/cjp/Documents] group changed to 1000
[2013-07-22T22:13:49+02:00] INFO: Processing template[/home/cjp/cjp.credentials] action create (cifs-local::default line 18)
[2013-07-22T22:13:49+02:00] INFO: template[/home/cjp/cjp.credentials] updated content
[2013-07-22T22:13:49+02:00] INFO: template[/home/cjp/cjp.credentials] mode changed to 600
[2013-07-22T22:13:49+02:00] INFO: Processing mount[/home/cjp/Documents] action mount (cifs-local::default line 24)
[2013-07-22T22:13:50+02:00] INFO: mount[/home/cjp/Documents] mounted
[2013-07-22T22:13:50+02:00] INFO: Processing package[git] action install (git::default line 24)
[2013-07-22T22:14:27+02:00] INFO: Processing log[Found chef-client in /usr/bin/chef-client] action write (chef-client::init_service line 7)
[2013-07-22T22:14:27+02:00] INFO: Found chef-client in /usr/bin/chef-client
[2013-07-22T22:14:27+02:00] INFO: Processing directory[/var/run/chef] action create (chef-client::init_service line 77)
[2013-07-22T22:14:27+02:00] INFO: directory[/var/run/chef] created directory /var/run/chef
[2013-07-22T22:14:27+02:00] INFO: directory[/var/run/chef] owner changed to 0
[2013-07-22T22:14:27+02:00] INFO: directory[/var/run/chef] group changed to 0
[2013-07-22T22:14:27+02:00] INFO: Processing directory[/var/cache/chef] action create (chef-client::init_service line 77)
[2013-07-22T22:14:27+02:00] INFO: directory[/var/cache/chef] created directory /var/cache/chef
[2013-07-22T22:14:27+02:00] INFO: directory[/var/cache/chef] owner changed to 0
[2013-07-22T22:14:27+02:00] INFO: directory[/var/cache/chef] group changed to 0
[2013-07-22T22:14:27+02:00] INFO: Processing directory[/var/lib/chef] action create (chef-client::init_service line 77)
[2013-07-22T22:14:27+02:00] INFO: directory[/var/lib/chef] created directory /var/lib/chef
[2013-07-22T22:14:27+02:00] INFO: directory[/var/lib/chef] owner changed to 0
[2013-07-22T22:14:27+02:00] INFO: directory[/var/lib/chef] group changed to 0
[2013-07-22T22:14:27+02:00] INFO: Processing directory[/var/log/chef] action create (chef-client::init_service line 77)
[2013-07-22T22:14:27+02:00] INFO: directory[/var/log/chef] created directory /var/log/chef
[2013-07-22T22:14:27+02:00] INFO: directory[/var/log/chef] owner changed to 0
[2013-07-22T22:14:27+02:00] INFO: directory[/var/log/chef] group changed to 0
[2013-07-22T22:14:27+02:00] INFO: directory[/var/log/chef] mode changed to 750
[2013-07-22T22:14:27+02:00] INFO: Processing directory[/etc/chef] action create (chef-client::init_service line 77)
[2013-07-22T22:14:27+02:00] INFO: Processing template[/etc/init.d/chef-client] action create (chef-client::init_service line 18)
[2013-07-22T22:14:27+02:00] INFO: template[/etc/init.d/chef-client] updated content
[2013-07-22T22:14:27+02:00] INFO: template[/etc/init.d/chef-client] mode changed to 755
[2013-07-22T22:14:27+02:00] INFO: Processing template[/etc/default/chef-client] action create (chef-client::init_service line 25)
[2013-07-22T22:14:27+02:00] INFO: template[/etc/default/chef-client] updated content
[2013-07-22T22:14:27+02:00] INFO: template[/etc/default/chef-client] mode changed to 644
[2013-07-22T22:14:27+02:00] INFO: template[/etc/default/chef-client] not queuing delayed action restart on service[chef-client] (delayed), as it's already been queued
[2013-07-22T22:14:27+02:00] INFO: Processing service[chef-client] action enable (chef-client::init_service line 31)
[2013-07-22T22:14:27+02:00] INFO: service[chef-client] enabled
[2013-07-22T22:14:27+02:00] INFO: Processing service[chef-client] action start (chef-client::init_service line 31)
[2013-07-22T22:14:29+02:00] INFO: service[chef-client] started
[2013-07-22T22:14:29+02:00] INFO: Processing package[ntp] action install (ntp::default line 21)
[2013-07-22T22:14:49+02:00] INFO: Processing package[ntpdate] action install (ntp::default line 21)
[2013-07-22T22:14:49+02:00] INFO: Processing directory[/var/lib/ntp] action create (ntp::default line 26)
[2013-07-22T22:14:49+02:00] INFO: Processing directory[/var/log/ntpstats/] action create (ntp::default line 26)
[2013-07-22T22:14:49+02:00] INFO: Processing service[ntp] action enable (ntp::default line 33)
[2013-07-22T22:14:49+02:00] INFO: Processing service[ntp] action start (ntp::default line 33)
[2013-07-22T22:14:49+02:00] INFO: Processing cookbook_file[/etc/ntp.leapseconds] action create (ntp::default line 38)
[2013-07-22T22:14:49+02:00] INFO: cookbook_file[/etc/ntp.leapseconds] owner changed to 0
[2013-07-22T22:14:49+02:00] INFO: cookbook_file[/etc/ntp.leapseconds] group changed to 0
[2013-07-22T22:14:49+02:00] INFO: cookbook_file[/etc/ntp.leapseconds] mode changed to 644
[2013-07-22T22:14:49+02:00] INFO: cookbook_file[/etc/ntp.leapseconds] created file /etc/ntp.leapseconds
[2013-07-22T22:14:49+02:00] INFO: Processing template[/etc/ntp.conf] action create (ntp::default line 44)
[2013-07-22T22:14:50+02:00] INFO: template[/etc/ntp.conf] backed up to /var/chef/backup/etc/ntp.conf.chef-20130722221449
[2013-07-22T22:14:50+02:00] INFO: template[/etc/ntp.conf] updated content
[2013-07-22T22:14:50+02:00] INFO: template[/etc/ntp.conf] owner changed to 0
[2013-07-22T22:14:50+02:00] INFO: template[/etc/ntp.conf] group changed to 0
[2013-07-22T22:14:50+02:00] INFO: template[/etc/ntp.conf] mode changed to 644
[2013-07-22T22:14:50+02:00] INFO: Processing directory[/var/run/chef] action create (chef-client::config line 77)
[2013-07-22T22:14:50+02:00] INFO: Processing directory[/var/cache/chef] action create (chef-client::config line 77)
[2013-07-22T22:14:50+02:00] INFO: Processing directory[/var/lib/chef] action create (chef-client::config line 77)
[2013-07-22T22:14:50+02:00] INFO: Processing directory[/var/log/chef] action create (chef-client::config line 77)
[2013-07-22T22:14:50+02:00] INFO: Processing directory[/etc/chef] action create (chef-client::config line 77)
[2013-07-22T22:14:50+02:00] INFO: Processing template[/etc/chef/client.rb] action create (chef-client::config line 60)
[2013-07-22T22:14:50+02:00] INFO: template[/etc/chef/client.rb] updated content
[2013-07-22T22:14:50+02:00] INFO: template[/etc/chef/client.rb] owner changed to 0
[2013-07-22T22:14:50+02:00] INFO: template[/etc/chef/client.rb] group changed to 0
[2013-07-22T22:14:50+02:00] INFO: template[/etc/chef/client.rb] mode changed to 644
[2013-07-22T22:14:50+02:00] INFO: Processing directory[/etc/chef/client.d] action create (chef-client::config line 76)
[2013-07-22T22:14:50+02:00] INFO: directory[/etc/chef/client.d] created directory /etc/chef/client.d
[2013-07-22T22:14:50+02:00] INFO: directory[/etc/chef/client.d] owner changed to 0
[2013-07-22T22:14:50+02:00] INFO: directory[/etc/chef/client.d] group changed to 0
[2013-07-22T22:14:50+02:00] INFO: directory[/etc/chef/client.d] mode changed to 755
[2013-07-22T22:14:50+02:00] INFO: Processing ruby_block[reload_client_config] action nothing (chef-client::config line 83)
[2013-07-22T22:14:50+02:00] INFO: template[/etc/init.d/chef-client] sending restart action to service[chef-client] (delayed)
[2013-07-22T22:14:50+02:00] INFO: Processing service[chef-client] action restart (chef-client::init_service line 31)
[2013-07-22T22:14:52+02:00] INFO: service[chef-client] restarted
[2013-07-22T22:14:52+02:00] INFO: template[/etc/ntp.conf] sending restart action to service[ntp] (delayed)
[2013-07-22T22:14:52+02:00] INFO: Processing service[ntp] action restart (ntp::default line 33)
[2013-07-22T22:14:55+02:00] INFO: service[ntp] restarted
[2013-07-22T22:14:55+02:00] INFO: template[/etc/chef/client.rb] sending create action to ruby_block[reload_client_config] (delayed)
[2013-07-22T22:14:55+02:00] INFO: Processing ruby_block[reload_client_config] action create (chef-client::config line 83)
[2013-07-22T22:14:55+02:00] INFO: ruby_block[reload_client_config] called
[2013-07-22T22:14:55+02:00] INFO: Chef Run complete in 159.504901775 seconds
[2013-07-22T22:14:55+02:00] INFO: Running report handlers
[2013-07-22T22:14:55+02:00] INFO: Report handlers complete

Well that worked just as I had hoped! A rare phrase from someone in my line of work.

Summary

Chef has a steep learning curve. It need not be like that. It's not terribly complicated to download recipes and applying them using chef-solo. From there it is fairly straight forward to write your own recipes. Chef Server raises the bar quite a lot but once you learn which certificates are required in various places things fall into place. The process by which one learns this is definitely furthered by virtualization. I haven't yet had to restore a VM to an earlier snapshot in order to test some aspect of a recipe or configuration but I had planned for that and so should you. Vagrant and Chef get along very well and I suspect I will use that combination for my own development purposes for a while.

I now intend to create more roles and maybe have a look at Chef feat. AWS. It would be neat to create recipes that would allow me to set up storage clusters. I have found Ceph to have a bad service/effort ratio for my own uses but a set of syncing ZFS storage arrays? Maybe I should give Ceph another whack now that I have this Chef/Vagrant setup?

Addendum

Note: I use the terms "Chef Server" and "Chef server". This is not by accident. "Chef Server" is the product provided by Opscode. The "Chef server" is the computer which runs the aforementioned software. So the Chef server runs Chef Server.