SlideShare ist ein Scribd-Unternehmen logo
1 von 103
Downloaden Sie, um offline zu lesen
Crafting Reusable Cookbooks
Ian Henry
Jennifer Davis (remote)
Network Name: ChefConf
Access Code: ChefConf2016
✨ Crafting Reusable Cookbooks #chefconf✨ 1
Instructor
4 Ian Henry
✨ Crafting Reusable Cookbooks #chefconf✨ 2
TA's
4 Robb Kidd
4 Matt Stratton
4 David Echols
4 Stephen Lauck
4 Bill Meyer
✨ Crafting Reusable Cookbooks #chefconf✨ 3
Communication
4 Jennifer Davis Twitter: @sig je
4 Ian Henry Twitter: @Eeyun___
Hashtag: #chefconf
✨ Crafting Reusable Cookbooks #chefconf✨ 4
Feedback
4 Constructive feedback
4 What did you find helpful?
4 What would you like to see more/less of?
4 Was there anything you found unclear?
✨ Crafting Reusable Cookbooks #chefconf✨ 5
Why are we here?
✨ Crafting Reusable Cookbooks #chefconf✨ 6
Expectations
4 Code of Conduct
4 Safe space to share experiences, learn from each
other.
4 Learn effective patterns for developing reusable
cookbooks.
✨ Crafting Reusable Cookbooks #chefconf✨ 7
Agenda
✨ Crafting Reusable Cookbooks #chefconf✨ 8
Collaboration
Individuals working together with shared interactions
and input, building towards a common goal.
✨ Crafting Reusable Cookbooks #chefconf✨ 9
Collaboration
4 Multiple types of collaboration
4 Monitoring for single points of failure
4 Monitoring burnout
✨ Crafting Reusable Cookbooks #chefconf✨ 10
Smarter Teams
build better value
✨ Crafting Reusable Cookbooks #chefconf✨ 11
Tools
Accelerators of culture that if used effectively can
enhance and support a culture of collaboration and
affinity.
✨ Crafting Reusable Cookbooks #chefconf✨ 12
Team
4 Common purpose
4 Defined beliefs
4 Empowered
✨ Crafting Reusable Cookbooks #chefconf✨ 13
Diversity in Teams
4 Professional
4 Personal
4 Goals
4 Cognitive Styles
✨ Crafting Reusable Cookbooks #chefconf✨ 14
Critical Habits for Teams
4 Code Review
4 Pairing
✨ Crafting Reusable Cookbooks #chefconf✨ 15
Code Review
4 Max 90 minutes in one setting
✨ Crafting Reusable Cookbooks #chefconf✨ 16
Pairing
4 Agile software development
4 2 people work together on 1 workstation
4 Driver - writes code
4 Observer - reviews each line
4 Roles switch frequently
✨ Crafting Reusable Cookbooks #chefconf✨ 17
Types of Pairing
4 Expert-expert
4 Expert-novice
4 Novice-novice
✨ Crafting Reusable Cookbooks #chefconf✨ 18
Team Activity 1
4 Meet your team!
4 What are motivations?
4 What are objectives?
4 Skills? Gaps in skills?
4 git, chef, docker, continuous integration,
continuous delivery
If you haven't filled out the skills assessment please do✨ Crafting Reusable Cookbooks #chefconf✨ 19
Local Development Environment (LDE)
4 Consistent set of tools across the team
4 Ability to quickly onboard new engineers
✨ Crafting Reusable Cookbooks #chefconf✨ 20
Team Activity 2
4 Share with your team:
4 Do you have a team common local development
environment?
4 What current tools are you using in chef
development?
Time: 10 minutes
✨ Crafting Reusable Cookbooks #chefconf✨ 21
Provisioned Node - LDE
4 AWS instance node
4 Chef DK
4 Test Kitchen
4 Ruby
4 ChefSpec, ServerSpec
4 Git
✨ Crafting Reusable Cookbooks #chefconf✨ 22
Introduction to Lab 1
4 Log into node and configure git
4 Create GitHub identity if you don't have one
already.
4 Set up GitHub keys.
4 Share team tools from Activity 2.
✨ Crafting Reusable Cookbooks #chefconf✨ 23
Lab 1
Time: 30 minutes
✨ Crafting Reusable Cookbooks #chefconf✨ 24
Supermarket
4 Community site with a number of cookbooks
Class Supermarket: https://
supermarket.reusablechef.com
✨ Crafting Reusable Cookbooks #chefconf✨ 25
Chef DK
4 Chef development kit
4 Includes a number of utilities and software to
facilitate cookbook creation
4 Free download off of the website
✨ Crafting Reusable Cookbooks #chefconf✨ 26
Berkshelf
4 Dependency management
4 Included with Chef DK
✨ Crafting Reusable Cookbooks #chefconf✨ 27
Test Kitchen
4 Included with Chef DK
4 Test harness
4 Sandbox automation
✨ Crafting Reusable Cookbooks #chefconf✨ 28
.kitchen.yml
4 driver
4 provisioner
4 platforms
4 suites
✨ Crafting Reusable Cookbooks #chefconf✨ 29
.kitchen.yml driver
4 virtualization or cloud provider
Example: vagrant, docker
✨ Crafting Reusable Cookbooks #chefconf✨ 30
.kitchen.yml provisioner
4 application to configure the node
Example: chef_zero
✨ Crafting Reusable Cookbooks #chefconf✨ 31
.kitchen.yml platforms
4 target operating systems
Example: centos-6.5
✨ Crafting Reusable Cookbooks #chefconf✨ 32
.kitchen.yml suites
4 target configurations
Example:
name:default
run_list:
- recipe[apache::default]
attributes:
✨ Crafting Reusable Cookbooks #chefconf✨ 33
Introduction to Lab 2
4 Create cookbook
Lab 2
✨ Crafting Reusable Cookbooks #chefconf✨ 34
Lab 2
Time: 20 minutes
✨ Crafting Reusable Cookbooks #chefconf✨ 35
Runbook to Recipes
✨ Crafting Reusable Cookbooks #chefconf✨ 36
Introducing MongoDB
✨ Crafting Reusable Cookbooks #chefconf✨ 37
MongoDB terminology
4 document - basic unit of data for MongoDB, ordered
set of keys with associated values
4 collection - group of documents. analogous to table.
4 instance - MongoDB can host multiple independent
databases, each of which can have its own
collections.
✨ Crafting Reusable Cookbooks #chefconf✨ 38
MongoDB Shell
4 mongo
full featured JavaScript interpreter
✨ Crafting Reusable Cookbooks #chefconf✨ 39
Introduction to Lab 3
Translate a runbook for installing MongoDB into chef.
[Lab 3]https://github.com/iennae/crc-training/blob/
master/labs/lab_3.md)
✨ Crafting Reusable Cookbooks #chefconf✨ 40
Lab 3
Time: 20 minutes
✨ Crafting Reusable Cookbooks #chefconf✨ 41
Quality Cookbooks
✨ Crafting Reusable Cookbooks #chefconf✨ 42
Iterative
✨ Crafting Reusable Cookbooks #chefconf✨ 43
Issue Management
4 Should be clear where to file bugs, request features.
4 Should be regularly groomed
✨ Crafting Reusable Cookbooks #chefconf✨ 44
Clear and Specific Licensing
For reusable cookbooks across the community
4 Apache 2.0
4 GNU Public License 2.0
4 GNU Public License 3.0
4 MIT
✨ Crafting Reusable Cookbooks #chefconf✨ 45
Multiple Collaborators
4 More than 1 person with the ability to release new
cookbooks
4 More than 1 person with ability to merge pull
requests
✨ Crafting Reusable Cookbooks #chefconf✨ 46
Test Everything
4 Use integration tests
4 Assert the state of the converged node to ensure
it's in the desired state
✨ Crafting Reusable Cookbooks #chefconf✨ 47
Foodcritic and Rubocop
4 Chef and Ruby linters pass cleanly
✨ Crafting Reusable Cookbooks #chefconf✨ 48
Multiple Platforms
4 As applicable, supports multiple platforms
✨ Crafting Reusable Cookbooks #chefconf✨ 49
Documentation
4 Clear and specific
4 Includes contributing guidelines
✨ Crafting Reusable Cookbooks #chefconf✨ 50
No binaries
4 Binaries should be stored in signed artifact
repositories separate from the cookbook
✨ Crafting Reusable Cookbooks #chefconf✨ 51
Existence of a test
cookbook
✨ Crafting Reusable Cookbooks #chefconf✨ 52
No duplication of code
✨ Crafting Reusable Cookbooks #chefconf✨ 53
Valid kitchen configuration
4 Ability for others to replicate and test cookbook
easily
✨ Crafting Reusable Cookbooks #chefconf✨ 54
Custom Resources over Attributes
4 Attribute driven
4 Resources
✨ Crafting Reusable Cookbooks #chefconf✨ 55
Custom Matchers when using Custom
Resources
Example: https://github.com/chef-cookbooks/tomcat/
blob/master/libraries/matchers.rb
✨ Crafting Reusable Cookbooks #chefconf✨ 56
Build Cookbooks for
Wrapping
✨ Crafting Reusable Cookbooks #chefconf✨ 57
Support the 95% use case
✨ Crafting Reusable Cookbooks #chefconf✨ 58
History of Customizing Chef
4 Attributes
4 Definitions
4 LWRP and HWRP
4 Custom Resources
✨ Crafting Reusable Cookbooks #chefconf✨ 59
Custom Resources
4 As of 12.5
4 compat_resource to bring custom resources to 12+
✨ Crafting Reusable Cookbooks #chefconf✨ 60
Introduction to Lab 4
Translate our MongoDB cookbook from recipes into
resources.
Lab 4
✨ Crafting Reusable Cookbooks #chefconf✨ 61
Lab 4
Time: 30 minutes
✨ Crafting Reusable Cookbooks #chefconf✨ 62
Managing Risk
4 Test
4 Small frequent releases
✨ Crafting Reusable Cookbooks #chefconf✨ 63
Linting
4 Ensure code adheres to styles and conventions
4 Weave expectations into development
4 Encourages collaboration
✨ Crafting Reusable Cookbooks #chefconf✨ 64
Testing
4 Documenting objectives and intent
4 Measuring "done"
✨ Crafting Reusable Cookbooks #chefconf✨ 65
Code Correctness
4 foodcritic
4 rubocop
✨ Crafting Reusable Cookbooks #chefconf✨ 66
Integration Tests
4 ServerSpec
4 InSpec
✨ Crafting Reusable Cookbooks #chefconf✨ 67
Rubocop
4 Ruby linter
4 Analyzes source code to verify the syntax and
structure of our cookbooks.
4 Ruby style guide
4 Included with ChefDK
✨ Crafting Reusable Cookbooks #chefconf✨ 68
Why
4 identify simple errors early
4 improve the review process by eliminating stylistic
issues
✨ Crafting Reusable Cookbooks #chefconf✨ 69
Rubocop Example
$ rubocop cookbooks/COOKBOOK1 cookbooks/COOKBOOK2 cookbooks/COOKBOOK4
✨ Crafting Reusable Cookbooks #chefconf✨ 70
Reading Rubocop Output
Inspecting 8 files
CWCWCCCC
4 . means that the file contains no issues
4 C means a issue with convention
4 W means a warning
4 E means an error
4 F means an fatal error
✨ Crafting Reusable Cookbooks #chefconf✨ 71
Rubocop Cops
4 Lint
4 Rails
4 Style
Example: rubocop --lint.
✨ Crafting Reusable Cookbooks #chefconf✨ 72
Disabling Rubocop cops
Any configuration in .rubocop.yml is disabled.
To disable string literals:
StringLiterals:
Enabled: false
✨ Crafting Reusable Cookbooks #chefconf✨ 73
Foodcritic
4 Chef linter
4 Chef style guide
4 Included with ChefDK
✨ Crafting Reusable Cookbooks #chefconf✨ 74
Foodcritic Example
$ foodcritic cookbooks/setup
✨ Crafting Reusable Cookbooks #chefconf✨ 75
Reading Foodcritic Output
FC008: Generated cookbook metadata needs updating: ./metadata.rb:2
✨ Crafting Reusable Cookbooks #chefconf✨ 76
ServerSpec
4 Tests to verify servers functionality
4 Resource types
4 Package, service, user, and many others
4 Integrates with Test Kitchen
4 http://serverspec.org
✨ Crafting Reusable Cookbooks #chefconf✨ 77
ServerSpec Generic Form
describe "<subject>" do
it "<description>" do
expect(thing).to eq result
end
end
✨ Crafting Reusable Cookbooks #chefconf✨ 78
ServerSpec Potential Tests
4 Is the service running?
4 Is the port accessible?
4 Is the expected content being served?
✨ Crafting Reusable Cookbooks #chefconf✨ 79
ServerSpec Example
describe 'apache' do
it "is installed" do
expect(package 'httpd').to be_installed
end
it "is running" do
expect(service 'httpd').to be_running
end
end
✨ Crafting Reusable Cookbooks #chefconf✨ 80
Reading ServerSpec Output
app::default
httpd service is running
Finished in 0.26429 seconds (files took 0.7166 seconds to load)
1 example, 0 failures
✨ Crafting Reusable Cookbooks #chefconf✨ 81
InSpec
4 infrastructure specification
4 open-source testing framework for infrastructure
4 human and machine readable
4 compliance, security, and policy requirements
4 Based off of ServerSpec
✨ Crafting Reusable Cookbooks #chefconf✨ 82
InSpec Example
describe service 'ssh-agent' do
it { should be_running }
end
✨ Crafting Reusable Cookbooks #chefconf✨ 83
InSpec Example Run
$ inspec exec test.rb
.
Finished in 0.00901 seconds (files took 0.98501 seconds to load)
1 example, 0 failures
✨ Crafting Reusable Cookbooks #chefconf✨ 84
InSpec Remote Run
$ inspec exec test.rb -i ~/.aws/YOUR.pem -t ssh://ec2-user@54.152.7.203
✨ Crafting Reusable Cookbooks #chefconf✨ 85
InSpec Remote Run on Windows
$ inspec exec test.rb -t winrm://Admin@192.168.1.2 --password super
✨ Crafting Reusable Cookbooks #chefconf✨ 86
InSpec Docker Containers
$ inspec exec test.rb -t docker://3dda08e75838
✨ Crafting Reusable Cookbooks #chefconf✨ 87
More info on InSpec
https://github.com/chef/inspec/blob/master/docs/
ctl_inspec.rst
✨ Crafting Reusable Cookbooks #chefconf✨ 88
InSpec Audit Rules
4 lots of resources to facilitate auditing nodes
✨ Crafting Reusable Cookbooks #chefconf✨ 89
InSpec host resource example
describe host('example.com', port: 80, proto: 'tcp') do
it { should be_reachable }
end
✨ Crafting Reusable Cookbooks #chefconf✨ 90
InSpec login_defs resource example
describe login_defs do
its('PASS_MAX_DAYS') { should eq '180' }
its('PASS_MIN_DAYS') { should eq '1' }
its('PASS_MIN_LEN') { should eq '15' }
its('PASS_WARN_AGE') { should eq '30' }
end
✨ Crafting Reusable Cookbooks #chefconf✨ 91
Introduction to Lab 5
Add Ubuntu platform to the mongodb cookbook.
Clean any rubocop and foodcritic issues reported.
Add tests to MongoDB cookbook.
Lab 5
✨ Crafting Reusable Cookbooks #chefconf✨ 92
Lab 5
Time: 30 minutes
✨ Crafting Reusable Cookbooks #chefconf✨ 93
Community Cookbooks
Community driven.
* Some managed by Chef. https://github.com/chef-
cookbooks
* Some partner managed.
✨ Crafting Reusable Cookbooks #chefconf✨ 94
CI/CD
✨ Crafting Reusable Cookbooks #chefconf✨ 95
Travis
4 free (for Open Source projects)
4 build files available
✨ Crafting Reusable Cookbooks #chefconf✨ 96
Chef Managed Community Cookbooks
CI
4 cookstyle (included with chef dk) https://github.com/
chef/cookstyle
4 allows for consistent rubocop testing across
cookbooks
4 use travis
✨ Crafting Reusable Cookbooks #chefconf✨ 97
Travis Sample
4 Tomcat Travis configuration
4 sudo: required (required when using docker with
travis)
4 limits branch to master
4 matrix set of platforms to test
4 script tests to be run
✨ Crafting Reusable Cookbooks #chefconf✨ 98
Introduction to Lab 6
Extending Existing Cookbooks
Lab 6
✨ Crafting Reusable Cookbooks #chefconf✨ 99
Lab 6
Time: 1 hour
✨ Crafting Reusable Cookbooks #chefconf✨ 100
Introduction to Lab 7
Lab 7
✨ Crafting Reusable Cookbooks #chefconf✨ 101
Lab 7
Time: 1 hour
✨ Crafting Reusable Cookbooks #chefconf✨ 102
Review
✨ Crafting Reusable Cookbooks #chefconf✨ 103

