SlideShare a Scribd company logo
Chef Fundamentals
training@getchef.com
Copyright (C) 2014 Chef Software, Inc.
Nathen Harvey
• Community Director
• Co-host of the Food Fight Show Podcast
• @nathenharvey
Webinar Objectives and Style
3
Multi-week Webinar Series
• After completing of this webinar series you will be
able to
• Automate common infrastructure tasks with Chef
• Describe Chef’s architecture
• Describe Chef’s various tools
• Apply Chef’s primitives to solve your problems
How to learn Chef
• You bring the domain expertise about your business
and infrastructure
• Chef provides a framework for automating your
infrastructure
• Our job is to work together to teach you how to
model and automate your infrastructure with Chef
Chef is a Language
• Learning Chef is like learning the basics of a
language
• 80% fluency will be reached very quickly
• The remaining 20% just takes practice
• The best way to learn Chef is to use Chef
Questions & Answers
• Ask questions in the chat
window when they come to
you
• We’ll answer as many
questions as we can at the
end of the session
Questions & Answers
• Ask questions in the
Google Discussion Forum
• This can be used during
the webinar and outside
of the webinar, too.
• https://groups.google.com/d/
forum/learnchef-fundamentals-
webinar
Slides and Video
• This webinar is being recorded. The video will be
made available shortly after the session has ended.
• The slides used throughout this webinar will be
made available at the end of each webinar.
• Watch http://learnchef.com for updates.
Agenda
10
Topics
• Overview of Chef
• Workstation Setup
• Node Setup
• Chef Resources and Recipes
• Working with the Node object
• Roles
• Common configuration with Data Bags - Today
• Environments
• Community Cookbooks and Further Resources
Quick Recap
Where are we?
12
In the last module
• Login to the node in your Chef Training Lab
• Install Chef nodes using "knife bootstrap"
• Included a run_list so that the server was a web
server when the bootstrap process completed
• Read and wrote node attributes
13
Where did my Node go?
• We still need a CentOS machine to manage
• The one we launched last time has likely expired
• Launch a new one using the Chef Lab
• Hopefully, you’ve already done this. We’re not
going to spend time walking through it now.
14
Launch Chef Training Lab
15
$ ssh root@<EXTERNAL_ADDRESS>
Lab - Login
The authenticity of host 'uvo1qrwls0jdgs3blvt.vm.cld.sr
(69.195.232.110)' can't be established.
RSA key fingerprint is d9:95:a3:b9:02:27:e9:cd:
74:e4:a2:34:23:f5:a6:8b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'uvo1qrwls0jdgs3blvt.vm.cld.sr,
69.195.232.110' (RSA) to the list of known hosts.
chef@uvo1qrwls0jdgs3blvt.vm.cld.sr's password:
Last login: Mon Jan 6 16:26:24 2014 from
host86-145-117-53.range86-145.btcentralplus.com
[chef@CentOS63 ~]$
16
Checkpoint
• At this point you should have
• One virtual machine (VM) or server that you’ll use
for the lab exercises
• The IP address or public hostname
• An application for establishing an ssh connection
• 'sudo' or 'root' permissions on the VM
17
$ knife bootstrap <EXTERNAL_ADDRESS> -x root -P chef -N ‘module4’ -r ‘role[webserver]’
"Bootstrap" the Target Instance
Bootstrapping Chef on uvo1qrwls0jdgs3blvt.vm.cld.sr
...
...
uvo1qrwls0jdgs3blvt.vm.cld.sr Creating a new client identity for
module3 using the validator key.
uvo1qrwls0jdgs3blvt.vm.cld.sr resolving cookbooks for run list: []
uvo1qrwls0jdgs3blvt.vm.cld.sr Synchronizing Cookbooks:
uvo1qrwls0jdgs3blvt.vm.cld.sr Compiling Cookbooks...
uvo1qrwls0jdgs3blvt.vm.cld.sr [2014-01-28T11:03:14-05:00] WARN: Node
module3 has an empty run list.
uvo1qrwls0jdgs3blvt.vm.cld.sr Converging 0 resources
uvo1qrwls0jdgs3blvt.vm.cld.sr Chef Client finished, 0 resources updated
18
Exercise: Verify that the home page works
• Open a web browser
• Type in the the URL for your test node
19
v1.0.0_ChefConf
Data Bags
20
Lesson Objectives
• After completing the lesson, you will be able to
• Use Data Bags for data-driven recipes
• Use multiple recipes for a node's run list
Data Bags are generic stores of information
• Data Bags are generic, arbitrary stores of
information about the infrastructure
• Data Bag Items are JSON data
• Our apache cookbook provides a good baseline
• We'll drive site-specific virtual hosts with data bags
$ mkdir -p data_bags/vhosts
Create a directory for Data Bags
OPEN IN EDITOR:
SAVE FILE!
data_bags/vhosts/bears.json
{
"id" : "bears",
"port" : 80
}
Add a Data Bag Item
OPEN IN EDITOR:
SAVE FILE!
data_bags/vhosts/clowns.json
{
"id" : "clowns",
"port" : 81
}
Add a Data Bag Item
$ knife upload data_bags/vhosts
Upload the data bags
Created data_bags/vhosts
Created data_bags/vhosts/bears.json
Created data_bags/vhosts/clowns.json
A new recipe for virtual hosts
• We'll create an apache::vhosts recipe to manage
the virtual hosts we created in data bag items
• There's a number of new things to talk about in this
recipe
• We'll take this nice and slow :)
OPEN IN EDITOR:
SAVE FILE!
cookbooks/apache/recipes/vhosts.rb
data_bag("vhosts").each do |site|
site_data = data_bag_item("vhosts", site)
site_name = site_data["id"]
document_root = "/srv/apache/#{site_name}"
end
Create a vhosts recipe
OPEN IN EDITOR:
SAVE FILE!
cookbooks/apache/recipes/vhosts.rb
document_root = "/srv/apache/#{site_name}"
template "/etc/httpd/conf.d/#{site_name}.conf" do
source "custom-vhosts.erb"
mode "0644"
variables(
:document_root => document_root,
:port => site_data["port"]
)
notifies :restart, "service[httpd]"
end
end
Add a Virtual Hosts Configuration Template
OPEN IN EDITOR:
SAVE FILE!
cookbooks/apache/recipes/vhosts.rb
end
directory document_root do
mode "0755"
recursive true
end
end
Add a directory resource
OPEN IN EDITOR:
SAVE FILE!
cookbooks/apache/recipes/vhosts.rb
end
template "#{document_root}/index.html" do
source "index.html.erb"
mode "0644"
variables(
:site_name => site_name,
:port => site_data["port"]
)
end
end
Index for each vhost
OPEN IN EDITOR:
SAVE FILE!
cookbooks/apache/recipes/vhosts.rb
end
template "#{document_root}/index.html" do
source "index.html.erb"
mode "0644"
variables(
:site_name => site_name,
:port => site_data["port"]
)
end
end
Index for each vhost
https://gist.github.com/9134977
OPEN IN EDITOR:
SAVE FILE!
cookbooks/apache/templates/default/custom-vhosts.erb
<% if @port != 80 -%>
Listen <%= @port %>
<% end -%>
<VirtualHost *:<%= @port %>>
ServerAdmin webmaster@localhost
DocumentRoot <%= @document_root %>
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory <%= @document_root %>>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
</VirtualHost>
Index for each vhost
OPEN IN EDITOR:
SAVE FILE!
cookbooks/apache/templates/default/custom-vhosts.erb
<% if @port != 80 -%>
Listen <%= @port %>
<% end -%>
<VirtualHost *:<%= @port %>>
ServerAdmin webmaster@localhost
DocumentRoot <%= @document_root %>
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory <%= @document_root %>>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
</VirtualHost>
Index for each vhost
https://gist.github.com/2866454
OPEN IN EDITOR:
SAVE FILE!
cookbooks/apache/templates/default/index.html.erb
<h1>Hello, <%= node['apache']['greeting'] %>!</h1>
<p>My name is <%= node['hostname'] %></p>
<p>We love <%= @site_name %></p>
<p>Served from <%= node['ipaddress'] %>:<%= @port %></p>
Update the index.html template
$ knife diff cookbooks/apache
Diff the cookbook
diff --knife cookbooks/apache/templates/default/index.html.erb cookbooks/apache/templates/default/
index.html.erb
--- cookbooks/apache/templates/default/index.html.erb 2014-02-21 06:02:53.000000000 -0800
+++ cookbooks/apache/templates/default/index.html.erb 2014-02-21 06:02:53.000000000 -0800
@@ -1,3 +1,5 @@
<h1>Hello, <%= node['apache']['greeting'] %>!</h1>
<p>My name is <%= node['hostname'] %></p>
+<p>We love <%= @site_name %></p>
+<p>Served from <%= node['ipaddress'] %>:<%= @port %></p>
diff --knife cookbooks/apache/templates/default/custom-vhosts.erb cookbooks/apache/templates/
default/custom-vhosts.erb
new file
--- /dev/null 2014-02-21 06:02:53.000000000 -0800
+++ cookbooks/apache/templates/default/custom-vhosts.erb 2014-02-21 06:02:53.000000000 -0800
OPEN IN EDITOR:
SAVE FILE!
cookbooks/apache/metadata.rb
name 'apache'
maintainer 'YOUR_COMPANY_NAME'
maintainer_email 'YOUR_EMAIL'
license 'All rights reserved'
description 'Installs/Configures apache'
long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
version '0.2.0'
Update the metadata.rb
$ knife cookbook upload apache
Upload the cookbook
Uploading apache [0.2.0]
Uploaded 1 cookbook.
OPEN IN EDITOR:
SAVE FILE!
roles/webserver.json
{
"name" : "webserver",
"default_attributes" : {
"apache" : {
"greeting" : "Webinar"
}
},
"run_list" : [
"recipe[apache]",
"recipe[apache::vhosts]"
]
}
Update the webserver role
Exercise: Update the role
Updated Role webserver!
38
$ knife role from file webserver.json
Exercise: Update the role
Updated Role webserver!
38
root@module4:~$ sudo chef-client
Run the chef-client on your test node
Starting Chef Client, version 11.10.4
resolving cookbooks for run list: ["apache", "apache::vhosts"]
Synchronizing Cookbooks:
- apache
Compiling Cookbooks...
Converging 9 resources
Recipe: apache::default
* package[httpd] action install (up to date)
* service[httpd] action enable (up to date)
* service[httpd] action start (up to date)
* execute[mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.disabled] action run
(skipped due to only_if)
Recipe: apache::vhosts
* template[/etc/httpd/conf.d/bears.conf] action create
- create new file /etc/httpd/conf.d/bears.conf
- update content in file /etc/httpd/conf.d/bears.conf from none to 416948
--- /etc/httpd/conf.d/bears.conf 2014-02-21 09:20:53.592830069 -0500
+++ /tmp/chef-rendered-template20140221-6294-y855dq 2014-02-21 09:20:53.594830068 -0500
Think about what we just did...
Think about what we just did...
• We had two virtual hosts...
Think about what we just did...
• We had two virtual hosts...
• But we could arbitrarily add more...
Think about what we just did...
• We had two virtual hosts...
• But we could arbitrarily add more...
• Tigers on port 82, Lions on port 83, oh my!
Checkpoint
• Our cookbook has two recipes, default and vhosts
• Additional data bags can be added, expanding our
Virtual Hosting empire!
Chef Fundamentals
Webinar Series
Six Week Series
• Module 1 - Overview of Chef
• Module 2 - Node Setup, Chef Resources & Recipes
• Module 3 - Working with the Node object & Roles
• Today - Common configuration data with Databags
• June 17 - Environments
• June 24 - Community Cookbooks and Further Resources
• * Topics subject to change, schedule unlikely to change
Sign-up for Webinar
• http://pages.getchef.com/
cheffundamentalsseries.html
Additional Resources
• Chef Fundamentals Webinar Series
• https://www.youtube.com/watch?
v=S5lHUpzoCYo&list=PL11cZfNdwNyPnZA9D1MbVqldGuOWqbum
Z
• Discussion group for webinar participants
• https://groups.google.com/d/forum/learnchef-fundamentals-webinar
45
Additional Resources
• Learn Chef
• http://learnchef.com
• Documentation
• http://docs.opscode.com
46
Lesson Objectives
• After completing the lesson, you will be able to
• Use Data Bags for data-driven recipes
• Use multiple recipes for a node's run list
Six Week Series
• Module 1 - Overview of Chef
• Module 2 - Node Setup, Chef Resources & Recipes
• Module 3 - Working with the Node object & Roles
• Today - Common configuration data with Databags
• June 17 - Environments
• June 24 - Community Cookbooks and Further Resources
• * Topics subject to change, schedule unlikely to change

