How to create your first Chef Cookbook

Page content

I this post I will show you how you can create a basic chef structure.

Create environments

cd ~/chef-repo

mkdir environments
nano environments/production.json
{
  "name": "Production",
  "description": "",
  "cookbook_versions": {

  },
  "json_class": "Chef::Environment",
  "chef_type": "environment",
  "default_attributes": {

  },
  "override_attributes": {

  }
}

nano environments/development.json
{
  "name": "Development",
  "description": "",
  "cookbook_versions": {

  },
  "json_class": "Chef::Environment",
  "chef_type": "environment",
  "default_attributes": {

  },
  "override_attributes": {

  }
}
knife environment from file environments/production.json
knife environment from file environments/development.json

Create roles

mkdir roles
nano roles/base.json
{

  "name": "base",
  "description": "Default operation role",
  "json_class": "Chef::Role",

  "override_attributes": {
    "chef_client": {
      "config": {
        "interval": 900,
        "splay": 30
      }
    }
  },

  "chef_type": "role",

  "run_list": [
    "recipe[operation]"
  ],

  "env_run_lists": {
  }

}
knife role from file roles/base.json

Create node config

mkdir nodes
nano nodes/test.mydomain.intra.json
{
  "name": "test.mydomain.intra",
  "chef_environment": "Production",
  "normal": {
  	"tags": [

    ]
  },
  "run_list": [
	"role[base]"
]

}
knife node from file nodes/test.mydomain.intra.json

Create cookbook

cd chef-repo/cookbooks
chef generate cookbook operation
nano operation/recipes/default.rb
include_recipe 'operation::packages'

nano operation/recipes/packages.rb
package "nano" do
  action :install
end
cd ..
knife cookbook upload operation
knife cookbook list

Test cookbook

knife ssh 'name:test.mydomain.intra' 'sudo chef-client' -x root