Weitere ähnliche Inhalte

Andere mochten auch

La inteligencia
La inteligenciaLa inteligencia
La inteligencia
Juan1413
 
Foliage season
Foliage seasonFoliage season
Foliage season
Donjef622
 
libHPC: Software sustainability and reuse through metadata preservation
libHPC: Software sustainability and reuse through metadata preservationlibHPC: Software sustainability and reuse through metadata preservation
libHPC: Software sustainability and reuse through metadata preservation
SoftwarePractice
 
Rdr inducements-rules
Rdr inducements-rulesRdr inducements-rules
Rdr inducements-rules
rmkemp
 

Andere mochten auch (20)

Pres4 blogger
Pres4 bloggerPres4 blogger
Pres4 blogger
 
Farsimaratleikurinn kynning mars_2011
Farsimaratleikurinn kynning mars_2011Farsimaratleikurinn kynning mars_2011
Farsimaratleikurinn kynning mars_2011
 
5º tic en zootopia
5º tic en zootopia5º tic en zootopia
5º tic en zootopia
 
I social-media-e-i-top-brands-nel-mercato-del-fashion
I social-media-e-i-top-brands-nel-mercato-del-fashionI social-media-e-i-top-brands-nel-mercato-del-fashion
I social-media-e-i-top-brands-nel-mercato-del-fashion
 
