Common configuration with Data Bags - Fundamentals Webinar Series Part 4
- 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
- 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
- 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
- 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
- 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