{"id":28,"date":"2026-10-13T22:11:19","date_gmt":"2026-10-13T22:11:19","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2014\/08\/07\/chef-configuration-management-2\/"},"modified":"2026-10-13T22:11:19","modified_gmt":"2026-10-13T22:11:19","slug":"chef-configuration-management-2","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/chef-configuration-management-2\/","title":{"rendered":"Chef Configuration Management Training: 3-Day Hands-On Curriculum for DevOps Teams"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Originally published on 2014-08-07; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This page explains a hands-on <strong>Chef configuration management<\/strong> training path for development, operations, and platform engineering teams. You will learn what is covered across three days, how the major Chef tools fit together, and what practical command-line and cookbook exercises are typically included.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a title=\"DevOps Training Registration\" href=\"events\/register\/index.html\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.scmgalaxy.com\/tutorials\/wp-content\/uploads\/2014\/07\/registernow.jpg\" alt=\"DevOps Training Registration\" width=\"232\" height=\"104\" \/><\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2014\/08\/chef-training.jpg\" alt=\"Chef Training\" width=\"971\" height=\"500\" \/><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Who this Chef course is for<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original course description targets teams that need to <strong>write infrastructure as code<\/strong> and automate repeatable system configuration with Chef.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>DevOps engineers building repeatable server and application setup.<\/li><li>Operations teams replacing manual runbooks with code-driven workflows.<\/li><li>Developers who need to package application dependencies into cookbooks.<\/li><li>Platform teams standardizing node setup across Linux and Windows estates.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">3-day curriculum at a glance<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Day 1: Foundations, Chef basics, and first recipes<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>Configuration management fundamentals and why automation matters.<\/li><li>Chef concepts and terminology: attributes, metadata, recipes, resources, templates, notifications, and idempotency.<\/li><li>Chef development tool setup on Windows and Linux.<\/li><li>Ruby basics required for reading and writing Chef code.<\/li><li>Knife fundamentals and creating a first recipe.<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Day 2: Cookbooks, testing workflow, and infrastructure modeling<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>Cookbook lifecycle: create, edit, upload, and execute.<\/li><li>Platform-specific packaging and service patterns (Linux and Windows examples from the source agenda).<\/li><li>Intro to Vagrant, VirtualBox, and Test Kitchen for local testing.<\/li><li>Roles and environments for modeling infrastructure and organizing configuration data.<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Day 3: Provisioning, troubleshooting, deployment, and cloud integration<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>Provisioning flows using Vagrant and Knife.<\/li><li>Troubleshooting chef-client runs and debugging recipes via logs and shell tools.<\/li><li>Data bags, search, recipe inclusion, and dependency management.<\/li><li>Service configuration and deployment examples (Apache, Tomcat, IIS as listed in the source).<\/li><li>Cloud integration topics in the original agenda include Amazon EC2 and Rackspace.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">How the hands-on learning workflow fits together<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The course structure follows a practical progression: learn core concepts, write code, test locally, then move toward provisioning and deployment.<\/p>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Learn CM and Chef basics] --> B[Set up Chef workstation]\n    B --> C[Write first recipe]\n    C --> D[Build and upload cookbook]\n    D --> E[Test with Test Kitchen and Vagrant]\n    E --> F[Model roles and environments]\n    F --> G[Provision and deploy services]\n    G --> H[Troubleshoot and iterate]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Core tools covered in the agenda<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Tool<\/th><th>Where it appears in training<\/th><th>What learners practice<\/th><\/tr><\/thead><tbody><tr><td>Chef Infra (recipes and cookbooks)<\/td><td>All three days<\/td><td>Writing reusable configuration code for nodes and services.<\/td><\/tr><tr><td>Knife<\/td><td>Day 1 and Day 3<\/td><td>Node operations, cookbook upload, and provisioning-oriented workflows.<\/td><\/tr><tr><td>Test Kitchen<\/td><td>Day 2 onward<\/td><td>Local converge\/verify loops before promoting changes.<\/td><\/tr><tr><td>Vagrant and VirtualBox<\/td><td>Day 2 and Day 3<\/td><td>Creating disposable VM environments for repeatable testing.<\/td><\/tr><tr><td>Cloud providers (EC2, Rackspace in source)<\/td><td>Day 3<\/td><td>Connecting Chef workflows to infrastructure provisioning use cases.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Practice commands and cookbook examples<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original post lists hands-on exercises. The examples below show the kind of commands and code patterns typically practiced in that context.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Knife command workflow<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\">knife node <span class=\"hljs-keyword\">list<\/span>\nknife cookbook create webserver\nknife cookbook upload webserver\n\nknife bootstrap <span class=\"hljs-number\">192.0<\/span><span class=\"hljs-number\">.2<\/span><span class=\"hljs-number\">.10<\/span> \\\n  --ssh-user ubuntu \\\n  --sudo \\\n  --node-name web<span class=\"hljs-number\">-01<\/span> \\\n  --run-<span class=\"hljs-keyword\">list<\/span> <span class=\"hljs-string\">'recipe&#91;webserver::default]'<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Minimal recipe pattern<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-ruby\">package <span class=\"hljs-string\">'httpd'<\/span> <span class=\"hljs-keyword\">do<\/span>\n  <span class=\"hljs-attr\">action<\/span> :install\nend\n\ntemplate <span class=\"hljs-string\">'\/var\/www\/html\/index.html'<\/span> <span class=\"hljs-keyword\">do<\/span>\n  source <span class=\"hljs-string\">'index.html.erb'<\/span>\n  variables(\n    environment: node.chef_environment\n  )\n  <span class=\"hljs-attr\">notifies<\/span> :restart, <span class=\"hljs-string\">'service&#91;httpd]'<\/span>\nend\n\nservice <span class=\"hljs-string\">'httpd'<\/span> <span class=\"hljs-keyword\">do<\/span>\n  action &#91;:enable, :start]\nend<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Test Kitchen loop<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs language-bash\">kitchen create\nkitchen converge\nkitchen verify\nkitchen destroy<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Choosing online or classroom delivery<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original title references both online and classroom formats, but it does not provide operational details such as schedule cadence, lab setup, or pricing. Use this checklist to decide what to confirm before enrolling.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Format<\/th><th>Usually works best when<\/th><th>What to confirm with provider<\/th><\/tr><\/thead><tbody><tr><td>Online<\/td><td>Teams need remote access and flexible attendance.<\/td><td>Lab access model, timezone coverage, live support during exercises, recording policy.<\/td><\/tr><tr><td>Classroom<\/td><td>Teams want in-person facilitation and tighter workshop interaction.<\/td><td>Location logistics, machine prerequisites, class size, and lab environment readiness.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Legacy links preserved from the source post: <a href=\"index.php?option=com_icagenda&amp;view=list&amp;Itemid=389\">Upcoming training dates<\/a> and <a href=\"events\/register\/index.html\" target=\"_blank\" rel=\"noopener\">registration<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Original media notes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original page included a YouTube embed block that currently reports an API key\/IP restriction issue. The recoverable reference link in that block is: <a href=\"https:\/\/www.youtube.com\/watch?v=ZCfrNvu6nMc\" target=\"_blank\" rel=\"noopener\">YouTube API key setup video<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Best practices after completing Chef training<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Keep cookbooks small, composable, and version-controlled.<\/li><li>Use Test Kitchen early to catch cookbook regressions before shared environments.<\/li><li>Model roles and environments explicitly to avoid ad-hoc node drift.<\/li><li>Treat data bags and secrets handling as a separate security concern from cookbook logic.<\/li><li>Document run-lists, dependencies, and rollback steps as part of each deployment cookbook.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>This revised guide turns a legacy Chef course post into a clear 3-day learning roadmap for DevOps teams. It covers the agenda, toolchain, workflow, and practical commands learners should expect.<\/p>\n","protected":false},"author":1,"featured_media":3419,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[8],"tags":[407,1598,1601,1599,952,951,1381,1380,884,1379,282,1600,883,244,94,1378,96],"class_list":["post-28","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-training","tag-chef","tag-chef-advance","tag-chef-configuration-management","tag-chef-configuration-management-training","tag-chef-course","tag-chef-training","tag-chef-training-classroom","tag-chef-training-online","tag-classroom","tag-classroom-chef-training","tag-configuration","tag-configuration-management-training","tag-course","tag-management","tag-online","tag-online-chef-training","tag-training"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/28","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=28"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/28\/revisions"}],"predecessor-version":[{"id":79241,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/28\/revisions\/79241"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/3419"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=28"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=28"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=28"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}