40 Days of Prayer Guide
40 Days of Prayer Guide40 Days of Prayer Guide
40 Days of Prayer Guide
 
Apple
AppleApple
Apple
 
La inteligencia
La inteligenciaLa inteligencia
La inteligencia
 
Spjaldtölvur í námi og kennslu
Spjaldtölvur í námi og kennsluSpjaldtölvur í námi og kennslu
Spjaldtölvur í námi og kennslu
 
Conte "Estimem i cuidem el planeta i la seua teuladeta"
Conte "Estimem i cuidem el planeta i la seua teuladeta"Conte "Estimem i cuidem el planeta i la seua teuladeta"
Conte "Estimem i cuidem el planeta i la seua teuladeta"
 
Síntesis de evaluación
Síntesis de evaluaciónSíntesis de evaluación
Síntesis de evaluación
 
Foliage season
Foliage seasonFoliage season
Foliage season
 
MI-TLIF - effect of Age, BMI & Comorbidity - 2012-10-06 - SA Neurosurgery Con...
MI-TLIF - effect of Age, BMI & Comorbidity - 2012-10-06 - SA Neurosurgery Con...MI-TLIF - effect of Age, BMI & Comorbidity - 2012-10-06 - SA Neurosurgery Con...
MI-TLIF - effect of Age, BMI & Comorbidity - 2012-10-06 - SA Neurosurgery Con...
 
