Chef 0.9.0 Release Candidate Available


#1

Ohai Chefs!

Chef 0.9.0 is almost here, so I’d like to give you an update on what you can
expect in the new version, and how you can start using Chef 0.9.0 today. There
are a few breaking changes you should be aware of–please read on–but you “I
run as root” types can install right now with gem install chef --pre and
gem install chef-server --pre. The current prerelease version is the second
release candidate, chef-0.9.0.rc02

Summary Updates in 0.9.0

  • Attribute precedence has been updated, and makes much more sense now. You
    can read the bug report[1] on JIRA to get all the gory details, but the
    quick explanation is that you can now access default and override attributes
    in your attribute files, and default and override attributes you set in
    roles will behave like you’d expect. For example, you can now ship your
    cookbooks with a set of “sane” default attributes using the default keyword
    in the attributes file:

    Imaginary MySQL Cookbook Attributes File:

    default[:mysql][:bind_address] = 'localhost’
    default[:mysql][:datadir] = '/var/lib/mysql’
    These attributes will have the lowest precedence of any attributes in the
    system, so you can override it with a role: # Imaginary MySQL Server Role
    default_attributes :mysql => {:bindaddress => ‘0.0.0.0’} And the defaults in
    this role “win” over the defaults in the cookbook.
  • chef-server now supports cookbook versioning, atomic cookbook updates, and
    per-file synchronization. Cookbooks are now uploaded file by file to a
    sandbox, then committed when the entire cookbook has been successfully
    uploaded, and the layout of the cookbooks is tracked in the database. 0.9.0
    Uses this to enable rudimentary support for versioned cookbooks, but the
    main driver of this change is to lay the groundwork for our upcoming support
    of environments–i.e., the ability to assign versions of cookbooks to your
    various staging, production, QA, etc. environments.
  • Notification support: You can now configure chef-client to run one or more
    notification handlers after a successful or unsuccessful run. We are only
    shipping with a simple handler that records results to a JSON formatted
    file, but I’m sure we’ll see the options expand very soon. If you’re
    interested in writing a notification handler, you should get acquainted with
    the Chef::Handler[2] base class code before diving in. Take a peek at our
    JsonFile[3] handler to see one example; I’ve included another at the bottom
    of this message.
  • chef-server and the WebUI now run on Merb 1.1.0, and you can now run the
    full Chef stack on Ruby 1.9. Ruby 1.9 users will also want to install the
    prerelease version of mixlib-config.
  • Improved Windows support, including a resource and provider to set your
    environment in Windows[4], user and group providers[5], and a mount
    provider[6], as well as new ohai plugins for windows. Props to Doug
    MacEachern for all of his hard work on this. Please that we don’t yet have a
    prerelease gem available for the next version of ohai, I will update this
    list when one becomes available.
  • The rubygems provider has been rewritten to use the rubygems ruby API, while
    still supporting multiple gem installations. The new provider is much faster
    than the old one one when a node already has the correct gem version
    installed.
  • And a ton of bug fixes and other improvements that I can’t list here. Thanks
    to all of you who contributed code, bug reports, participated on the mailing
    list and IRC channel. Chef would not be where it is today without your help.

Upgrading

We’re still working out the optimal upgrade strategy, but it’s been relatively
painless in my testing. The basic process I have followed is like this:

  1. Create backups and try it in a test enviroment first. But you know
    that already.
  2. Stop chef-server, chef-server-webui, chef-solr-indexer, and chef-solr.
  3. Upgrade the gems:
    sudo gem install chef --pre
    sudo gem install chef-server --pre
  4. Install Bundler: Merb 1.1.1 requires bundler but the gem does not express a
    dependency on it, so you need to install bundler manually.
    sudo gem install bundler
  5. Edit the server configuration file (server.rb). The new cookbook
    upload/download system needs two directories to upload and store cookbooks:

    The defaults are /var/chef:

    sandbox_path "/var/chef/sandboxes"
    checksum_path “/var/chef/checksums”

    Edit these to taste. This is sensible for a bootstrap-installed server:

    sandbox_path "/srv/chef/sandboxes"
    checksum_path “/srv/chef/checksums”
  6. Start chef-solr, chef-solr-indexer, chef-server, and chef-server-webui
  7. You will have to re-upload your cookbooks: Run knife cookbook upload -a -o /path/to/cookbooks after upgrading the box you run knife from to 0.9.0.
  8. Knife clients should work fine after installing 0.9.0; chef-clients
    also must be
    upgraded.

Links

  1. http://tickets.opscode.com/browse/CHEF-838
  2. http://github.com/opscode/chef/blob/master/chef/lib/chef/handler.rb
  3. http://github.com/opscode/chef/blob/master/chef/lib/chef/handler/json_file.rb
  4. http://github.com/opscode/chef/blob/master/chef/lib/chef/resource/env.rb
  5. Commit: http://github.com/opscode/chef/commit/fc032dc0f76d378640116136b7e9b4c79b10a95d
  6. Commit: http://github.com/opscode/chef/commit/eeaba657fc31e0e36825a989e5a40cd7a9882d89

Example Notification Handler

Here’s a notification/exception handler that just logs everything via Chef::Log:
LogItHandler < Chef::Handler
# Define a report method to run your notification logic
def report
# write your notification code here.
# you can access the start_time, end_time, node, exception (if any),
# backtrace (if any), success/failure status of the run, and a list
# of all resources and all updated resources. Be careful, these can
# be nil if chef crashed very early in the run.
Chef::Log.info(“report for #{node.name}”)
# In the final release, you’ll be able to access the elapsed_time directly
Chef::Log.info(“run completed in #{run_status.elapsed_time} seconds”)
if success?
Chef::Log.info(“Updated #{updated_resources.size} of
#{all_resources.size} resources”)
else
Chef::Log.info(“Sad panda: chef run failed with exception
#{exception.inspect}”)
backtrace.each {|line| Chef::Log.info(line) }
end
end
In your client configuration file, you enable the handler like this:
report_handlers << LogItHandler.new # these fire at the end of
a successful run
exception_handlers << LogItHandler.new # these fire at the end of
a failed run

We hope you enjoy this release. Please share any tips or questions you might
have on the installation or upgrade process, or about this release in general,
either here or on the IRC channel.

Daniel DeLeo