Getting started with chef cookbooks as an app dev with test-kitchen + docker, part 1



How do you get started with chef cookbooks as an app dev?

My first time approaching Chef was after doing Android for about 2 years. Whether you're working on the front-end or backend or even on Mobile, the overall workflow of your application is the same.

  • Make changes to your application locally
  • Write unit and/or integration tests to verify your changes
  • Deploy & verify your changes to a test environment
  • Deploy & verify your changes to a prod environment

The setup that I first worked with wasn't too well aligned with that. Feedback loops involved deploying cookbooks to chef-server and re-converging instances in a live environment. Process prevented untested code from making it to production, but it did happen.

The following is my attempt at creating a quick feedback loop when working with cookbooks that makes it easy to approach as an app developer.

Create the source files for your cookbook

You want to create a hello world cookbook to configure a server and then verify that it works.


name "helloworld"
maintainer       "me"
maintainer_email "me@me"
license          "Apache 2.0"
description      "helloworld"
long_description, ''))
version          "0.0.1"

hello world cookbook


:;Chef::Log.error 'Hello World'

"Build" a cookbook

Enter test-kitchen. It helps you create different types of machines, and execute scripts and tests to verify your configuration.

We can start by creating a .kitchen.yml file containing the configuration we need to get going.


  name: docker

  name: chef_zero
  require_chef_omnibus: latest

- name: trusty
    image: ubuntu:14.04
    platform: ubuntu

  - name: default
      - "recipe[helloworld::default]"

In this file, we have

  • configured the Docker driver. test-kitchen will create a docker container, SSH into it, and execute your test suite. The driver configuration here + the docker image ubuntu-upstart is necessary to work around known issues with docker and upstart/systemd.
  • defined your chef context - this could be chef_zero or chef-solo, they're essentially the same except chef_zero pretends to be a chef-server, whereas chef-solo knows he's not.
  • defined the platform we want to run on. for the sake of example, we'll run ubuntu 14.04 from the docker registry
  • defined the test suite

We're ready to run this through kitchen now. Add a Gemfile.


source ''

gem 'test-kitchen'
gem 'kitchen-docker'
gem 'serverspec'

Run bundle install and then bundle exec kitchen converge. Test kitchen will now start the process of creating a container from your chosen image, it will SSH in, and install the chosen version of chef, and then finally run the recipe you defined in the test suite.

Test your cookbook

You can consider converging to be the equivalent to "running" or "building" a cookbook. If you have a successful converge and you see your Log message "helloworld", then congrats - you've got a hello world cookbook that you can test like any other application. You've created a project, you ran/built it, and you verified your changes.

Check back for Part 2 where we write automated tests for some configurations.

Tried to learn DevOps on AWS and gotten lost?

If you liked the content of this post and want to learn more - I’m putting together an online course where I'll walk you through real examples of how I’ve practiced devops from beginning to end using a static website deploying to AWS S3 with a framework to help you apply it to your workflows.

Check it out here

You might also like

More Similar Posts