Solid state drive buyer's guide
Solid state drive buyer's guideSolid state drive buyer's guide
Solid state drive buyer's guide
 
La web 2
La web 2La web 2
La web 2
 
Podcast (Draft)
Podcast (Draft)Podcast (Draft)
Podcast (Draft)
 
Changing Context
Changing ContextChanging Context
Changing Context
 
libHPC: Software sustainability and reuse through metadata preservation
libHPC: Software sustainability and reuse through metadata preservationlibHPC: Software sustainability and reuse through metadata preservation
libHPC: Software sustainability and reuse through metadata preservation
 
Rdr inducements-rules
Rdr inducements-rulesRdr inducements-rules
Rdr inducements-rules
 
Puzzles and Muscles
Puzzles and MusclesPuzzles and Muscles
Puzzles and Muscles
 
Slide patungan usaha
Slide patungan usahaSlide patungan usaha
Slide patungan usaha
 

Ähnlich wie Crafting Reusable Resources (7)

Emerging chef patterns and practices
Emerging chef patterns and practicesEmerging chef patterns and practices
Emerging chef patterns and practices
 
The Five Stages of Chef Grief: My First 6 months with Chef, and Getting Aroun...
The Five Stages of Chef Grief: My First 6 months with Chef, and Getting Aroun...The Five Stages of Chef Grief: My First 6 months with Chef, and Getting Aroun...
The Five Stages of Chef Grief: My First 6 months with Chef, and Getting Aroun...
 
Teaching Kids Programming Using the Intentional Method
Teaching Kids Programming Using the Intentional MethodTeaching Kids Programming Using the Intentional Method
Teaching Kids Programming Using the Intentional Method
 
Crescendo Repurposing Webinar Slides
Crescendo Repurposing Webinar SlidesCrescendo Repurposing Webinar Slides
Crescendo Repurposing Webinar Slides
 
Chef NYC Users' Group - Announcements for June 2014
Chef NYC Users' Group - Announcements for June 2014Chef NYC Users' Group - Announcements for June 2014
Chef NYC Users' Group - Announcements for June 2014
 
Teaching Kids Programming Using the Intentional Method
Teaching Kids Programming Using the Intentional MethodTeaching Kids Programming Using the Intentional Method
Teaching Kids Programming Using the Intentional Method
 
Chef Fundamentals Training Series Module 6: Roles, Environments, Community Co...
Chef Fundamentals Training Series Module 6: Roles, Environments, Community Co...Chef Fundamentals Training Series Module 6: Roles, Environments, Community Co...
Chef Fundamentals Training Series Module 6: Roles, Environments, Community Co...
 

Mehr von Jennifer Davis

