Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Remove all of the materials.

This training content is being deprecated
  • Loading branch information...
commit 8fd0c1340f742672e78ab05cc2b6e3e321103651 1 parent dd718a2
@nathenharvey nathenharvey authored
Showing with 0 additions and 25,827 deletions.
  1. +0 −28 CONTRIBUTING
  2. +0 −7 Gemfile
  3. +0 −134 Rakefile
  4. +0 −74 guides/instructor-setup.md
  5. +0 −99 guides/prerequisites.md
  6. +0 −9 guides/student-exercises.md
  7. +0 −42 guides/student-exercises/adding-a-new-node.md
  8. +0 −80 guides/student-exercises/adding-cookbooks.md
  9. +0 −96 guides/student-exercises/anatomy-of-a-chef-run.md
  10. +0 −72 guides/student-exercises/chef-node.md
  11. +0 −92 guides/student-exercises/cookbooks-recipes-resources.md
  12. +0 −50 guides/student-exercises/data-bags.md
  13. +0 −61 guides/student-exercises/example-cookbook.md
  14. +0 −87 guides/student-exercises/getting-started.md
  15. +0 −30 guides/student-exercises/introduction-to-search.md
  16. +0 −8 guides/student-exercises/lwrp-introduction.md
  17. +0 −104 guides/student-exercises/more-cookbooks.md
  18. +0 −103 guides/student-exercises/multiple-nodes-and-search.md
  19. +0 −38 guides/student-exercises/node-attributes.md
  20. +0 −78 guides/student-exercises/resources-in-depth.md
  21. +0 −45 guides/student-exercises/roles.md
  22. +0 −4 guides/student-exercises/troubleshooting.md
  23. +0 −20 image-src/README.md
  24. +0 −1,334 image-src/anatomy-of-chef-run.graffle
  25. +0 −2,392 image-src/authn-flow.graffle
  26. +0 −1,695 image-src/bare-metal-cloud.graffle
  27. +0 −1,351 image-src/bare-metal.graffle
  28. +0 −1,161 image-src/chef-basics-cookbook.graffle
  29. +0 −2,563 image-src/chef-server-arch.graffle
  30. +0 −856 image-src/chef-server-url-config.graffle
  31. +0 −3,559 image-src/complex-infrastructure.graffle
  32. +0 −1,416 image-src/doing-their-job.graffle
  33. +0 −1,680 image-src/integrated-systems.graffle
  34. +0 −306 image-src/third-party-services.graffle
  35. +0 −301 slides/additional-topics/01_slide.md
  36. +0 −324 slides/anatomy-of-a-chef-run/01_slide.md
  37. +0 −181 slides/base.css
  38. +0 −120 slides/chef-development/01_slide.md
  39. +0 −472 slides/chef-node/01_slide.md
  40. +0 −405 slides/cookbooks-recipes-resources/01_slide.md
  41. +0 −720 slides/getting-started/01_slide.md
  42. BIN  slides/images/5-free-nodes.png
  43. BIN  slides/images/anatomy-of-chef-run-0.png
  44. BIN  slides/images/anatomy-of-chef-run-1.png
  45. BIN  slides/images/anatomy-of-chef-run-2.png
  46. BIN  slides/images/anatomy-of-chef-run-3.png
  47. BIN  slides/images/anatomy-of-chef-run-4.png
  48. BIN  slides/images/anatomy-of-chef-run-5.png
  49. BIN  slides/images/anatomy-of-chef-run-6.png
  50. BIN  slides/images/anatomy-of-chef-run.png
  51. BIN  slides/images/anatomy-of-chef-run/anatomy-of-chef-run-001.png
  52. BIN  slides/images/anatomy-of-chef-run/anatomy-of-chef-run-002.png
  53. BIN  slides/images/anatomy-of-chef-run/anatomy-of-chef-run-003.png
  54. BIN  slides/images/anatomy-of-chef-run/anatomy-of-chef-run-004.png
  55. BIN  slides/images/anatomy-of-chef-run/anatomy-of-chef-run-005.png
  56. BIN  slides/images/anatomy-of-chef-run/anatomy-of-chef-run-006.png
  57. BIN  slides/images/anatomy-of-chef-run/anatomy-of-chef-run-007.png
  58. BIN  slides/images/anatomy-of-chef-run/anatomy-of-chef-run-008.png
  59. BIN  slides/images/anatomy-of-chef-run/anatomy-of-chef-run-009.png
  60. BIN  slides/images/anatomy-of-chef-run/anatomy-of-chef-run-010.png
  61. BIN  slides/images/anatomy-of-chef-run/anatomy-of-chef-run-011.png
  62. BIN  slides/images/anatomy-of-chef-run/anatomy-of-chef-run-full.png
  63. BIN  slides/images/authn-flow.png
  64. BIN  slides/images/bare-metal-cloud.png
  65. BIN  slides/images/bare-metal.png
  66. BIN  slides/images/chef-basics-cookbook.png
  67. BIN  slides/images/chef-server-arch.png
  68. BIN  slides/images/chef-server-url-config.png
  69. BIN  slides/images/complex-infrastructure.png
  70. BIN  slides/images/doing-their-job.png
  71. BIN  slides/images/email-verified.png
  72. BIN  slides/images/free-trial.png
  73. BIN  slides/images/generate-knife-config.png
  74. BIN  slides/images/generate-validation-key.png
  75. BIN  slides/images/getting-cookbooks.png
  76. BIN  slides/images/hosted-chef-signup.png
  77. BIN  slides/images/integrated-systems.png
  78. BIN  slides/images/manage-console-user-login.png
  79. BIN  slides/images/next-steps.png
  80. BIN  slides/images/oc-chef-logo.png
  81. BIN  slides/images/policy-driven-process.png
  82. BIN  slides/images/select-organizations.png
  83. BIN  slides/images/signup-about.png
  84. BIN  slides/images/third-party-services.png
  85. BIN  slides/images/user-get-private-key.png
  86. BIN  slides/images/working-with-chef.png
  87. +0 −408 slides/introduction/01_slide.md
  88. +0 −317 slides/just-enough-ruby-for-chef/01_slide.md
  89. +0 −495 slides/lwrp-introduction/01_slide.md
  90. +0 −376 slides/more-cookbooks/01_slide.md
  91. +0 −377 slides/multiple-nodes-and-search/01_slide.md
  92. +0 −842 slides/resources-in-depth/01_slide.md
  93. +0 −193 slides/roles/01_slide.md
  94. +0 −33 slides/showoff.json
  95. +0 −57 slides/shrink.js
  96. +0 −532 slides/troubleshooting/01_slide.md