More Related Content

Common configuration with Data Bags - Fundamentals Webinar Series Part 4

  • 2. Nathen Harvey • Community Director • Co-host of the Food Fight Show Podcast • @nathenharvey
  • 4. Multi-week Webinar Series • After completing of this webinar series you will be able to • Automate common infrastructure tasks with Chef • Describe Chef’s architecture • Describe Chef’s various tools • Apply Chef’s primitives to solve your problems
  • 5. How to learn Chef • You bring the domain expertise about your business and infrastructure • Chef provides a framework for automating your infrastructure • Our job is to work together to teach you how to model and automate your infrastructure with Chef
  • 6. Chef is a Language • Learning Chef is like learning the basics of a language • 80% fluency will be reached very quickly • The remaining 20% just takes practice • The best way to learn Chef is to use Chef
  • 7. Questions & Answers • Ask questions in the chat window when they come to you • We’ll answer as many questions as we can at the end of the session
  • 8. Questions & Answers • Ask questions in the Google Discussion Forum • This can be used during the webinar and outside of the webinar, too. • https://groups.google.com/d/ forum/learnchef-fundamentals- webinar
  • 9. Slides and Video • This webinar is being recorded. The video will be made available shortly after the session has ended. • The slides used throughout this webinar will be made available at the end of each webinar. • Watch http://learnchef.com for updates.
  • 11. Topics • Overview of Chef • Workstation Setup • Node Setup • Chef Resources and Recipes • Working with the Node object • Roles • Common configuration with Data Bags - Today • Environments • Community Cookbooks and Further Resources
  • 13. In the last module • Login to the node in your Chef Training Lab • Install Chef nodes using "knife bootstrap" • Included a run_list so that the server was a web server when the bootstrap process completed • Read and wrote node attributes 13
  • 14. Where did my Node go? • We still need a CentOS machine to manage • The one we launched last time has likely expired • Launch a new one using the Chef Lab • Hopefully, you’ve already done this. We’re not going to spend time walking through it now. 14
  • 16. $ ssh root@<EXTERNAL_ADDRESS> Lab - Login The authenticity of host 'uvo1qrwls0jdgs3blvt.vm.cld.sr (69.195.232.110)' can't be established. RSA key fingerprint is d9:95:a3:b9:02:27:e9:cd: 74:e4:a2:34:23:f5:a6:8b. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'uvo1qrwls0jdgs3blvt.vm.cld.sr, 69.195.232.110' (RSA) to the list of known hosts. chef@uvo1qrwls0jdgs3blvt.vm.cld.sr's password: Last login: Mon Jan 6 16:26:24 2014 from host86-145-117-53.range86-145.btcentralplus.com [chef@CentOS63 ~]$ 16
  • 17. Checkpoint • At this point you should have • One virtual machine (VM) or server that you’ll use for the lab exercises • The IP address or public hostname • An application for establishing an ssh connection • 'sudo' or 'root' permissions on the VM 17
  • 18. $ knife bootstrap <EXTERNAL_ADDRESS> -x root -P chef -N ‘module4’ -r ‘role[webserver]’ "Bootstrap" the Target Instance Bootstrapping Chef on uvo1qrwls0jdgs3blvt.vm.cld.sr ... ... uvo1qrwls0jdgs3blvt.vm.cld.sr Creating a new client identity for module3 using the validator key. uvo1qrwls0jdgs3blvt.vm.cld.sr resolving cookbooks for run list: [] uvo1qrwls0jdgs3blvt.vm.cld.sr Synchronizing Cookbooks: uvo1qrwls0jdgs3blvt.vm.cld.sr Compiling Cookbooks... uvo1qrwls0jdgs3blvt.vm.cld.sr [2014-01-28T11:03:14-05:00] WARN: Node module3 has an empty run list. uvo1qrwls0jdgs3blvt.vm.cld.sr Converging 0 resources uvo1qrwls0jdgs3blvt.vm.cld.sr Chef Client finished, 0 resources updated 18
  • 19. Exercise: Verify that the home page works • Open a web browser • Type in the the URL for your test node 19
  • 21. Lesson Objectives • After completing the lesson, you will be able to • Use Data Bags for data-driven recipes • Use multiple recipes for a node's run list
  • 22. Data Bags are generic stores of information • Data Bags are generic, arbitrary stores of information about the infrastructure • Data Bag Items are JSON data • Our apache cookbook provides a good baseline • We'll drive site-specific virtual hosts with data bags
  • 23. $ mkdir -p data_bags/vhosts Create a directory for Data Bags
  • 24. OPEN IN EDITOR: SAVE FILE! data_bags/vhosts/bears.json { "id" : "bears", "port" : 80 } Add a Data Bag Item
  • 25. OPEN IN EDITOR: SAVE FILE! data_bags/vhosts/clowns.json { "id" : "clowns", "port" : 81 } Add a Data Bag Item
  • 26. $ knife upload data_bags/vhosts Upload the data bags Created data_bags/vhosts Created data_bags/vhosts/bears.json Created data_bags/vhosts/clowns.json
  • 27. A new recipe for virtual hosts • We'll create an apache::vhosts recipe to manage the virtual hosts we created in data bag items • There's a number of new things to talk about in this recipe • We'll take this nice and slow :)
  • 28. OPEN IN EDITOR: SAVE FILE! cookbooks/apache/recipes/vhosts.rb data_bag("vhosts").each do |site| site_data = data_bag_item("vhosts", site) site_name = site_data["id"] document_root = "/srv/apache/#{site_name}" end Create a vhosts recipe
  • 29. OPEN IN EDITOR: SAVE FILE! cookbooks/apache/recipes/vhosts.rb document_root = "/srv/apache/#{site_name}" template "/etc/httpd/conf.d/#{site_name}.conf" do source "custom-vhosts.erb" mode "0644" variables( :document_root => document_root, :port => site_data["port"] ) notifies :restart, "service[httpd]" end end Add a Virtual Hosts Configuration Template
  • 30. OPEN IN EDITOR: SAVE FILE! cookbooks/apache/recipes/vhosts.rb end directory document_root do mode "0755" recursive true end end Add a directory resource
  • 31. OPEN IN EDITOR: SAVE FILE! cookbooks/apache/recipes/vhosts.rb end template "#{document_root}/index.html" do source "index.html.erb" mode "0644" variables( :site_name => site_name, :port => site_data["port"] ) end end Index for each vhost
  • 32. OPEN IN EDITOR: SAVE FILE! cookbooks/apache/recipes/vhosts.rb end template "#{document_root}/index.html" do source "index.html.erb" mode "0644" variables( :site_name => site_name, :port => site_data["port"] ) end end Index for each vhost https://gist.github.com/9134977
  • 33. OPEN IN EDITOR: SAVE FILE! cookbooks/apache/templates/default/custom-vhosts.erb <% if @port != 80 -%> Listen <%= @port %> <% end -%> <VirtualHost *:<%= @port %>> ServerAdmin webmaster@localhost DocumentRoot <%= @document_root %> <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory <%= @document_root %>> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory> </VirtualHost> Index for each vhost
  • 34. OPEN IN EDITOR: SAVE FILE! cookbooks/apache/templates/default/custom-vhosts.erb <% if @port != 80 -%> Listen <%= @port %> <% end -%> <VirtualHost *:<%= @port %>> ServerAdmin webmaster@localhost DocumentRoot <%= @document_root %> <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory <%= @document_root %>> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory> </VirtualHost> Index for each vhost https://gist.github.com/2866454
  • 35. OPEN IN EDITOR: SAVE FILE! cookbooks/apache/templates/default/index.html.erb <h1>Hello, <%= node['apache']['greeting'] %>!</h1> <p>My name is <%= node['hostname'] %></p> <p>We love <%= @site_name %></p> <p>Served from <%= node['ipaddress'] %>:<%= @port %></p> Update the index.html template
  • 36. $ knife diff cookbooks/apache Diff the cookbook diff --knife cookbooks/apache/templates/default/index.html.erb cookbooks/apache/templates/default/ index.html.erb --- cookbooks/apache/templates/default/index.html.erb 2014-02-21 06:02:53.000000000 -0800 +++ cookbooks/apache/templates/default/index.html.erb 2014-02-21 06:02:53.000000000 -0800 @@ -1,3 +1,5 @@ <h1>Hello, <%= node['apache']['greeting'] %>!</h1> <p>My name is <%= node['hostname'] %></p> +<p>We love <%= @site_name %></p> +<p>Served from <%= node['ipaddress'] %>:<%= @port %></p> diff --knife cookbooks/apache/templates/default/custom-vhosts.erb cookbooks/apache/templates/ default/custom-vhosts.erb new file --- /dev/null 2014-02-21 06:02:53.000000000 -0800 +++ cookbooks/apache/templates/default/custom-vhosts.erb 2014-02-21 06:02:53.000000000 -0800
  • 37. OPEN IN EDITOR: SAVE FILE! cookbooks/apache/metadata.rb name 'apache' maintainer 'YOUR_COMPANY_NAME' maintainer_email 'YOUR_EMAIL' license 'All rights reserved' description 'Installs/Configures apache' long_description IO.read(File.join(File.dirname(__FILE__), 'README.md')) version '0.2.0' Update the metadata.rb
  • 38. $ knife cookbook upload apache Upload the cookbook Uploading apache [0.2.0] Uploaded 1 cookbook.
  • 39. OPEN IN EDITOR: SAVE FILE! roles/webserver.json { "name" : "webserver", "default_attributes" : { "apache" : { "greeting" : "Webinar" } }, "run_list" : [ "recipe[apache]", "recipe[apache::vhosts]" ] } Update the webserver role
  • 40. Exercise: Update the role Updated Role webserver! 38
  • 41. $ knife role from file webserver.json Exercise: Update the role Updated Role webserver! 38
  • 42. root@module4:~$ sudo chef-client Run the chef-client on your test node Starting Chef Client, version 11.10.4 resolving cookbooks for run list: ["apache", "apache::vhosts"] Synchronizing Cookbooks: - apache Compiling Cookbooks... Converging 9 resources Recipe: apache::default * package[httpd] action install (up to date) * service[httpd] action enable (up to date) * service[httpd] action start (up to date) * execute[mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.disabled] action run (skipped due to only_if) Recipe: apache::vhosts * template[/etc/httpd/conf.d/bears.conf] action create - create new file /etc/httpd/conf.d/bears.conf - update content in file /etc/httpd/conf.d/bears.conf from none to 416948 --- /etc/httpd/conf.d/bears.conf 2014-02-21 09:20:53.592830069 -0500 +++ /tmp/chef-rendered-template20140221-6294-y855dq 2014-02-21 09:20:53.594830068 -0500
  • 43. Think about what we just did...
  • 44. Think about what we just did... • We had two virtual hosts...
  • 45. Think about what we just did... • We had two virtual hosts... • But we could arbitrarily add more...
  • 46. Think about what we just did... • We had two virtual hosts... • But we could arbitrarily add more... • Tigers on port 82, Lions on port 83, oh my!
  • 47. Checkpoint • Our cookbook has two recipes, default and vhosts • Additional data bags can be added, expanding our Virtual Hosting empire!
  • 49. Six Week Series • Module 1 - Overview of Chef • Module 2 - Node Setup, Chef Resources & Recipes • Module 3 - Working with the Node object & Roles • Today - Common configuration data with Databags • June 17 - Environments • June 24 - Community Cookbooks and Further Resources • * Topics subject to change, schedule unlikely to change
  • 50. Sign-up for Webinar • http://pages.getchef.com/ cheffundamentalsseries.html
  • 51. Additional Resources • Chef Fundamentals Webinar Series • https://www.youtube.com/watch? v=S5lHUpzoCYo&list=PL11cZfNdwNyPnZA9D1MbVqldGuOWqbum Z • Discussion group for webinar participants • https://groups.google.com/d/forum/learnchef-fundamentals-webinar 45
  • 52. Additional Resources • Learn Chef • http://learnchef.com • Documentation • http://docs.opscode.com 46
  • 53. Lesson Objectives • After completing the lesson, you will be able to • Use Data Bags for data-driven recipes • Use multiple recipes for a node's run list
  • 54. Six Week Series • Module 1 - Overview of Chef • Module 2 - Node Setup, Chef Resources & Recipes • Module 3 - Working with the Node object & Roles • Today - Common configuration data with Databags • June 17 - Environments • June 24 - Community Cookbooks and Further Resources • * Topics subject to change, schedule unlikely to change