Dungeons and Data - Yahoo Hack Day 2013
Dungeons and Data - Yahoo Hack Day 2013Dungeons and Data - Yahoo Hack Day 2013
Dungeons and Data - Yahoo Hack Day 2013
Jennifer Davis
 

Mehr von Jennifer Davis (20)

Monitor the Unmeasurable
Monitor the UnmeasurableMonitor the Unmeasurable
Monitor the Unmeasurable
 
Effective DevOps - Pittsburgh Techfest 2016
Effective DevOps - Pittsburgh Techfest 2016Effective DevOps - Pittsburgh Techfest 2016
Effective DevOps - Pittsburgh Techfest 2016
 
Automating Infrastructure with Chef
Automating Infrastructure with ChefAutomating Infrastructure with Chef
Automating Infrastructure with Chef
 
Magic Myth and the DevOps, ANTIDOTES TO LEARNED HELPLESSNESS AND FEAR CULTURE...
Magic Myth and the DevOps, ANTIDOTES TO LEARNED HELPLESSNESS AND FEAR CULTURE...Magic Myth and the DevOps, ANTIDOTES TO LEARNED HELPLESSNESS AND FEAR CULTURE...
Magic Myth and the DevOps, ANTIDOTES TO LEARNED HELPLESSNESS AND FEAR CULTURE...
 
Effective Tools for Effective Change
Effective Tools for Effective ChangeEffective Tools for Effective Change
Effective Tools for Effective Change
 
Effective Devops - Velocity New York 2015
Effective Devops - Velocity New York 2015 Effective Devops - Velocity New York 2015
Effective Devops - Velocity New York 2015
 
Tools Effecting Change - DevOpsDays Boston 2015
Tools Effecting Change - DevOpsDays Boston 2015Tools Effecting Change - DevOpsDays Boston 2015
Tools Effecting Change - DevOpsDays Boston 2015
 
DevOps DC - Magic Myth and the DevOps
DevOps DC - Magic Myth and the DevOpsDevOps DC - Magic Myth and the DevOps
DevOps DC - Magic Myth and the DevOps
 
Effective Devops - AWS Loft Event June 2015
Effective Devops - AWS Loft Event June 2015Effective Devops - AWS Loft Event June 2015
Effective Devops - AWS Loft Event June 2015
 
Effective Devops - Collaboration and Tools - Velocity Santa Clara 2015
Effective Devops - Collaboration and Tools - Velocity Santa Clara 2015Effective Devops - Collaboration and Tools - Velocity Santa Clara 2015
Effective Devops - Collaboration and Tools - Velocity Santa Clara 2015
 
Introduction to Chef - April 22 2015
Introduction to Chef - April 22 2015Introduction to Chef - April 22 2015
Introduction to Chef - April 22 2015
 
Introduction to Chef - Techsuperwomen Summit
Introduction to Chef - Techsuperwomen SummitIntroduction to Chef - Techsuperwomen Summit
Introduction to Chef - Techsuperwomen Summit
 
Magic Myth and the Devops - Cascadia IT 2015
Magic Myth and the Devops - Cascadia IT 2015Magic Myth and the Devops - Cascadia IT 2015
Magic Myth and the Devops - Cascadia IT 2015
 
Planning Application Resilience
Planning Application ResiliencePlanning Application Resilience
Planning Application Resilience
 
Planning Application Resilience - Developer Week 2015
Planning Application Resilience - Developer Week 2015Planning Application Resilience - Developer Week 2015
Planning Application Resilience - Developer Week 2015
 
Magic, Myth and the DevOps
Magic, Myth and the DevOpsMagic, Myth and the DevOps
Magic, Myth and the DevOps
 
From Hero to Zero - DevOpsDays Boston
From Hero to Zero - DevOpsDays BostonFrom Hero to Zero - DevOpsDays Boston
From Hero to Zero - DevOpsDays Boston
 
Velocity 2014 - From Hero to Zero
Velocity 2014 - From Hero to ZeroVelocity 2014 - From Hero to Zero
Velocity 2014 - From Hero to Zero
 
Implementing Kanban to Improve your Workflow
Implementing Kanban to Improve your WorkflowImplementing Kanban to Improve your Workflow
Implementing Kanban to Improve your Workflow
 
Dungeons and Data - Yahoo Hack Day 2013
Dungeons and Data - Yahoo Hack Day 2013Dungeons and Data - Yahoo Hack Day 2013
Dungeons and Data - Yahoo Hack Day 2013
 

Kürzlich hochgeladen

Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Kürzlich hochgeladen (20)

A Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source MilvusA Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source Milvus
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu SubbuApidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 

