Having fun with Chef

· Read in about 2 min · (375 words) ·


Recently I had chance to evaluate usage of Chef for deployment of web service on project I am working on.

There are plenty of resources available and this post is meant mostly as a serie of personal notes based on my current experience so I can easily return to it.


Client side

Chef client can run in two modes:

Standalone called chef solo

  • Uses chef-solo command without attempts to access the server
  • Works greatly for development of cookbooks or just for simple setup of the environment.
  • Allows to define environment in JSON config file.
  • Node specific information has to be defined

Client-server mode

  • Requires installed chef server.
  • Allows to bootstrap newly provisioned machine very easily.
  • Per-node setup can be maintained on the server.

Server side

  • Chef server has to be installed on a Linux machine, there is no installation for Windows.
  • Setup is pretty straightforward and well documented and I was able to perform it even with my outdated Linux knowledge.
    • The WebUI is paid feature but for me as a developer the command line turned out to be much better understandable.

Deployment Artifacts

Although it allows to save files as a part of cookbook it seems to be pretty bad idea. Better is to have deployment packages available on some artifact server.

Creating first cookbook

  • For development the Chef development kit can be installed:
    • For initial playing with cookbook the client seems to be sufficient but development kit has some advanced features like static analysis, testing support etc. More to come…
  • knife command helps here quite a bit although manual setup is obviously possible.
  • It is best to maintain cookbook repository in GIT.
    • For example dependency installation command is integrated with git.

Create cookbook

  • In git repository which will contain cookbook run:

    knife cookbook create COOKBOOK_NAME
  • Review created files to add documentation as needed.

  • To install any dependencies run:

    • This by default works with master branch. See other parameters to make it working on current branch.
    • Dependency can be installed/managed manually as well if git is not available.

      knife cookbook site install COOKBOOK_NAME
  • Define dependencies in metadata.rb file

    • Each dependency can contain version information to maintain compatibility.

Quick links