View
28 CONTRIBUTING
@@ -1,28 +0,0 @@
-These materials are an Opscode open source project. They are
-dual-licensed under Creative Commons and the Apache License, Version
-2.0. See the LICENSE file for more information about your rights.
-
-In order to contribute changes to the supporting code and significant
-example code on slides, we require a contributor license
-agreement. Please see the following wiki document for more
-information:
-
-* http://wiki.opscode.com/display/chef/How+to+Contribute
-
-A contributor license agreement is not required to contribute changes
-to the slides, guides or notes that are placed under Creative Commons
-license. However, for tracking purposes we ask that a ticket in JIRA
-is created, and noted in the commit message for the change.
-
-* http://tickets.opscode.com/browse/FND
-
-For example:
-
- git commit -m '[FND-##] - fixed typos in getting started'
-
-When making changes in the repository, please do not modify the
-"showoff.json" file. Also please do not replace images without new
-sources such as OmniGraffle.
-
-If you would like to be credited for contributions, add your name to
-the __Authors__ section of the README.md.
View
7 Gemfile
@@ -1,7 +0,0 @@
-source :rubygems
-gem "rake"
-gem "redcarpet"
-gem "pdfkit"
-gem "showoff", :git => "git://github.com/jtimberman/showoff.git", :branch => "chef-fnd"
-gem "chef", "~> 0.10.0"
-gem "knife-ec2"
View
134 Rakefile
@@ -1,134 +0,0 @@
-# -*- coding: utf-8 -*-
-require "fileutils"
-require 'redcarpet'
-require 'json'
-
-desc "Serve the presentation"
-task :present do
- Dir.chdir("slides")
- sh "bundle exec showoff serve"
-end
-
-desc "Generate static HTML"
-task :static do
- Dir.chdir("slides")
- sh "bundle exec showoff static"
- sh "zip static.zip static/*"
-end
-
-desc "Create the directory and initial slides (with SECTION=name)"
-task :mksection do
- section = ENV['SECTION']
- slides_dir = File.join(File.dirname(__FILE__), "slides", section)
- guides_dir = File.join(File.dirname(__FILE__), "guides", "student-exercises")
- puts "** Creating section #{section} **"
- FileUtils.mkdir_p(slides_dir)
- FileUtils.mkdir_p(guides_dir)
- unless File.exists?(File.join(slides_dir, "01_slide.md"))
- puts "- populating slide template #{slides_dir}/01_slide.md"
- File.open(File.join(slides_dir, "01_slide.md"), "a+") do |f|
- f.puts "# #{section_header(section)}\n\n"
- f.puts "Section Objectives:\n"
- f.puts copyright_header
- f.puts "# Summary\n\n\n"
- f.puts "# Questions\n\n*\n\n"
- f.puts "# Additional Resources\n\n*\n\n"
- f.puts "# Lab Exercise\n\n"
- f.puts section_header(section)
- end
- puts "- populating exercises #{File.join(guides_dir, section)}.md"
- File.open(File.join(guides_dir, "#{section}.md"), "a+") do |g|
- g.puts exercise_guide(section)
- end
- end
-end
-
-desc "Generate HTML out of Markdown (Slides)"
-task :md_to_html do
- html_dir = File.join("slides", "html")
- sections = showoff_sections
- FileUtils.mkdir_p(html_dir)
- sections.each_with_index do |s,i|
- fn = File.join(html_dir, "section-#{i}-#{s}.html")
- %x[grep -v "@@@" slides/#{s}/01_slide.md | redcarpet > #{fn}]
- %x[cp #{s}/*.png html 2>/dev/null]
- File.open(File.join("slides", "html", "index.html"), "a+") do |h|
- h.puts html_list_item s, fn
- end
- end
-end
-
-desc "Generate HTML out of Markdown (Guides)"
-task :student_guide do
- guides_dir = File.join("guides", "student-exercises")
- sections = showoff_sections
- markdown = []
- FileUtils.mkdir_p(html_dir)
- sections.each do |s|
- fn = File.join(guides_dir, "#{s}.md")
- markdown << IO.read(fn) if File.exists?(fn)
- end
- File.open(File.join(html_dir, "Student-Exercises.html"), "a+") do |h|
- h.puts Redcarpet::Markdown.new(Redcarpet::Render::HTML).render(markdown.join("\n<hr />\n"))
- end
-end
-
-desc "Generate HTML Student Prerequisites"
-task :student_prereq do
- File.unlink(File.join(html_dir, "Student-Prerequisites.html"))
- markdown = IO.read(File.join("guides", "prerequisites.md"))
- FileUtils.mkdir_p(html_dir)
- File.open(File.join(html_dir, "Student-Prerequisites.html"), "a+") do |h|
- h.puts Redcarpet::Markdown.new(Redcarpet::Render::HTML).render(markdown)
- end
-end
-
-desc "Count the number of slides per section"
-task :slide_counter do
- sections = showoff_sections
- puts "** Number of slides in each section:"
- sections.each do |section|
- puts "- #{section}: #{line_count(File.join("slides", section, "01_slide.md"))}"
- end
-end
-
-def html_dir
- File.join(File.dirname(__FILE__), "guides", "html")
-end
-
-def line_count(slides)
- count = 0
- begin
- f = File.open(slides)
- rescue
- return "section does not exist, create with `mksection`"
- end
- f.each do |line|
- count += 1 if line =~ /^# /
- end
- count
-end
-
-def html_list_item(section, filename)
- %Q{<li><a href="../#{filename}">#{section}</a></li>}
-end
-
-def showoff_sections
- JSON.parse(IO.read(File.join("slides", "showoff.json")))['sections']
-end
-
-def section_header(section = "welcome")
- lcase = %w{an of the a}
- parts = section.split(/[-_]/)
- header = Array(parts).flatten.map {|p| lcase.include?(p) ? p : p.capitalize }
- header.join(' ')
-end
-
-def copyright_header
- "\n.notes These course materials are Copyright © 2010-2012 Opscode, Inc. All rights reserved.
-This work is licensed under a Creative Commons Attribution Share Alike 3.0 United States License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/us; or send a letter to Creative Commons, 171 2nd Street, Suite 300, San Francisco, California, 94105, USA.\n\n"
-end
-
-def exercise_guide(section = "welcome")
- "#{section_header(section)}\n======================\n\n## Objectives\n\n## Acceptance Criteria\n\n## Questions\n"
-end
View
74 guides/instructor-setup.md
@@ -1,74 +0,0 @@
-Description
-===========
-
-This guide describes requirements set up an environment that Chef
-Fundamentals students use for hands on exercises.
-
-Specifics are written for Amazon EC2. If another environment is
-used, then adjust accordingly based on the requirements.
-
-Base Operating System
-=====================
-
-The target systems used by the Chef Fundamentals exercises are assumed
-to be Ubuntu Server 10.04 or higher.
-
-Required Network Access
-=======================
-
-Students will configure systems that need to be accessed on the
-public-facing IP address through the following TCP ports:
-
-* 22
-* 80 and 443
-* 22002
-
-Login Credentials
-=================
-
-Students will log into the systems with a common username and
-password. For consistency, use the password "opstrain_0150".
-
-EC2 Implementation
-==================
-
-## Create Security Group
-
-Use the EC2 API tools to manage the `fnd` security group as described
-below. If multiple Chef Fundamentals classes are happening at the same
-time and using the same EC2 account, modify the security group name
-accordingly. It may be desirable to use a different region, e.g. when
-conducting a class in Europe or Asia use the appropriate
-region. Append "`--region REGION`" to the commands.
-
- export labgroup=fnd
- ec2addgrp ${labgroup} -d ${labgroup}
- ec2auth ${labgroup} -P tcp -s 0.0.0.0/0 -p 22
- ec2auth ${labgroup} -P tcp -s 0.0.0.0/0 -p 443
- ec2auth ${labgroup} -P tcp -s 0.0.0.0/0 -p 22002
- ec2auth ${labgroup} -P tcp -s 0.0.0.0/0 -p 8080
- ec2auth ${labgroup} -P tcp -s 0.0.0.0/0 -p 80
-
-## Bootstrap Templates
-
-Use the bootstrap template found in `.chef/bootstrap/fnd-lab.erb` to
-create new instances with the login credentials set. For example, this
-will configure the `ubuntu` user to log in with the password "opstrain_0150".
-
-## Launch Instances
-
-This step is used for the systems which will be used by students as
-nodes to configure. For each student, execute the following `knife
-ec2` command.
-
- knife ec2 server create \
- -f m1.small -I $lucid_small \
- -x ubuntu -d fnd-lab -G ${labgroup}
-
-If another region is required, append "`--region REGION`" and "`-Z
-ZONE`" to specify the region and availability zone in that region.
-
-Replace "$lucid_small" with the current AMI from Canonical's list of
-AMIs for Ubuntu:
-
-* http://uec-images.ubuntu.com/releases/10.04/release/
View
99 guides/prerequisites.md
@@ -1,99 +0,0 @@
-This guide describes prerequisites that students should meet in order
-to get the most out of Chef Fundamentals.
-
-# General Requirements
-
-Students should be familiar with basic to intermediate system
-administration topics including the following:
-
-* Command-line familiarity with Unix/Linux shells or Windows
- Powershell
-* System resource concepts like package, service and user management
-* Key-based authentication (e.g., RSA/SSH)
-* Version control systems (e.g., Git, Mercurial, Subversion)
-* Knowledge of cloud computing or virtualization concepts such as
- API-driven compute
-
-Students should have basic working knowledge with at least one third
-generation programming language such as Perl, Python, Php or Ruby.
-
-* Basic data structures (string, numbers, array, hash or language
- equivalent)
-* Conditionals (if/unless, case)
-* Loops (for/foreach, while, or language equivalent)
-
-# Workstation Requirements
-
-Student Exercises will run from a management workstation
-system. Students should install non-Chef required software before the
-class starts.
-
-* SSH/SCP (OpenSSH, puTTY/WinSCP or equivalent)
-* [Git](http://git-scm.org)
-
-On Unix/Linux/OS X systems:
-
-* C/C++ compiler, build environment (`build-essential`, Xcode, or
- platform equivalent).
-
-If Chef is not already installed, use [Opscode's Full Stack Chef
-installer](http://www.opscode.com/chef/install). This will also be
-covered during the introductory portion of the course.
-
-### Mac OS X Users
-
-**If you do not already have Xcode installed**
-
-Recently, Apple made Xcode 4.3's command-line tools available as a
-separate download from the full Xcode package. If you do not already
-have Xcode installed, you can use this installation instead, as it is
-a 165Mb download instead of several gigabytes. Log in with your Apple
-ID here:
-
-* https://developer.apple.com/downloads/index.action
-
-And select, "Command Line Tools for Xcode" to download the dmg.
-
-## Additional Requirements
-
-The instructor may provide virtual machine image(s) in the form of a
-VMDK format disk image which will be the target system(s) to configure
-with Chef during the hands on exercises. This can be imported into
-VMware Fusion, Player or Workstation, or otherwise indicated by the
-instructor. The image should be downloaded before the course starts,
-and imported into the virtual machine hypervisor as indicated by the
-instructor.
-
-They will also provide additional details such as the platform of the
-virtual machine, and the login information.
-
-# Chef Server Requirements
-
-Students may already have a Chef Server, whether it is Opscode Hosted
-Chef, Opscode Private Chef or an Open Source Chef Server. The
-exercises in the course will focus on using Opscode Hosted Chef unless
-otherwise prior arrangements have been made by the instructor with the
-students.
-
-## Sign up for Opscode Hosted Chef
-
-It is recommended that students do not use the same Chef Server that
-their production infrastructure might be using. It is relatively quick
-and easy to sign up for Opscode Hosted Chef, so this is done during
-the first exercises of the course. Students are welcome to sign up
-ahead of time. The signup process will also provide instructions how
-to set up an organization which you will use for your Chef
-Server. When creating the organization, select the Free trial, which
-you may continue to use for free for further studies and to manage up
-to 5 nodes when the class is over.
-
-* http://www.opscode.com/hosted-chef/
-
-# Need Help?
-
-If you are taking this course from Opscode directly and need help or
-have questions above this document, please email support@opscode.com with
-"Chef Fundamentals Prerequisites" in the subject line.
-
-If you are taking this course from an independent Chef Fundamentals
-trainer, contact your instructor for assistance.
View
9 guides/student-exercises.md
@@ -1,9 +0,0 @@
-The current Student Exercise guide is `handholder-exercises.md`. These
-include more "hand holding" to assist students, but don't facilitate
-learning and reinforcement. As the course materials stand, use these
-exercises for conducting the course hands on exercises.
-
-Student exercises are being rewritten and will be in the
-`student-exercises` directory, one file per section of the same
-name. The course materials need to be updated to match how the
-exercises will be conducted.
View
42 guides/student-exercises/adding-a-new-node.md
@@ -1,42 +0,0 @@
-Adding a New Node
-======================
-
-## Objectives
-
-* Use `knife bootstrap` to set up a new node as a load balancer in front of the existing target node.
-
-## Acceptance Criteria
-
-* `haproxy` cookbook in repository.
-* `load_balancer` role to apply `haproxy` recipe that uses Search.
-* Second target system is bootstrapped with `knife bootstrap` and configured as a load balancer.
-* Answered questions.
-
-## Acquire Haproxy Cookbook
-
-Download the `haproxy` cookbook from the Chef Community Site. We're going to use the `app_lb` recipe. Review the recipe, and the attributes. Upload the cookbook to the Chef Server.
-
-## Create Load Balancer Role
-
-Create a new role named `load_balancer`. It should use the `haproxy` cookbook's `app_lb` recipe. The `haproxy` cookbook uses the attribute `member_port` to specify what port the web servers are listening to. Set this attribute in the role to "80".
-
-Upload the role to the Chef Server.
-
-## Bootstrap new Node
-
-Your instructor will provide a second target system's IP address. Use the `knife bootstrap` command to automatically set up the system with the `base` and `load_balancer` roles with Chef.
-
-Once complete, navigate to the public IP address of the load balancer system in your web browser on port 80. Then navigate to the same IP on port 22002.
-
-## Questions
-
-How does the `haproxy::app_lb` recipe determine what nodes to search? Can it be modified? If so, where would that be done?
-
-
-How many nodes have HTTP traffic balanced by haproxy?
-
-
-What other attributes does the haproxy cookbook have?
-
-
-The haproxy cookbook has a `default` recipe. How does it differ from the `app_lb` recipe?
View
80 guides/student-exercises/adding-cookbooks.md
@@ -1,80 +0,0 @@
-Adding Cookbooks
-======================
-
-## Objectives
-
-* Download additional cookbooks from the Chef Community Site
-* Update `base` role with additional cookbooks
-* Create a new `webserver` cookbook
-* Apply the `webserver` cookbook to the target system
-
-## Acceptance Criteria
-
-* `apache2`, `apt` and `chef-client` cookbooks should be in the Chef Repository and Chef Server
-* New cookbooks should be applied with `base` role.
-* A new cookbook named `webserver` should be in the Chef Repository and Chef Server
-* A new role named `webserver` should apply the `apache2` and `webserver` cookbooks
-
-## Download Additional Cookbooks
-
-Download and extract the following cookbooks from the Chef Community Site.
-
-* `apache2`
-* `apt`
-* `chef-client`
-
-Extract these into the `cookbook_path` and upload them to the Chef Server.
-
-Add `apt` and `chef-client` to the `base` role's run list. Don't do anything else with the `apache2` cookbook yet.
-
-## Create webserver Cookbook
-
-Create a new cookbook named `webserver` in the Chef Repository `cookbook_path`. It should have `metadata.rb`, a default recipe and a template.
-
-The default recipe should contain the following:
-
-* Include the `apache2` recipe.
-* A template for `/var/www/index.html`. Create the source as `index.html.erb`. It should be owned by the `node['apache']['user']` attribute.
-
-The metadata should declare a dependency on the `apache2` cookbook.
-
-The index.html should display the following node information:
-
-* Node's `name`
-* `platform` attribute
-* `platform_version` attribute
-* `fqdn` attribute
-* `ec2['public_hostname']` attribute
-* Expanded list of recipes in the node's run list.
-
-To display the recipes in the node's run list, use:
-
-`node.recipes.join(", ")`
-
-Format and display the HTML page any way you want, including wrapped in a `<pre>` block. The point is to write ERB, not HTML.
-
-## Create webserver Role
-
-Create a new `webserver` role Ruby DSL file in the `roles` directory. It should have the `webserver` cookbook in its run list. Upload the role to the Chef Server.
-
-## Add webserver Role and Run Chef
-
-Use `knife` to add the `webserver` role to the target node's run list. Log into the system and run `chef-client`. Verify that Chef runs successfully, and then examine the node object on the Chef Server. Navigate to the node's IP address in a web browser to view the content of the index.html file.
-
-## Questions
-
-What is the node's run list on the Chef Server? Does it have equivalent content in the rendered web page?
-
-
-What is the content of the `recipes` attribute? Is this different than earlier exercises? If so, how?
-
-
-Is the `apache2` cookbook in the node's run list or the `recipes` attribute? Why or why not?
-
-
-View the `webserver` cookbook on the Chef Server. What are its dependencies?
-
-
-View the `base` role on the Chef Server. What is its run list?
-
-
View
96 guides/student-exercises/anatomy-of-a-chef-run.md
@@ -1,96 +0,0 @@
-Anatomy of a Chef Run
-======================
-
-## Objectives
-
-* Configure remote target to run `chef-client`
-* Successful `chef-client` run with debug logging
-
-## Acceptance Criteria
-
-* Client and node objects exist on Chef Server
-* Debug log output from `chef-client`
-* Answer the questions
-
-## Prepare Remote Target
-
-**Ubuntu**
-
-Your instructor will provide an IP address of an Ubuntu
-system. Connect to the system with the following credentials:
-
-* Username: ubuntu
-* Password: opstrain_0150
-
-**CentOS**
-
-You should have the Virtual Machine created in VMware (Player,
-Workstation, Fusion) on your workstation. The login credentials are:
-
-* Username: root
-* Password: opscodechef
-
-Log in and run `/sbin/ifconfig` or `/sbin/ip addr` to get the system's
-IP address.
-
-**All**
-
-You will need to install Chef on the system. Use the Full Stack
-installer.
-
-* http://opscode.com/chef/install
-
-You may need to install the `curl` package:
-
- sudo apt-get install curl
-
-## Create Configuration
-
-Create a configuration file for your remote target system. The default
-location per platform:
-
-* Unix/Linux: `/etc/chef/client.rb`
-* Windows: `C:\chef\client.rb`
-
-At a minimum, the configuration should include the Chef Server URI
-(`chef_server_url`), and the name of the validation API client
-(`validation_client_name`). Refer to your Knife configuration file for
-values of these settings. Also, set `node_name` to
-`"webserver.localdomain"`.
-
-## Use Validation Key
-
-Use the validation key for the Chef Server to automatically create the
-new API client. It should be copied to the same directory as the
-`client.rb` file, and the filename should be `validation.pem`.
-
-## Run Chef Client
-
-Run `chef-client` on the local system with debug logging, and send the
-output to a file. Use the output file, along with the command-line
-tools to answer the following questions.
-
-**Ubuntu**: You'll need to either su to root or use sudo to execute
-`chef-client`.
-
-## Questions
-
-What is the name of the node and client created on the Chef Server?
-What commands can be used to get these values?
-
-What are two ways to change the name of the node and client at
-`chef-client` run time?
-
-What are the platform and platform version of the node?
-
-Does the node have a run list?
-
-What is the IP address detected for the node? Is it the correct
-default IP address?
-
-Is the API client an admin?
-
-Does the validation key file still exist? Why?
-
-What kind of HTTP request is made to save the node? When does this
-occur?
View
72 guides/student-exercises/chef-node.md
@@ -1,72 +0,0 @@
-Chef Node
-======================
-
-## Objectives
-
-* View the node object on the Chef Server with knife
-* Create new attributes on the node with a cookbook and role.
-* Use node attributes in a conditional in the recipe.
-
-## Acceptance Criteria
-
-* Create attributes on the node with an attributes file.
-* Override the attributes with a role.
-* Answer questions about the node.
-
-## View Node Object
-
-Use the `knife node show` command with various options to show the
-target remote system's node object on the Chef Server.
-
-## Cookbook Attributes
-
-In the `webserver` cookbook, create a `default.rb` attributes file and
-set a `default` level node attribute, `node['webserver']['origin']`,
-with content like "This is from the cookbook attributes file."
-
-Upload the cookbook to the Chef Server and run Chef on your target
-system. Show the attribute from the node object on the Chef Server.
-
-## Role Attributes
-
-Add the `node['webserver']['origin']` attribute in the `webserver`
-role at the default level (`default_attributes`), with content like
-"This is from the role." Upload the role to the Chef server and run
-Chef on your target system. Show the attribute from the node object on
-the Chef Server.
-
-## Attributes in a Recipe
-
-Create a conditional based on the node's platform to output a log
-message with the `log` resource. Example syntax:
-
- if node['platform'] == "ubuntu"
- log "I'm on #{node['platform']}"
- end
-
-_Optional_ add the `node['webserver']['origin']` attribute in a recipe
-using a normal level attribute (`node.set`), with content like "This is from the
-recipe."
-
-## Questions
-
-What is your target remote system's node name? FQDN? Are they
-different?
-
-Show the node's ec2 attributes (`-a ec2`). Which one is used as the node name?
-
-What is the node's run list? Its environment?
-
-Use `-Fj` to display the node object as JSON. Are attributes from Ohai
-shown?
-
-What is the value of the `webserver.origin` attribute for the node on
-the Chef Server after first adding the attribute in the cookbook
-attributes file?
-
-What is the value of the `webserver.origin` attribute for the node on
-the Chef Server after adding the attribute in the role?
-
-(Optional) If you added the attribute in the recipe, what is the value
-of the `webserver.origin` attribute for the node on the Chef Server?
-How can the role be modified to override this value?
View
92 guides/student-exercises/cookbooks-recipes-resources.md
@@ -1,92 +0,0 @@
-Cookbooks, Recipes, and Resources
-======================
-
-## Objectives
-
-* Create a new cookbook
-* Write a simple recipe with two resources
-* Run Chef with the cookbook on a node
-
-## Acceptance Criteria
-
-* Directory `/var/www` is created and owned by www-data (Ubuntu) or
- apache (CentOS) user.
-* File `/var/www/index.html` is rendered from a template.
-* Answer the questions.
-
-## Webserver User
-
-**Ubuntu**
-
-If your target system is Ubuntu, the owner is `www-data`.
-
-**CentOS**
-
-If your target system is CentOS, the owner is `apache`.
-
-## Create webserver Cookbook
-
-Create a cookbok named `webserver` in the cookbooks directory. It
-should have a `default.rb` recipe that configures two resources:
-
-* The `/var/www` directory, which should be owned by the www-data
- or apache user.
-* An `index.html` file in `/var/www` rendered from a template, also
- owned by www-data or apache.
-
-The source template should contain information about the
-node from its attributes. Minimum:
-
-* Platform and Platform version (`node['platform']`,
- `node['platform_version']`)
-* Default IP address (`node['ipaddress']`)
-* Fully qualified domain name (`node['fqdn']`)
-* EC2 public IP address (`node['ec2']['public_ipv4']`) (if it is an
- EC2 node)
-* The node's run list (`node.run_list.to_s`)
-
-The file we're editing is HTML, but don't worry about HTML tags and
-formatting, you may wrap the text in `<pre>` / `</pre>`. For example:
-
- @@@html
- <pre>
- Platform: <%= node['platform'] %>
- Platform Version: <%= node['platform_version'] %>
- Default IP Address: <%= node['ipaddress'] %>
- Fully Qualified Domain Name: <%= node['fqdn'] %>
- Node's Run List: <%= node.run_list.to_s %>
- </pre>
-
-Create the `metadata.rb` file with the cookbook's initial version. Use
-any version number you like using the form X.Y.Z, e.g., "1.0.0" or
-"0.5.2".
-
-Upload the cookbook to the Chef Server.
-
-__Note__: We are not installing Apache HTTPD as part of this
- exercise. The `index.html` file can be viewed as plain text.
-
-## (Optional) Use a conditional for the user
-
-The owner of the directory and template can be set using a conditional
-based on the value of the `node['platform']` attribute so that it is
-`www-data` when the node's platform is `ubuntu` or `apache` when the
-node's platform is `centos`. As an optional exercise, you may do this
-in the recipe.
-
-## Apply webserver Cookbook to a node
-
-Add the `webserver` cookbook's default recipe to your existing node
-from the previous exercise using Knife. It should be the only node in
-`knife node list`.
-
-Log into the node and run `chef-client`. Turn debug logging on to see
-more information about the Chef run.
-
-## Questions
-
-What is the run list of the node?
-
-What resources were created on the node?
-
-What is the content of the file `/var/www/index.html`?
View
50 guides/student-exercises/data-bags.md
@@ -1,50 +0,0 @@
-Data Bags
-======================
-
-## Objectives
-
-* Create a data bag of users
-* Manage users on the system
-* Create a new data bag with information about an application to deploy
-
-## Acceptance Criteria
-
-* Example user(s) are created on the system in the sysadmin group
-* The example application code is described in a data bag and cloned on the system
-
-## Download Users Cookbook
-
-Download the `users` cookbook from the Chef Community site and extract it into the `cookbooks` directory. Add the `users::sysadmins` recipe to the `base` role's run list, as all the users should exist on every system.
-
-## Create a Users Data Bag
-
-Create a `data_bags` directory in the root of the `chef-repo`, then create a `users` directory that will hold the `users` data bag items.
-
-Create a new user data bag item. Replace USERNAME below with any username you'd like to use. The `ssh_keys` field must be present, but the value can be empty, or you can generate an SSH key pair.
-
- {
- "id": "USERNAME",
- "groups": "sysadmin",
- "comment": "USERNAME",
- "uid": 2003,
- "shell": "/bin/bash",
- "ssh_keys": "ssh-rsa SSH Public Key"
- }
-
-Save this as `data_bags/users/USERNAME.json` in the Chef Repository. Create the data bag on the Chef Server and upload the data bag item.
-
-## Questions
-
-How many users were created on the system?
-
-
-What are the results of using knife to search for users? (`knife search users "*:*"`)?
-
-
-Modify the data bag item .json file in your Chef Repository and remove a trailing comma. What happens when you try to upload the data bag item again? (be sure to fix this and add the comma back)
-
-
-Bonus: How could the data bag item and corresponding recipe be modified to account for deleting a user?
-
-
-Bonus: Attempt to create a new data bag item without creating the data bag first. What happens? What is the HTTP status code and why?
View
61 guides/student-exercises/example-cookbook.md
@@ -1,61 +0,0 @@
-Example Cookbook
-======================
-
-## Objectives
-
-* Download an existing cookbook
-* Explore the cookbook's contents
-* Upload cookbook to the Chef Server
-* Install and run Chef on a new system with the cookbook
-
-## Acceptance Criteria
-
-* `fail2ban` cookbook extracted in local repository
-* `fail2ban` cookbook uploaded to Chef Server
-* Target system has Chef installed
-* Target system has node and client objects in Chef Server
-* Target system applied `fail2ban` cookbook successfully
-* Answer the questions
-
-## Download fail2ban Cookbook
-
-Use knife to download the `fail2ban` cookbook from the Chef Community site. The downloaded file is a `.tar.gz` that should be extracted into the `cookbook_path` directory
-
-## Explore Cookbook
-
-After extracting the cookbook, examine the contents of the files it contains. This information will be used to answer questions.
-
-## Upload Cookbook
-
-Upload the cookbook to the Chef Server.
-
-## Install Chef on Target
-
-Your instructor will provide an IP address and login credentials for a target system. Log into that system and perform the following:
-
-* Install Chef (use the [full-stack installer](htp://opscode.com/chef/install))
-* Configure `chef-client` with the `client.rb` file.
-* Copy the validation certificate file to the configuration directory.
-
-## Run chef-client on Target
-
-Create a JSON file on the node to specify that `fail2ban` should be in the run list. Run `chef-client` using the JSON file with the `-j` option.
-
-## Questions
-
-What `knife` commands can be used to gather information about the cookbook from the Community Site?
-
-
-What version of the `fail2ban` cookbook was downloaded? What versions are available?
-
-
-How many recipes does the `fail2ban` cookbook have? What is its name?
-
-
-What entry goes in the node's run list to apply the `fail2ban` cookbook?
-
-
-What resources does the `fail2ban` cookbook configure on the node?
-
-
-Where did Chef cache the cookbook?
View
87 guides/student-exercises/getting-started.md
@@ -1,87 +0,0 @@
-Getting Started
-======================
-
-## Objectives
-
-* Install Ruby and Chef
-* Create an initial Chef Repository
-* Set up connectivity to Chef Server
-
-## Acceptance Criteria
-
-* Executables ruby, gem, chef-client, knife, ohai and shef are in the user PATH
-* An initial Chef Repository is created (optionally under version control).
-* Successful connection to the Chef Server can be made with `knife`.
-* Experiment with the commands to answer the questions.
-
-## Install Ruby and Chef
-
-If Ruby and Chef are not already installed on the local workstation,
-do so now. Use the Opscode Full Stack Installer:
-
-* http://www.opscode.com/chef/install
-
-Add the directory where the Ruby binary lives to your local user login
-shell PATH environment variable.
-
-* `/opt/opscode/embedded/bin` - Unix/Linux
-* `C:\Opscode\embedded\bin` - Windows
-
-## Create Chef Repository
-
-Create a directory named `chef-repo` in your home directory on the
-local workstation. It should have two sub-directories `.chef`, and
-`cookbooks`.
-
-__Note (Windows)__: Explorer cannot create a file starting with `.`,
-use `cmd.exe` or `powershell.exe`.
-
-### Optional:
-
-Make the Chef Repository version controlled. You may use Git,
-Subversion or any other version control system you wish.
-
-## Create Opscode Hosted Chef Account
-
-_This is only required if you're not using an internal Private Chef
-server for the exercises._
-
-Create a user account for Opscode Hosted Chef, then sign in and create
-an organization. Remember that the organization short name must be
-ASCII alpha-numeric, no spaces (dashes and underscores **are** allowed).
-
-* http://www.opscode.com/hosted-chef/ -> "Free Trial"
-
-## Access Chef Server
-
-Create the knife configuration file in the Chef Repository to connect
-to the Chef Server. Copy your user private key file and Chef Server
-validation key file to the same directory.
-
-Verify connectivity to the Chef Server for your user with knife on the
-local workstation.
-
- > knife client list
-
-Should list at least the validator client name for the organization.
-
-## Questions
-
-Where are Chef and Ruby binaries installed on the system?
-
-What version of Chef is installed? What command can be used to
-determine this?
-
-What version of Ruby is installed? What command can be used to
-determine this?
-
-What version of RubyGems is installed? What command can be used to
-determine this?
-
-What does `ohai` detect for the current system's `platform` and
-`platform_version`?
-
-What kinds of sub-commands are available to `knife`?
-
-Where are the Chef command manual pages available on the local system, and what
-formats are available?
View
30 guides/student-exercises/introduction-to-search.md
@@ -1,30 +0,0 @@
-Introduction to Search
-======================
-
-## Objectives
-
-* Understand how to use search with `knife` sub-commands (`search`, `ssh`, `status`)
-* Understand the difference between attribute fields in query vs selecting from knife.
-* Understand how to use search in a recipe.
-
-## Acceptance Criteria
-
-* Provide the `knife search` command used to obtain the answers.
-
-## Questions
-
-How many nodes are running Ubuntu?
-
-
-What is the run list of all the nodes? What option shows only the run list from node results?
-
-
-What is the node name of systems that are webservers?
-
-
-Do any roles have a recipe from the apache2 cookbook in their run list?
-
-
-Do any nodes have a recipe from the apache2 cookbook?
-
-
View
8 guides/student-exercises/lwrp-introduction.md
@@ -1,8 +0,0 @@
-Lwrp Introduction
-======================
-
-## Objectives
-
-## Acceptance Criteria
-
-## Questions
View
104 guides/student-exercises/more-cookbooks.md
@@ -1,104 +0,0 @@
-More Cookbooks
-======================
-
-## Objectives
-
-* Apply apt or yum, chef-client, and fail2ban recipes via a base role
-* Include the apache2 recipe in the webserver recipe
-* Download and examine the haproxy cookbook
-
-## Acceptance Criteria
-
-* "base" role is created with the apt or yum, chef-client and fail2ban
- recipes.
-* "base" role is applied to the remote target system.
-* Answer the questions
-
-## Download cookbooks
-
-Download the following cookbooks to the local repository and extract
-them in the `cookbooks` directory.
-
-* chef-client
-* fail2ban
-* apache2
-
-If your target system is Ubuntu, also download and extract the `apt`
-cookbook.
-
-If your target system is CentOS, also download and extract the `yum`
-cookbook.
-
-With a single knife command, upload all four cookbooks.
-
-## Create base role
-
-**Ubuntu**
-
-If your target system is Ubuntu, use `recipe[apt]`.
-
-**CentOS**
-
-If your target system is CentOS, use `recipe[yum::epel]`.
-
-**Role Run List**
-
-In the roles directory, create a `base.rb` for the base role. It
-should have a run list containing the `apt`, `fail2ban` and
-`chef-client` recipes.
-
- recipe[apt] OR recipe[yum::epel]
- recipe[fail2ban],
- recipe[chef-client]
-
-Be sure to use only apt OR yum:epel.
-
-## Add apache2 to webserver cookbook
-
-Use `include_recipe` in the `webserver` cookbook's default recipe to
-add the `apache2` default recipe.
-
-Update the `webserver` cookbook's `metadata.rb` file to depend on the
-`apache2` cookbook.
-
-## Update the roles
-
-Upload both the `base` and `webserver` roles to the Chef Server.
-
-## Add the base role
-
-Add the base role to be the first item in the remote target node's run list.
-
-Run `chef-client` on the remote target node.
-
-## Download haproxy cookbook
-
-Download and extract the haproxy cookbook to the `cookbooks`
-directory. Examine its contents but do not upload it to the Chef
-Server yet. Do not apply it to the node's run list, that will be done
-in the next exercise.
-
-## Questions
-
-What knife command was used to download the cookbooks from the Chef
-Community Site?
-
-What knife command was used to upload the cookbooks to the Chef
-Server?
-
-How many recipes are in the chef-client cookbook? Which one is used by
-the default recipe?
-
-How many recipes are in the apache2 cookbook? Are any of them used in
-the default recipe?
-
-Are dependencies required in the metadata for the chef-client or
-apache2 cookbook?
-
-Show the remote target node on the Chef Server with knife to answer
-the following questions.
-
-What values does it have for the `roles` and `recipes` attributes? Are
-they different from earlier exercises?
-
-What is in the node's attribute space for `apache` and `chef_client`?
View
103 guides/student-exercises/multiple-nodes-and-search.md
@@ -1,103 +0,0 @@
-Multiple Nodes And Search
-======================
-
-## Objectives
-
-* Add load balancer role with haproxy recipe
-* Bootstrap a new node with load balancer role
-* Use knife ssh to rerun chef client
-
-## Acceptance Criteria
-
-* Second instance bootstrapped with `knife bootstrap`.
-* Second instance running haproxy load balancing webserver.
-* Answer questions
-
-## Haproxy Cookbook
-
-Unless you did so in the previous exercise, download the `haproxy`
-cookbook from the Chef Community Site.
-
-We're going to use the `app_lb` recipe. Review the recipe, and the
-attributes. Upload the cookbook to the Chef Server.
-
-## Create Load Balancer Role
-
-Create a role `load_balancer.rb` in the roles directory. Use
-`recipe[haproxy::app_lb]` as the only item in the node's run list.
-
-The `haproxy` cookbook uses the attribute `member_port` to specify
-what port the web servers are listening to. Set this attribute in the
-role to "80".
-
-Upload the role to the Chef Server.
-
-## Knife bootstrap Second Target
-
-If Chef is not version 0.10.10 or higher, retrieve the chef-full
-bootstrap template and save it as `.chef/bootstrap/chef-full.erb` in
-your Chef Repository.
-
-https://raw.github.com/opscode/chef/master/chef/lib/chef/knife/bootstrap/chef-full.erb
-
-Your instructor will provide a second target system's IP address or
-you will use a second Virtual Machine. Use the `knife bootstrap`
-command to automatically set up the system with the `base` and
-`load_balancer` roles with Chef. When running the `knife bootstrap`
-command, specify the new system's node name with `-N NODENAME`, e.g.
-`-N load-balancer.localdomain`.
-
-Once complete, navigate to the public IP address of the load balancer
-system in your web browser on port 80. Then navigate to the same IP on
-port 22002.
-
-Use the `chef-full` distro bootstrap with knife bootstrap to set up
-the load balancer.
-
-The node's run list should contain: `role[base]` and
-`role[load_balancer]`. Base should be applied first.
-
-## Use Knife Search
-
-Use knife search to answer some of the questions below. Queries to use:
-
-* "role:webserver"
-* "role:base"
-* "platform:ubuntu"
-* "recipes:apt"
-* "role:load_balancer"
-
-## Knife SSH
-
-Use `knife ssh` to run `sudo chef-client` on all nodes with the role
-`base` applied directly to the run list.
-
-Use `knife ssh` to report the `uptime` of all nodes with the recipe
-`webserver` appearing anywhere in the run list (`recipes:webserver`).
-
-## Questions
-
-How does the `app_lb` recipe in the haproxy cookbook differ from the
-default recipe?
-
-How does the `haproxy::app_lb` recipe determine what nodes to search?
-Can it be modified? If so, where would that be done?
-
-How many nodes have HTTP traffic balanced by haproxy?
-
-What other attributes does the haproxy cookbook have?
-
-The haproxy cookbook has a `default` recipe. How does it differ from
-the `app_lb` recipe?
-
-How many nodes are running Ubuntu?
-
-What is the run list of all the nodes? What option shows only the run
-list from node results?
-
-What is the node name of systems that are webservers?
-
-Do any roles have a recipe from the apache2 cookbook in their run
-list?
-
-Do any nodes have a recipe from the apache2 cookbook?
View
38 guides/student-exercises/node-attributes.md
@@ -1,38 +0,0 @@
-Node Attributes
-======================
-
-## Objectives
-
-* Set attributes via cookbook or role
-* Understand the attribute priority between cookbook and role attributes
-
-## Acceptance Criteria
-
-* Attributes file in `webserver` cookbook
-* `default_attributes` entry in the `webserver` role
-* Node has a value for the `webserver.origin` attribute on Chef Server.
-
-## Cookbook Attributes
-
-In the `webserver` cookbook, create a `default.rb` attributes file and set a `default` level node attribute, `node['webserver']['origin']`, with content like "This is from the cookbook attributes file."
-
-Upload the cookbook to the Chef Server and run Chef on your target system. Show the attribute from the node object on the Chef Server.
-
-## Role Attributes
-
-Add the `node['webserver']['origin']` attribute in the `webserver` role at the default level, with content like "This is from the role." Upload the role to the Chef server and run Chef on your target system. Show the attribute from the node object on the Chef Server.
-
-## Optional: Recipe Attributes
-
-Optionally add the `node['webserver']['origin']` attribute in a recipe using a normal level attribute, with content like "This is from the recipe."
-
-## Questions
-
-What is the value of the `webserver.origin` attribute for the node on the Chef Server after first adding the attribute in the cookbook attributes file?
-
-
-What is the value of the `webserver.origin` attribute for the node on the Chef Server after adding the attribute in the role?
-
-(Optional) If you added the attribute in the recipe, what is the value of the `webserver.origin` attribute for the node on the Chef Server? How can the role be modified to override this value?
-
-
View
78 guides/student-exercises/resources-in-depth.md
@@ -1,78 +0,0 @@
-Resources In Depth
-======================
-
-## Objectives
-
-* Understand components of resources
-* Write resources into shef and observe the outcome
-
-## Acceptance Criteria
-
-* Answer the questions
-
-## Use Shef to write resources
-
-During the lecture, the instructor will provide examples that are used
-to interactively observe what happens in writing Chef resources. Use
-that information and explore on your own to answer the questions below.
-
-You can interact with a resource as a Ruby object by loading it with
-the `resources()` method. The syntax is:
-
- chef:recipe > my_resource = resources("type[name]")
-
-Parameters are methods that can be called with a value to set that
-parameter. For example,
-
- chef:recipe > my_resource.some_parameter "value"
-
-When called without a value, `shef` will return the current value of
-the parameter.
-
- chef:recipe > my_resource.some_parameter
- => "some-value"
-
-An action can be triggered immediately with the `run_action` method.
-
- chef:recipe > my_resource.run_action(:action)
-
-A full example:
-
- > shef
- chef > recipe
- chef:recipe > file "sample"
- chef:recipe > my_resource = resources("file[sample]")
- chef:recipe > my_resource.content "Example resource content"
- chef:recipe > my_resource.run_action(:create)
- INFO: file[sample] created file sample
- chef:recipe > IO.read("sample")
- => "Example resource content"
-
-(`IO.read` is a Ruby method to read in the content of a file)
-
-## Questions
-
-When creating a `file` resource, what are the allowed actions?
-
-What is the action for a `file` resource if it is not specified? A
-`package` resource?
-
-If Chef is run as a non-privileged user, what happens if a different
-`owner` is specified for any of the file resources?
-
-Resources entered into `shef`'s recipe context are not configured
-immediately. Use the recipe help option to determine the command to
-run Chef.
-
-Use the recipe help information to determine the command to list all
-the resources in the current session. What is it?
-
-Create a service resource. What actions are allowed? What is the
-default action?
-
-What does the service resource support by default? (supports
-parameter)
-
-In `shef`, create a `service[foo]` resource with no other
-parameters. If you run Chef, what is the current state of the service?
-How does Chef determine this?
View
45 guides/student-exercises/roles.md
@@ -1,45 +0,0 @@
-Roles
-======================
-
-## Objectives
-
-* Understand how to create roles with the Ruby DSL
-* Upload a role to the Chef Server with knife
-* Modify a node's run list directly with knife
-
-## Acceptance Criteria
-
-* Directory in Chef Repository for role Ruby DSL files
-* `webserver` role containing `webserver`
-* Target system's node uses the `webserver` role in its run list
-
-## Create Webserver Role
-
-Create a directory to store roles in the Chef Repository. It should be
-named `roles`. Create a role named `webserver` as a Ruby DSL file in the
-`roles` directory. Add the `webserver` cookbook to the role's run list.
-
-Upload the `webserver` role to the Chef Server.
-
-## Modify Node
-
-Use `knife` to remove the `webserver` recipe from the node's run list
-and add the `webserver` role.
-
-Re-run `chef-client` on the node.
-
-## Questions
-
-What are the required components of a role?
-
-How can the contents of the role on the Chef Server be displayed? What
-command-line option will show the JSON source?
-
-What `knife` command is used to display only the node's run list?
-
-When `chef-client` is run again on the node, what is the content of
-the `roles` attribute on the node object? What is the content of
-`recipes`? What is the run list?
-
-When `chef-client` is run again on the node, did it make any changes
-to the managed resources?
View
4 guides/student-exercises/troubleshooting.md
@@ -1,4 +0,0 @@
-Troubleshooting
-======================
-
-Opportunities to troubleshoot will present themselves throughout the course.
View
20 image-src/README.md
@@ -1,20 +0,0 @@
-This directory contains the non-binary source files for images used in
-the materials, usually but not limited to files stored in the
-`slides/images` directory.
-
-The following images in the directory are screen-captures taken and
-edited with Skitch for Mac OS X. There are no non-binary source files
-available.
-
-- 5-free-nodes.png
-- email-verified.png
-- free-trial.png
-- generate-knife-config.png
-- generate-validation-key.png
-- hosted-chef-signup.png
-- manage-console-user-login.png
-- next-steps.png
-- select-organizations.png
-- signup-about.png
-- user-get-private-key.png
-- working-with-chef.png
View
1,334 image-src/anatomy-of-chef-run.graffle
@@ -1,1334 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>ActiveLayerIndex</key>
- <integer>0</integer>
- <key>ApplicationVersion</key>
- <array>
- <string>com.omnigroup.OmniGraffle</string>
- <string>138.33.0.157554</string>
- </array>
- <key>AutoAdjust</key>
- <false/>
- <key>BackgroundGraphic</key>
- <dict>
- <key>Bounds</key>
- <string>{{0, 0}, {1152, 1466}}</string>
- <key>Class</key>
- <string>SolidGraphic</string>
- <key>ID</key>
- <integer>2</integer>
- <key>Style</key>
- <dict>
- <key>shadow</key>
- <dict>
- <key>Draws</key>
- <string>NO</string>
- </dict>
- <key>stroke</key>
- <dict>
- <key>Draws</key>
- <string>NO</string>
- </dict>
- </dict>
- </dict>
- <key>CanvasOrigin</key>
- <string>{0, 0}</string>
- <key>ColumnAlign</key>
- <integer>1</integer>
- <key>ColumnSpacing</key>
- <real>36</real>
- <key>CreationDate</key>
- <string>2011-03-11 16:31:00 +0000</string>
- <key>Creator</key>
- <string>Joshua Timberman</string>
- <key>DisplayScale</key>
- <string>1 0/72 in = 1.0000 in</string>
- <key>GraphDocumentVersion</key>
- <integer>8</integer>
- <key>GraphicsList</key>
- <array>
- <dict>
- <key>Bounds</key>
- <string>{{488, 667.75}, {66, 42}}</string>
- <key>Class</key>
- <string>ShapedGraphic</string>
- <key>FitText</key>
- <string>YES</string>
- <key>Flow</key>
- <string>Resize</string>
- <key>FontInfo</key>
- <dict>
- <key>Font</key>
- <string>Helvetica</string>
- <key>Size</key>
- <real>12</real>
- </dict>
- <key>ID</key>
- <integer>114</integer>
- <key>Shape</key>
- <string>Rectangle</string>
- <key>Style</key>
- <dict>
- <key>fill</key>
- <dict>
- <key>Draws</key>
- <string>NO</string>
- </dict>
- <key>shadow</key>
- <dict>
- <key>Draws</key>
- <string>NO</string>
- </dict>
- <key>stroke</key>
- <dict>
- <key>Draws</key>
- <string>NO</string>
- </dict>
- </dict>
- <key>Text</key>
- <dict>
- <key>Pad</key>
- <integer>0</integer>
- <key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\b\fs24 \cf0 Run\
-Notification\
-Handlers}</string>
- <key>VerticalPad</key>
- <integer>0</integer>
- </dict>
- <key>Wrap</key>
- <string>NO</string>
- </dict>
- <dict>
- <key>Bounds</key>
- <string>{{492.5, 546.375}, {57, 28}}</string>
- <key>Class</key>
- <string>ShapedGraphic</string>
- <key>FitText</key>
- <string>YES</string>
- <key>Flow</key>
- <string>Resize</string>
- <key>FontInfo</key>
- <dict>
- <key>Font</key>
- <string>Helvetica</string>
- <key>Size</key>
- <real>12</real>
- </dict>
- <key>ID</key>
- <integer>113</integer>
- <key>Shape</key>
- <string>Rectangle</string>
- <key>Style</key>
- <dict>
- <key>fill</key>
- <dict>
- <key>Draws</key>
- <string>NO</string>
- </dict>
- <key>shadow</key>
- <dict>
- <key>Draws</key>
- <string>NO</string>
- </dict>
- <key>stroke</key>
- <dict>
- <key>Draws</key>
- <string>NO</string>
- </dict>
- </dict>
- <key>Text</key>
- <dict>
- <key>Pad</key>
- <integer>0</integer>
- <key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\b\fs24 \cf0 Configure\
-Node}</string>
- <key>VerticalPad</key>
- <integer>0</integer>
- </dict>
- <key>Wrap</key>
- <string>NO</string>
- </dict>
- <dict>
- <key>Bounds</key>
- <string>{{491.5, 387}, {59, 42}}</string>
- <key>Class</key>
- <string>ShapedGraphic</string>
- <key>FitText</key>
- <string>YES</string>
- <key>Flow</key>
- <string>Resize</string>
- <key>FontInfo</key>
- <dict>
- <key>Font</key>
- <string>Helvetica</string>
- <key>Size</key>
- <real>12</real>
- </dict>
- <key>ID</key>
- <integer>112</integer>
- <key>Shape</key>
- <string>Rectangle</string>
- <key>Style</key>
- <dict>
- <key>fill</key>
- <dict>
- <key>Draws</key>
- <string>NO</string>
- </dict>
- <key>shadow</key>
- <dict>
- <key>Draws</key>
- <string>NO</string>
- </dict>
- <key>stroke</key>
- <dict>
- <key>Draws</key>
- <string>NO</string>
- </dict>
- </dict>
- <key>Text</key>
- <dict>
- <key>Pad</key>
- <integer>0</integer>
- <key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\b\fs24 \cf0 Compile \
-Resource\
-Collection}</string>
- <key>VerticalPad</key>
- <integer>0</integer>
- </dict>
- <key>Wrap</key>
- <string>NO</string>
- </dict>
- <dict>
- <key>Bounds</key>
- <string>{{485, 241.625}, {72, 28}}</string>
- <key>Class</key>
- <string>ShapedGraphic</string>
- <key>FitText</key>
- <string>YES</string>
- <key>Flow</key>
- <string>Resize</string>
- <key>FontInfo</key>
- <dict>
- <key>Font</key>
- <string>Helvetica</string>
- <key>Size</key>
- <real>12</real>
- </dict>
- <key>ID</key>
- <integer>111</integer>
- <key>Shape</key>
- <string>Rectangle</string>
- <key>Style</key>
- <dict>
- <key>fill</key>
- <dict>
- <key>Draws</key>
- <string>NO</string>
- </dict>
- <key>shadow</key>
- <dict>
- <key>Draws</key>
- <string>NO</string>
- </dict>
- <key>stroke</key>
- <dict>
- <key>Draws</key>
- <string>NO</string>
- </dict>
- </dict>
- <key>Text</key>
- <dict>
- <key>Pad</key>
- <integer>0</integer>
- <key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\b\fs24 \cf0 Synchronize\
-Cookbooks}</string>
- <key>VerticalPad</key>
- <integer>0</integer>
- </dict>
- <key>Wrap</key>
- <string>NO</string>
- </dict>
- <dict>
- <key>Bounds</key>
- <string>{{484.5, 99.25}, {73, 56}}</string>
- <key>Class</key>
- <string>ShapedGraphic</string>
- <key>FitText</key>
- <string>YES</string>
- <key>Flow</key>
- <string>Resize</string>
- <key>ID</key>
- <integer>110</integer>
- <key>Shape</key>
- <string>Rectangle</string>
- <key>Style</key>
- <dict>
- <key>fill</key>
- <dict>
- <key>Draws</key>
- <string>NO</string>
- </dict>
- <key>shadow</key>
- <dict>
- <key>Draws</key>
- <string>NO</string>
- </dict>
- <key>stroke</key>
- <dict>
- <key>Draws</key>
- <string>NO</string>
- </dict>
- </dict>
- <key>Text</key>
- <dict>
- <key>Pad</key>
- <integer>0</integer>
- <key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\b\fs24 \cf0 Build,\
-Register,\
-Authenticate\
-the Node}</string>
- <key>VerticalPad</key>
- <integer>0</integer>
- </dict>
- <key>Wrap</key>
- <string>NO</string>
- </dict>
- <dict>
- <key>Class</key>
- <string>LineGraphic</string>
- <key>Head</key>
- <dict>
- <key>ID</key>
- <integer>91</integer>
- </dict>
- <key>ID</key>
- <integer>109</integer>
- <key>Points</key>
- <array>
- <string>{236.75, 738.75}</string>
- <string>{236.75, 767.125}</string>
- </array>
- <key>Style</key>
- <dict>
- <key>stroke</key>
- <dict>
- <key>HeadArrow</key>
- <string>FilledArrow</string>
- <key>TailArrow</key>
- <string>0</string>
- </dict>
- </dict>
- <key>Tail</key>
- <dict>
- <key>ID</key>
- <integer>106</integer>
- </dict>
- </dict>
- <dict>
- <key>Class</key>
- <string>LineGraphic</string>
- <key>Head</key>
- <dict>
- <key>ID</key>
- <integer>106</integer>
- </dict>
- <key>ID</key>
- <integer>108</integer>
- <key>Points</key>
- <array>
- <string>{236.75, 610.375}</string>
- <string>{236.75, 638.75}</string>
- </array>
- <key>Style</key>
- <dict>
- <key>stroke</key>
- <dict>
- <key>HeadArrow</key>
- <string>FilledArrow</string>
- <key>TailArrow</key>
- <string>0</string>
- </dict>
- </dict>
- <key>Tail</key>
- <dict>
- <key>ID</key>
- <integer>92</integer>
- </dict>
- </dict>
- <dict>
- <key>Bounds</key>
- <string>{{89.75, 670.75}, {294, 36}}</string>
- <key>Class</key>
- <string>ShapedGraphic</string>
- <key>ID</key>
- <integer>107</integer>
- <key>Shape</key>
- <string>Rectangle</string>
- <key>Text</key>
- <dict>
- <key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Run Notification Handlers}</string>
- </dict>
- </dict>
- <dict>
- <key>Bounds</key>
- <string>{{21, 639.25}, {431.5, 99}}</string>
- <key>Class</key>
- <string>ShapedGraphic</string>
- <key>ID</key>
- <integer>106</integer>
- <key>Shape</key>
- <string>Rectangle</string>
- <key>Style</key>
- <dict>
- <key>fill</key>
- <dict>
- <key>Color</key>
- <dict>
- <key>b</key>
- <string>1</string>
- <key>g</key>
- <string>0.972549</string>
- <key>r</key>
- <string>0.972549</string>
- </dict>
- </dict>
- </dict>
- </dict>
- <dict>
- <key>Class</key>
- <string>LineGraphic</string>
- <key>Head</key>
- <dict>
- <key>ID</key>
- <integer>88</integer>
- </dict>
- <key>ID</key>
- <integer>105</integer>
- <key>Points</key>
- <array>
- <string>{181.75, 438}</string>
- <string>{138.25, 438}</string>
- </array>
- <key>Style</key>
- <dict>
- <key>stroke</key>
- <dict>
- <key>HeadArrow</key>
- <string>FilledArrow</string>
- <key>TailArrow</key>
- <string>0</string>
- </dict>
- </dict>
- <key>Tail</key>
- <dict>
- <key>ID</key>
- <integer>89</integer>
- </dict>
- </dict>
- <dict>
- <key>Class</key>
- <string>LineGraphic</string>
- <key>Head</key>
- <dict>
- <key>ID</key>
- <integer>89</integer>
- </dict>
- <key>ID</key>
- <integer>104</integer>
- <key>Points</key>
- <array>
- <string>{335.25, 438}</string>
- <string>{286.75, 438}</string>
- </array>
- <key>Style</key>
- <dict>
- <key>stroke</key>
- <dict>
- <key>HeadArrow</key>
- <string>FilledArrow</string>
- <key>TailArrow</key>
- <string>0</string>
- </dict>
- </dict>
- <key>Tail</key>
- <dict>
- <key>ID</key>
- <integer>90</integer>
- </dict>
- </dict>
- <dict>
- <key>Class</key>
- <string>LineGraphic</string>
- <key>Head</key>
- <dict>
- <key>ID</key>
- <integer>90</integer>
- </dict>
- <key>ID</key>
- <integer>103</integer>
- <key>Points</key>
- <array>
- <string>{387.75, 393.5}</string>
- <string>{387.75, 419.5}</string>
- </array>
- <key>Style</key>
- <dict>
- <key>stroke</key>
- <dict>
- <key>HeadArrow</key>
- <string>FilledArrow</string>
- <key>TailArrow</key>
- <string>0</string>
- </dict>
- </dict>
- <key>Tail</key>
- <dict>
- <key>ID</key>
- <integer>87</integer>
- </dict>
- </dict>
- <dict>
- <key>Class</key>
- <string>LineGraphic</string>
- <key>Head</key>
- <dict>
- <key>ID</key>
- <integer>87</integer>
- </dict>
- <key>ID</key>
- <integer>102</integer>
- <key>Points</key>
- <array>
- <string>{286.75, 375}</string>
- <string>{335.25, 375}</string>
- </array>
- <key>Style</key>
- <dict>
- <key>stroke</key>
- <dict>
- <key>HeadArrow</key>
- <string>FilledArrow</string>
- <key>TailArrow</key>
- <string>0</string>
- </dict>
- </dict>
- <key>Tail</key>
- <dict>
- <key>ID</key>
- <integer>86</integer>
- </dict>
- </dict>
- <dict>
- <key>Class</key>
- <string>LineGraphic</string>
- <key>Head</key>
- <dict>
- <key>ID</key>
- <integer>86</integer>
- </dict>
- <key>ID</key>
- <integer>101</integer>
- <key>Points</key>
- <array>
- <string>{138.25, 375}</string>
- <string>{181.75, 375}</string>
- </array>
- <key>Style</key>
- <dict>
- <key>stroke</key>
- <dict>
- <key>HeadArrow</key>
- <string>FilledArrow</string>
- <key>TailArrow</key>
- <string>0</string>
- </dict>
- </dict>
- <key>Tail</key>
- <dict>
- <key>ID</key>
- <integer>85</integer>
- </dict>
- </dict>
- <dict>
- <key>Class</key>
- <string>LineGraphic</string>
- <key>Head</key>
- <dict>
- <key>ID</key>
- <integer>92</integer>
- </dict>
- <key>ID</key>
- <integer>100</integer>
- <key>Points</key>
- <array>
- <string>{236.75, 482}</string>
- <string>{236.75, 510.375}</string>
- </array>
- <key>Style</key>
- <dict>
- <key>stroke</key>
- <dict>
- <key>HeadArrow</key>
- <string>FilledArrow</string>
- <key>TailArrow</key>
- <string>0</string>
- </dict>
- </dict>
- <key>Tail</key>
- <dict>
- <key>ID</key>
- <integer>84</integer>
- </dict>
- </dict>
- <dict>
- <key>Class</key>
- <string>LineGraphic</string>
- <key>Head</key>
- <dict>
- <key>ID</key>
- <integer>84</integer>
- </dict>
- <key>ID</key>
- <integer>99</integer>
- <key>Points</key>
- <array>
- <string>{236.75, 305.625}</string>
- <string>{236.75, 334}</string>
- </array>
- <key>Style</key>
- <dict>
- <key>stroke</key>
- <dict>
- <key>HeadArrow</key>
- <string>FilledArrow</string>
- <key>TailArrow</key>
- <string>0</string>
- </dict>
- </dict>
- <key>Tail</key>
- <dict>
- <key>ID</key>
- <integer>82</integer>
- </dict>
- </dict>
- <dict>
- <key>Class</key>
- <string>LineGraphic</string>
- <key>Head</key>
- <dict>
- <key>ID</key>
- <integer>82</integer>
- </dict>
- <key>ID</key>
- <integer>98</integer>
- <key>Points</key>
- <array>
- <string>{236.75, 177.25}</string>
- <string>{236.75, 205.625}</string>
- </array>
- <key>Style</key>
- <dict>
- <key>stroke</key>
- <dict>
- <key>HeadArrow</key>
- <string>FilledArrow</string>
- <key>TailArrow</key>
- <string>0</string>
- </dict>
- </dict>
- <key>Tail</key>
- <dict>
- <key>ID</key>
- <integer>78</integer>
- </dict>
- </dict>
- <dict>
- <key>Class</key>
- <string>LineGraphic</string>
- <key>Head</key>
- <dict>
- <key>ID</key>
- <integer>78</integer>
- </dict>
- <key>ID</key>
- <integer>97</integer>
- <key>Points</key>
- <array>
- <string>{236.75, 48.875008}</string>
- <string>{236.75, 77.25}</string>
- </array>
- <key>Style</key>
- <dict>
- <key>stroke</key>
- <dict>
- <key>HeadArrow</key>
- <string>FilledArrow</string>
- <key>TailArrow</key>
- <string>0</string>
- </dict>
- </dict>
- <key>Tail</key>
- <dict>
- <key>ID</key>
- <integer>77</integer>
- </dict>
- </dict>
- <dict>
- <key>Class</key>
- <string>LineGraphic</string>
- <key>Head</key>
- <dict>
- <key>ID</key>
- <integer>81</integer>
- </dict>
- <key>ID</key>
- <integer>96</integer>
- <key>Points</key>
- <array>
- <string>{285.53888, 127.25}</string>
- <string>{326.18304, 127.25}</string>
- </array>
- <key>Style</key>
- <dict>
- <key>stroke</key>
- <dict>
- <key>HeadArrow</key>
- <string>FilledArrow</string>
- <key>TailArrow</key>
- <string>0</string>
- </dict>
- </dict>
- <key>Tail</key>
- <dict>
- <key>ID</key>
- <integer>80</integer>
- </dict>
- </dict>
- <dict>
- <key>Class</key>
- <string>LineGraphic</string>
- <key>Head</key>
- <dict>
- <key>ID</key>
- <integer>80</integer>
- </dict>
- <key>ID</key>
- <integer>95</integer>
- <key>Points</key>
- <array>
- <string>{151.74751, 127.25}</string>
- <string>{192.39101, 127.25}</string>
- </array>
- <key>Style</key>
- <dict>
- <key>stroke</key>
- <dict>
- <key>HeadArrow</key>
- <string>FilledArrow</string>
- <key>TailArrow</key>
- <string>0</string>
- </dict>
- </dict>
- <key>Tail</key>
- <dict>
- <key>ID</key>
- <integer>79</integer>
- </dict>
- </dict>
- <dict>
- <key>Bounds</key>
- <string>{{260.89499, 542.375}, {92.147797, 36}}</string>
- <key>Class</key>
- <string>ShapedGraphic</string>
- <key>ID</key>
- <integer>94</integer>
- <key>Magnets</key>
- <array>
- <string>{0, 1}</string>
- <string>{0, -1}</string>
- <string>{1, 0}</string>
- <string>{-1, 0}</string>
- </array>
- <key>Shape</key>
- <string>Parallelogram</string>
- <key>Style</key>
- <dict/>
- <key>Text</key>
- <dict>
- <key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc
-
-\f0\fs20 \cf0 Save Node}</string>
- <key>VerticalPad</key>
- <integer>0</integer>
- </dict>
- </dict>
- <dict>
- <key>Bounds</key>
- <string>{{124.888, 542.375}, {92.147797, 36}}</string>
- <key>Class</key>
- <string>ShapedGraphic</string>
- <key>ID</key>
- <integer>93</integer>
- <key>Shape</key>
- <string>Rectangle</string>
- <key>Text</key>
- <dict>
- <key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Converge}</string>
- </dict>
- </dict>
- <dict>
- <key>Bounds</key>
- <string>{{21, 510.875}, {431.5, 99}}</string>
- <key>Class</key>
- <string>ShapedGraphic</string>
- <key>ID</key>
- <integer>92</integer>
- <key>Shape</key>
- <string>Rectangle</string>
- <key>Style</key>
- <dict>
- <key>fill</key>
- <dict>
- <key>Color</key>
- <dict>
- <key>b</key>
- <string>1</string>
- <key>g</key>
- <string>1</string>
- <key>r</key>
- <string>0.941176</string>
- </dict>
- </dict>
- </dict>
- </dict>
- <dict>
- <key>Bounds</key>
- <string>{{184.75, 767.625}, {104, 36}}</string>
- <key>Class</key>
- <string>ShapedGraphic</string>
- <key>ID</key>
- <integer>91</integer>
- <key>Shape</key>
- <string>RoundRect</string>
- <key>Style</key>
- <dict/>
- <key>Text</key>
- <dict>
- <key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Chef Client Ends}</string>
- <key>VerticalPad</key>
- <integer>0</integer>
- </dict>
- </dict>
- <dict>
- <key>Bounds</key>
- <string>{{335.75, 420}, {104, 36}}</string>
- <key>Class</key>
- <string>ShapedGraphic</string>
- <key>ID</key>
- <integer>90</integer>
- <key>Shape</key>
- <string>Rectangle</string>
- <key>Text</key>
- <dict>
- <key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Load Attributes}</string>
- </dict>
- </dict>
- <dict>
- <key>Bounds</key>
- <string>{{182.25, 420}, {104, 36}}</string>
- <key>Class</key>
- <string>ShapedGraphic</string>
- <key>ID</key>
- <integer>89</integer>
- <key>Shape</key>
- <string>Rectangle</string>
- <key>Text</key>
- <dict>
- <key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Load Definitions}</string>
- </dict>
- </dict>
- <dict>
- <key>Bounds</key>
- <string>{{33.75, 420}, {104, 36}}</string>
- <key>Class</key>
- <string>ShapedGraphic</string>
- <key>ID</key>
- <integer>88</integer>
- <key>Shape</key>
- <string>Rectangle</string>
- <key>Text</key>
- <dict>
- <key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Load Recipes}</string>
- </dict>
- </dict>
- <dict>
- <key>Bounds</key>
- <string>{{335.75, 357}, {104, 36}}</string>
- <key>Class</key>
- <string>ShapedGraphic</string>
- <key>ID</key>
- <integer>87</integer>
- <key>Shape</key>
- <string>Rectangle</string>
- <key>Text</key>
- <dict>
- <key>Text</key>
- <string>{\rtf1\ansi\ansicpg1252\cocoartf1138\cocoasubrtf230
-{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
-{\colortbl;\red255\green255\blue255;}
-\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
-
-\f0\fs24 \cf0 Load Resources}</string>
- </dict>