Crafting Reusable Resources

  • 1. Crafting Reusable Cookbooks Ian Henry Jennifer Davis (remote) Network Name: ChefConf Access Code: ChefConf2016 ✨ Crafting Reusable Cookbooks #chefconf✨ 1
  • 2. Instructor 4 Ian Henry ✨ Crafting Reusable Cookbooks #chefconf✨ 2
  • 3. TA's 4 Robb Kidd 4 Matt Stratton 4 David Echols 4 Stephen Lauck 4 Bill Meyer ✨ Crafting Reusable Cookbooks #chefconf✨ 3
  • 4. Communication 4 Jennifer Davis Twitter: @sig je 4 Ian Henry Twitter: @Eeyun___ Hashtag: #chefconf ✨ Crafting Reusable Cookbooks #chefconf✨ 4
  • 5. Feedback 4 Constructive feedback 4 What did you find helpful? 4 What would you like to see more/less of? 4 Was there anything you found unclear? ✨ Crafting Reusable Cookbooks #chefconf✨ 5
  • 6. Why are we here? ✨ Crafting Reusable Cookbooks #chefconf✨ 6
  • 7. Expectations 4 Code of Conduct 4 Safe space to share experiences, learn from each other. 4 Learn effective patterns for developing reusable cookbooks. ✨ Crafting Reusable Cookbooks #chefconf✨ 7
  • 8. Agenda ✨ Crafting Reusable Cookbooks #chefconf✨ 8
  • 9. Collaboration Individuals working together with shared interactions and input, building towards a common goal. ✨ Crafting Reusable Cookbooks #chefconf✨ 9
  • 10. Collaboration 4 Multiple types of collaboration 4 Monitoring for single points of failure 4 Monitoring burnout ✨ Crafting Reusable Cookbooks #chefconf✨ 10
  • 11. Smarter Teams build better value ✨ Crafting Reusable Cookbooks #chefconf✨ 11
  • 12. Tools Accelerators of culture that if used effectively can enhance and support a culture of collaboration and affinity. ✨ Crafting Reusable Cookbooks #chefconf✨ 12
  • 13. Team 4 Common purpose 4 Defined beliefs 4 Empowered ✨ Crafting Reusable Cookbooks #chefconf✨ 13
  • 14. Diversity in Teams 4 Professional 4 Personal 4 Goals 4 Cognitive Styles ✨ Crafting Reusable Cookbooks #chefconf✨ 14
  • 15. Critical Habits for Teams 4 Code Review 4 Pairing ✨ Crafting Reusable Cookbooks #chefconf✨ 15
  • 16. Code Review 4 Max 90 minutes in one setting ✨ Crafting Reusable Cookbooks #chefconf✨ 16
  • 17. Pairing 4 Agile software development 4 2 people work together on 1 workstation 4 Driver - writes code 4 Observer - reviews each line 4 Roles switch frequently ✨ Crafting Reusable Cookbooks #chefconf✨ 17
  • 18. Types of Pairing 4 Expert-expert 4 Expert-novice 4 Novice-novice ✨ Crafting Reusable Cookbooks #chefconf✨ 18
  • 19. Team Activity 1 4 Meet your team! 4 What are motivations? 4 What are objectives? 4 Skills? Gaps in skills? 4 git, chef, docker, continuous integration, continuous delivery If you haven't filled out the skills assessment please do✨ Crafting Reusable Cookbooks #chefconf✨ 19
  • 20. Local Development Environment (LDE) 4 Consistent set of tools across the team 4 Ability to quickly onboard new engineers ✨ Crafting Reusable Cookbooks #chefconf✨ 20
  • 21. Team Activity 2 4 Share with your team: 4 Do you have a team common local development environment? 4 What current tools are you using in chef development? Time: 10 minutes ✨ Crafting Reusable Cookbooks #chefconf✨ 21
  • 22. Provisioned Node - LDE 4 AWS instance node 4 Chef DK 4 Test Kitchen 4 Ruby 4 ChefSpec, ServerSpec 4 Git ✨ Crafting Reusable Cookbooks #chefconf✨ 22
  • 23. Introduction to Lab 1 4 Log into node and configure git 4 Create GitHub identity if you don't have one already. 4 Set up GitHub keys. 4 Share team tools from Activity 2. ✨ Crafting Reusable Cookbooks #chefconf✨ 23
  • 24. Lab 1 Time: 30 minutes ✨ Crafting Reusable Cookbooks #chefconf✨ 24
  • 25. Supermarket 4 Community site with a number of cookbooks Class Supermarket: https:// supermarket.reusablechef.com ✨ Crafting Reusable Cookbooks #chefconf✨ 25
  • 26. Chef DK 4 Chef development kit 4 Includes a number of utilities and software to facilitate cookbook creation 4 Free download off of the website ✨ Crafting Reusable Cookbooks #chefconf✨ 26
  • 27. Berkshelf 4 Dependency management 4 Included with Chef DK ✨ Crafting Reusable Cookbooks #chefconf✨ 27
  • 28. Test Kitchen 4 Included with Chef DK 4 Test harness 4 Sandbox automation ✨ Crafting Reusable Cookbooks #chefconf✨ 28
  • 29. .kitchen.yml 4 driver 4 provisioner 4 platforms 4 suites ✨ Crafting Reusable Cookbooks #chefconf✨ 29
  • 30. .kitchen.yml driver 4 virtualization or cloud provider Example: vagrant, docker ✨ Crafting Reusable Cookbooks #chefconf✨ 30
  • 31. .kitchen.yml provisioner 4 application to configure the node Example: chef_zero ✨ Crafting Reusable Cookbooks #chefconf✨ 31
  • 32. .kitchen.yml platforms 4 target operating systems Example: centos-6.5 ✨ Crafting Reusable Cookbooks #chefconf✨ 32
  • 33. .kitchen.yml suites 4 target configurations Example: name:default run_list: - recipe[apache::default] attributes: ✨ Crafting Reusable Cookbooks #chefconf✨ 33
  • 34. Introduction to Lab 2 4 Create cookbook Lab 2 ✨ Crafting Reusable Cookbooks #chefconf✨ 34
  • 35. Lab 2 Time: 20 minutes ✨ Crafting Reusable Cookbooks #chefconf✨ 35
  • 36. Runbook to Recipes ✨ Crafting Reusable Cookbooks #chefconf✨ 36
  • 37. Introducing MongoDB ✨ Crafting Reusable Cookbooks #chefconf✨ 37
  • 38. MongoDB terminology 4 document - basic unit of data for MongoDB, ordered set of keys with associated values 4 collection - group of documents. analogous to table. 4 instance - MongoDB can host multiple independent databases, each of which can have its own collections. ✨ Crafting Reusable Cookbooks #chefconf✨ 38
  • 39. MongoDB Shell 4 mongo full featured JavaScript interpreter ✨ Crafting Reusable Cookbooks #chefconf✨ 39
  • 40. Introduction to Lab 3 Translate a runbook for installing MongoDB into chef. [Lab 3]https://github.com/iennae/crc-training/blob/ master/labs/lab_3.md) ✨ Crafting Reusable Cookbooks #chefconf✨ 40
  • 41. Lab 3 Time: 20 minutes ✨ Crafting Reusable Cookbooks #chefconf✨ 41
  • 42. Quality Cookbooks ✨ Crafting Reusable Cookbooks #chefconf✨ 42
  • 43. Iterative ✨ Crafting Reusable Cookbooks #chefconf✨ 43
  • 44. Issue Management 4 Should be clear where to file bugs, request features. 4 Should be regularly groomed ✨ Crafting Reusable Cookbooks #chefconf✨ 44
  • 45. Clear and Specific Licensing For reusable cookbooks across the community 4 Apache 2.0 4 GNU Public License 2.0 4 GNU Public License 3.0 4 MIT ✨ Crafting Reusable Cookbooks #chefconf✨ 45
  • 46. Multiple Collaborators 4 More than 1 person with the ability to release new cookbooks 4 More than 1 person with ability to merge pull requests ✨ Crafting Reusable Cookbooks #chefconf✨ 46
  • 47. Test Everything 4 Use integration tests 4 Assert the state of the converged node to ensure it's in the desired state ✨ Crafting Reusable Cookbooks #chefconf✨ 47
  • 48. Foodcritic and Rubocop 4 Chef and Ruby linters pass cleanly ✨ Crafting Reusable Cookbooks #chefconf✨ 48
  • 49. Multiple Platforms 4 As applicable, supports multiple platforms ✨ Crafting Reusable Cookbooks #chefconf✨ 49
  • 50. Documentation 4 Clear and specific 4 Includes contributing guidelines ✨ Crafting Reusable Cookbooks #chefconf✨ 50
  • 51. No binaries 4 Binaries should be stored in signed artifact repositories separate from the cookbook ✨ Crafting Reusable Cookbooks #chefconf✨ 51
  • 52. Existence of a test cookbook ✨ Crafting Reusable Cookbooks #chefconf✨ 52
  • 53. No duplication of code ✨ Crafting Reusable Cookbooks #chefconf✨ 53
  • 54. Valid kitchen configuration 4 Ability for others to replicate and test cookbook easily ✨ Crafting Reusable Cookbooks #chefconf✨ 54
  • 55. Custom Resources over Attributes 4 Attribute driven 4 Resources ✨ Crafting Reusable Cookbooks #chefconf✨ 55
  • 56. Custom Matchers when using Custom Resources Example: https://github.com/chef-cookbooks/tomcat/ blob/master/libraries/matchers.rb ✨ Crafting Reusable Cookbooks #chefconf✨ 56
  • 57. Build Cookbooks for Wrapping ✨ Crafting Reusable Cookbooks #chefconf✨ 57
  • 58. Support the 95% use case ✨ Crafting Reusable Cookbooks #chefconf✨ 58
  • 59. History of Customizing Chef 4 Attributes 4 Definitions 4 LWRP and HWRP 4 Custom Resources ✨ Crafting Reusable Cookbooks #chefconf✨ 59
  • 60. Custom Resources 4 As of 12.5 4 compat_resource to bring custom resources to 12+ ✨ Crafting Reusable Cookbooks #chefconf✨ 60
  • 61. Introduction to Lab 4 Translate our MongoDB cookbook from recipes into resources. Lab 4 ✨ Crafting Reusable Cookbooks #chefconf✨ 61
  • 62. Lab 4 Time: 30 minutes ✨ Crafting Reusable Cookbooks #chefconf✨ 62
  • 63. Managing Risk 4 Test 4 Small frequent releases ✨ Crafting Reusable Cookbooks #chefconf✨ 63
  • 64. Linting 4 Ensure code adheres to styles and conventions 4 Weave expectations into development 4 Encourages collaboration ✨ Crafting Reusable Cookbooks #chefconf✨ 64
  • 65. Testing 4 Documenting objectives and intent 4 Measuring "done" ✨ Crafting Reusable Cookbooks #chefconf✨ 65
  • 66. Code Correctness 4 foodcritic 4 rubocop ✨ Crafting Reusable Cookbooks #chefconf✨ 66
  • 67. Integration Tests 4 ServerSpec 4 InSpec ✨ Crafting Reusable Cookbooks #chefconf✨ 67
  • 68. Rubocop 4 Ruby linter 4 Analyzes source code to verify the syntax and structure of our cookbooks. 4 Ruby style guide 4 Included with ChefDK ✨ Crafting Reusable Cookbooks #chefconf✨ 68
  • 69. Why 4 identify simple errors early 4 improve the review process by eliminating stylistic issues ✨ Crafting Reusable Cookbooks #chefconf✨ 69
  • 70. Rubocop Example $ rubocop cookbooks/COOKBOOK1 cookbooks/COOKBOOK2 cookbooks/COOKBOOK4 ✨ Crafting Reusable Cookbooks #chefconf✨ 70
  • 71. Reading Rubocop Output Inspecting 8 files CWCWCCCC 4 . means that the file contains no issues 4 C means a issue with convention 4 W means a warning 4 E means an error 4 F means an fatal error ✨ Crafting Reusable Cookbooks #chefconf✨ 71
  • 72. Rubocop Cops 4 Lint 4 Rails 4 Style Example: rubocop --lint. ✨ Crafting Reusable Cookbooks #chefconf✨ 72
  • 73. Disabling Rubocop cops Any configuration in .rubocop.yml is disabled. To disable string literals: StringLiterals: Enabled: false ✨ Crafting Reusable Cookbooks #chefconf✨ 73
  • 74. Foodcritic 4 Chef linter 4 Chef style guide 4 Included with ChefDK ✨ Crafting Reusable Cookbooks #chefconf✨ 74
  • 75. Foodcritic Example $ foodcritic cookbooks/setup ✨ Crafting Reusable Cookbooks #chefconf✨ 75
  • 76. Reading Foodcritic Output FC008: Generated cookbook metadata needs updating: ./metadata.rb:2 ✨ Crafting Reusable Cookbooks #chefconf✨ 76
  • 77. ServerSpec 4 Tests to verify servers functionality 4 Resource types 4 Package, service, user, and many others 4 Integrates with Test Kitchen 4 http://serverspec.org ✨ Crafting Reusable Cookbooks #chefconf✨ 77
  • 78. ServerSpec Generic Form describe "<subject>" do it "<description>" do expect(thing).to eq result end end ✨ Crafting Reusable Cookbooks #chefconf✨ 78
  • 79. ServerSpec Potential Tests 4 Is the service running? 4 Is the port accessible? 4 Is the expected content being served? ✨ Crafting Reusable Cookbooks #chefconf✨ 79
  • 80. ServerSpec Example describe 'apache' do it "is installed" do expect(package 'httpd').to be_installed end it "is running" do expect(service 'httpd').to be_running end end ✨ Crafting Reusable Cookbooks #chefconf✨ 80
  • 81. Reading ServerSpec Output app::default httpd service is running Finished in 0.26429 seconds (files took 0.7166 seconds to load) 1 example, 0 failures ✨ Crafting Reusable Cookbooks #chefconf✨ 81
  • 82. InSpec 4 infrastructure specification 4 open-source testing framework for infrastructure 4 human and machine readable 4 compliance, security, and policy requirements 4 Based off of ServerSpec ✨ Crafting Reusable Cookbooks #chefconf✨ 82
  • 83. InSpec Example describe service 'ssh-agent' do it { should be_running } end ✨ Crafting Reusable Cookbooks #chefconf✨ 83
  • 84. InSpec Example Run $ inspec exec test.rb . Finished in 0.00901 seconds (files took 0.98501 seconds to load) 1 example, 0 failures ✨ Crafting Reusable Cookbooks #chefconf✨ 84
  • 85. InSpec Remote Run $ inspec exec test.rb -i ~/.aws/YOUR.pem -t ssh://ec2-user@54.152.7.203 ✨ Crafting Reusable Cookbooks #chefconf✨ 85
  • 86. InSpec Remote Run on Windows $ inspec exec test.rb -t winrm://Admin@192.168.1.2 --password super ✨ Crafting Reusable Cookbooks #chefconf✨ 86
  • 87. InSpec Docker Containers $ inspec exec test.rb -t docker://3dda08e75838 ✨ Crafting Reusable Cookbooks #chefconf✨ 87
  • 88. More info on InSpec https://github.com/chef/inspec/blob/master/docs/ ctl_inspec.rst ✨ Crafting Reusable Cookbooks #chefconf✨ 88
  • 89. InSpec Audit Rules 4 lots of resources to facilitate auditing nodes ✨ Crafting Reusable Cookbooks #chefconf✨ 89
  • 90. InSpec host resource example describe host('example.com', port: 80, proto: 'tcp') do it { should be_reachable } end ✨ Crafting Reusable Cookbooks #chefconf✨ 90
  • 91. InSpec login_defs resource example describe login_defs do its('PASS_MAX_DAYS') { should eq '180' } its('PASS_MIN_DAYS') { should eq '1' } its('PASS_MIN_LEN') { should eq '15' } its('PASS_WARN_AGE') { should eq '30' } end ✨ Crafting Reusable Cookbooks #chefconf✨ 91
  • 92. Introduction to Lab 5 Add Ubuntu platform to the mongodb cookbook. Clean any rubocop and foodcritic issues reported. Add tests to MongoDB cookbook. Lab 5 ✨ Crafting Reusable Cookbooks #chefconf✨ 92
  • 93. Lab 5 Time: 30 minutes ✨ Crafting Reusable Cookbooks #chefconf✨ 93
  • 94. Community Cookbooks Community driven. * Some managed by Chef. https://github.com/chef- cookbooks * Some partner managed. ✨ Crafting Reusable Cookbooks #chefconf✨ 94
  • 95. CI/CD ✨ Crafting Reusable Cookbooks #chefconf✨ 95
  • 96. Travis 4 free (for Open Source projects) 4 build files available ✨ Crafting Reusable Cookbooks #chefconf✨ 96
  • 97. Chef Managed Community Cookbooks CI 4 cookstyle (included with chef dk) https://github.com/ chef/cookstyle 4 allows for consistent rubocop testing across cookbooks 4 use travis ✨ Crafting Reusable Cookbooks #chefconf✨ 97
  • 98. Travis Sample 4 Tomcat Travis configuration 4 sudo: required (required when using docker with travis) 4 limits branch to master 4 matrix set of platforms to test 4 script tests to be run ✨ Crafting Reusable Cookbooks #chefconf✨ 98
  • 99. Introduction to Lab 6 Extending Existing Cookbooks Lab 6 ✨ Crafting Reusable Cookbooks #chefconf✨ 99
  • 100. Lab 6 Time: 1 hour ✨ Crafting Reusable Cookbooks #chefconf✨ 100
  • 101. Introduction to Lab 7 Lab 7 ✨ Crafting Reusable Cookbooks #chefconf✨ 101
  • 102. Lab 7 Time: 1 hour ✨ Crafting Reusable Cookbooks #chefconf✨ 102
  • 103. Review ✨ Crafting Reusable Cookbooks #chefconf✨ 103