SlideShare a Scribd company logo
Cookbook
Refactoring
A
Cookbook
Refactoring
... and extracting logic into Rubygems
A
sethvargo@opscode.com
E
byz
Cookbook refactoring & abstracting logic to Ruby(gems)
We're Hiring!
We're Hiring!
Colorado
New Branding
We're Hiring!
U
DO YOU SOMETIMES
FEEL LIKE
THIS
Cookbook refactoring & abstracting logic to Ruby(gems)
Cookbook refactoring & abstracting logic to Ruby(gems)
template '/etc/hosts' do
owner 'root'
group 'root'
source 'etc/hosts'
end
recipes/default.rb
# This file is managed by Chef for "<%= node['fqdn'] %>"
# Do NOT modify this file by hand.
<%= node['ipaddress'] %> <%= node['fqdn'] %>
127.0.0.1!localhost <%= node['fqdn'] %>
255.255.255.255!broadcasthost
::1 localhost
fe80::1%lo0! localhost
templates/default/etc/hosts.erb
Cookbook refactoring & abstracting logic to Ruby(gems)
default['etc']['hosts'] = [] unless node['etc']['hosts']
attributes/default.rb
# This file is managed by Chef for "<%= node['fqdn'] %>"
# Do NOT modify this file by hand.
<%= node['ipaddress'] %> <%= node['fqdn'] %>
127.0.0.1!localhost <%= node['fqdn'] %>
255.255.255.255!broadcasthost
::1 localhost
fe80::1%lo0! localhost
# Custom Entries
<% node['etc']['hosts'].each do |h| -%>
<%= h['ip'] %> <%= h['host'] %>
<% end -%>
templates/default/etc/hosts.erb
include_attribute 'hostsfile'
default['etc']['hosts'] << {
'ip' => '1.2.3.4',
'host' => 'www.example.com'
}
other_cookbook/attributes/default.rb
node.default['etc']['hosts'] << {
'ip' => '1.2.3.4',
'host' => 'www.example.com'
}
other_cookbook/recipes/default.rb
default_attributes({
'etc' => {
'hosts' => [
{'ip' => '1.2.3.4', 'host' => 'www.example.com'},
{'ip' => '4.5.6.7', 'host' => 'foo.example.com'}
]
}
})
roles/my_role.rb
{
"default_attributes": {
"etc": {
"hosts": [
{"ip": "1.2.3.4", "host": "www.example.com"},
{"ip": "4.5.6.7", "host": "foo.example.com"}
]
}
}
}
environments/production.json
Cookbook refactoring & abstracting logic to Ruby(gems)
node.set['etc']['hosts'] = {
ip: '7.8.9.0',
host: 'bar.example.com'
})
recipes/default.rb
Cookbook refactoring & abstracting logic to Ruby(gems)
arr = [1,2,3]
arr << 4 => [1,2,3,4]
arr = 4 => 4
arr = [1,2,3]
arr << 4 => [1,2,3,4]
arr = 4 => 4
Not an Array
TODO:Add infographics
# This file is managed by Chef for "www.myapp.com"
# Do NOT modify this file by hand.
1.2.3.4 www.myapp.com
127.0.0.1!localhost www.myapp.com
255.255.255.255!broadcasthost
::1 localhost
fe80::1%lo0! localhost
# Custom Entries
1.2.3.4 www.example.com
4.5.6.7 foo.example.com
7.8.9.0 bar.example.com
/etc/hosts
TODO:Add infographics
# This file is managed by Chef for "www.myapp.com"
# Do NOT modify this file by hand.
1.2.3.4 www.myapp.com
127.0.0.1!localhost www.myapp.com
255.255.255.255!broadcasthost
::1 localhost
fe80::1%lo0! localhost
# Custom Entries
7.8.9.0 bar.example.com
/etc/hosts
Post Mortem
Cookbook refactoring & abstracting logic to Ruby(gems)
Cookbook refactoring & abstracting logic to Ruby(gems)
<< =
<< =!=
Post Mortem
Action Items
7
Monkey patch Chef to raise an
exception when redefining that
particular node attribute.
Monkey patch Chef to raise an
exception when redefining that
particular node attribute.t
Create a special cookbook that
uses a threshold value and raises an
exception if the size of the array
doesn't "make sense".
Create a special cookbook that
uses a threshold value and raises an
exception if the size of the array
doesn't "make sense".
t
Move all entries to a data bag
Move all entries to a data bag
u
Move all entries to a data bag6
6 Add tests
Data Bags
[
"1.2.3.4 example.com www.example.com",
"4.5.6.7 foo.example.com",
"7.8.9.0 bar.example.com"
]
data_bags/etc_hosts.json
hosts = data_bag('etc_hosts')
template '/etc/hosts' do
owner 'root'
group 'root'
source 'etc/hosts'
variables(
hosts: hosts
)
end
recipes/default.rb
# This file is managed by Chef for "<%= node['fqdn'] %>"
# Do NOT modify this file by hand.
<%= node['ipaddress'] %> <%= node['fqdn'] %>
127.0.0.1!localhost <%= node['fqdn'] %>
255.255.255.255!broadcasthost
::1 localhost
fe80::1%lo0! localhost
# Custom Entries
<%= @hosts.join("n") %>
templates/default/etc/hosts.erb
Move all entries to a data bag5
6 Add tests
require 'chefspec'
spec/default_spec.rb
require 'chefspec'
describe 'hostsfile::default' do
end
spec/default_spec.rb
require 'chefspec'
describe 'hostsfile::default' do
let(:hosts) { ['1.2.3.4 example.com', '4.5.6.7 bar.com'] }
before do
Chef::Recipe.any_instance.stub(:data_bag).with('etc_hosts').and_return(hosts)
end
end
spec/default_spec.rb
require 'chefspec'
describe 'hostsfile::default' do
let(:hosts) { ['1.2.3.4 example.com', '4.5.6.7 bar.com'] }
before do
Chef::Recipe.any_instance.stub(:data_bag).with('etc_hosts').and_return(hosts)
end
let(:runner) { ChefSpec::ChefRunner.new.converge('hostsfile::default') }
end
spec/default_spec.rb
require 'chefspec'
describe 'hostsfile::default' do
let(:hosts) { ['1.2.3.4 example.com', '4.5.6.7 bar.com'] }
before do
Chef::Recipe.any_instance.stub(:data_bag).with('etc_hosts').and_return(hosts)
end
let(:runner) { ChefSpec::ChefRunner.new.converge('hostsfile::default') }
it 'loads the data bag' do
Chef::Recipe.any_instance.should_receive(:data_bag).with('etc_hosts')
end
end
spec/default_spec.rb
require 'chefspec'
describe 'hostsfile::default' do
let(:hosts) { ['1.2.3.4 example.com', '4.5.6.7 bar.com'] }
before do
Chef::Recipe.any_instance.stub(:data_bag).with('etc_hosts').and_return(hosts)
end
let(:runner) { ChefSpec::ChefRunner.new.converge('hostsfile::default') }
it 'loads the data bag' do
Chef::Recipe.any_instance.should_receive(:data_bag).with('etc_hosts')
end
it 'creates the /etc/hosts template' do
expect(runner).to create_template('/etc/hosts').with_content(hosts.join("n"))
end
end
spec/default_spec.rb
$ rspec cookbooks/hostsfile
Running all specs
$ rspec cookbooks/hostsfile
Running all specs
**
Finished in 0.0003 seconds
2 examples, 0 failures
$ rspec cookbooks/hostsfile
Running all specs
**
Finished in 0.0003 seconds
2 examples, 0 failures
Really Fucking Fast™
#winning
10,000 tests
28 seconds
#winning
⏳⏳
Cookbook refactoring & abstracting logic to Ruby(gems)
Cookbook refactoring & abstracting logic to Ruby(gems)
hosts = data_bag('etc_hosts')
hosts << search(:node, 'role:mongo_master').first.tap do |n|
"#{n['ip_address']} #{n['fqdn']}"
end
template '/etc/hosts' do
owner 'root'
group 'root'
source 'etc/hosts'
variables(
hosts: hosts
)
end
recipes/default.rb
hosts = data_bag('etc_hosts')
hosts << search(:node, 'role:mongo_master').first.tap do |n|
"#{n['ip_address']} #{n['fqdn']}"
end
hosts << search(:node, 'role:mysql_master').first.tap do |n|
"#{n['ip_address']} #{n['fqdn']}"
end
hosts << search(:node, 'role:redis_master').first.tap do |n|
"#{n['ip_address']} #{n['fqdn']}"
end
template '/etc/hosts' do
owner 'root'
group 'root'
recipes/default.rb
LWRPs
# List of all actions supported by the provider
actions :create, :create_if_missing, :update, :remove
# Make create the default action
default_action :create
# Required attributes
attribute :ip_address,
kind_of: String,
name_attribute: true,
required: true
attribute :hostname, kind_of: String
# Optional attributes
attribute :aliases, kind_of: Array
attribute :comment, kind_of: String
resources/entry.rb
action :create do
::Chef::Util::FileEdit.search_file_delete_line(entry)
::Chef::Util::FileEdit.insert_line_after_match(/n/, entry)
end
protected
def entry
[new_resource.ip_address, new_resource.hostname,
new_resource.aliases.join(' ')].compact.join(' ').squeeze(' ')
end
providers/entry.rb
hostsfile_entry '1.2.3.4' do
hostname 'example.com'
end
providers/entry.rb
Chef::Util::FileEdit is slow
Re-writing the file on each run
Provider kept growning
Untested
Refactor
A
Move to pure Ruby classes
Ditch Chef::Util::FileEdit and
manage the entire file
Only implement Ruby classes in
the Provider (logic-less Provider)
Test the Ruby code
Test that the Provider implements
the proper Ruby classes
TODO:Add infographics
class Entry
attr_accessor :ip_address, :hostname, :aliases, :comment
def initialize(options = {})
if options[:ip_address].nil? || options[:hostname].nil?
raise ':ip_address and :hostname are both required options'
end
@ip_address = options[:ip_address]
@hostname = options[:hostname]
@aliases = [options[:aliases]].flatten
@comment = options[:comment]
end
# ...
end
libraries/entry.rb
TODO:Add infographics
class Manipulator
def initialize
contents = ::File.readlines(hostsfile_path)
@entries = contents.collect do |line|
Entry.parse(line) unless line.strip.nil? || line.strip.empty?
end.compact
end
def add(options = {})
@entries << Entry.new(
ip_address: options[:ip_address],
hostname: options[:hostname],
aliases: options[:aliases],
comment: options[:comment]
)
end
end
libraries/manipulator.rb
# Creates a new hosts file entry. If an entry already exists, it
# will be overwritten by this one.
action :create do
hostsfile.add(
ip_address: new_resource.ip_address,
hostname: new_resource.hostname,
aliases: new_resource.aliases,
comment: new_resource.comment
)
new_resource.updated_by_last_action(true) if hostsfile.save
end
providers/entry.rb
Cookbook refactoring & abstracting logic to Ruby(gems)
Cookbook refactoring & abstracting logic to Ruby(gems)
RSpec
TODO:Add infographics
describe Entry do
describe '.initialize' do
subject { Entry.new(ip_address: '2.3.4.5', hostname:
'www.example.com', aliases: ['foo', 'bar'], comment: 'This is a
comment!', priority: 100) }
it 'raises an exception if :ip_address is missing' do
expect {
Entry.new(hostname: 'www.example.com')
}.to raise_error(ArgumentError)
end
it 'sets the ip_address' do
expect(subject.ip_address).to eq('2.3.4.5')
end
end
spec/entry_spec.rb
Cookbook refactoring & abstracting logic to Ruby(gems)
ChefSpec
ChefSpec
TODO:Add infographics
describe 'hostsfile lwrp' do
let(:manipulator) { double('manipulator') }
before do
Manipulator.stub(:new).and_return(manipulator)
Manipulator.should_receive(:new).with(kind_of(Chef::Node))
.and_return(manipulator)
manipulator.should_receive(:save!)
end
let(:chef_run) {
ChefSpec::ChefRunner.new(
cookbook_path: $cookbook_paths,
step_into: ['hostsfile_entry']
)
}
spec/default_spec.rb
TODO:Add infographics
context 'actions' do
describe ':create' do
it 'adds the entry' do
manipulator.should_receive(:add).with({
ip_address: '2.3.4.5',
hostname: 'www.example.com',
aliases: nil,
comment: nil,
priority: nil
})
chef_run.converge('fake::create')
end
end
end
end
Open It
Cookbook refactoring & abstracting logic to Ruby(gems)
Cookbook refactoring & abstracting logic to Ruby(gems)
Cookbook refactoring & abstracting logic to Ruby(gems)
Cookbook refactoring & abstracting logic to Ruby(gems)
Cookbook refactoring & abstracting logic to Ruby(gems)
Gem It
$ bundle gem hostsfile
$ bundle gem hostsfile
create hostsfile/Gemfile
create hostsfile/Rakefile
create hostsfile/LICENSE.txt
create hostsfile/README.md
create hostsfile/.gitignore
create hostsfile/hostsfile.gemspec
create hostsfile/lib/hostsfile.rb
create hostsfile/lib/hostsfile/version.rb
Initializating git repo in ~Development/hostsfile
entry.rb
manipulator.rb
99
9
9
?
chef_gem 'hostsfile'
recipes/default.rb
require 'hostsfile'
providers/entry.rb
In another cookbook...
# ...
depends 'hostsfile'
other_cookbook/metadata.rb
{
"run_list": [
"recipe[hostsfile]"
]
}
www.myapp.com (Chef Node)
Cookbook refactoring & abstracting logic to Ruby(gems)
Cookbook refactoring & abstracting logic to Ruby(gems)
Cookbook refactoring & abstracting logic to Ruby(gems)
Thank
You
z
Ad

More Related Content

What's hot (20)

Chef training Day4
Chef training Day4Chef training Day4
Chef training Day4
Andriy Samilyak
 
Chef training Day5
Chef training Day5Chef training Day5
Chef training Day5
Andriy Samilyak
 
CLUG 2014-10 - Cookbook CI with Jenkins
CLUG 2014-10 - Cookbook CI with JenkinsCLUG 2014-10 - Cookbook CI with Jenkins
CLUG 2014-10 - Cookbook CI with Jenkins
Zachary Stevens
 
Test Driven Development with Chef
Test Driven Development with ChefTest Driven Development with Chef
Test Driven Development with Chef
Simone Soldateschi
 
Kickstarter - Chef Opswork
Kickstarter - Chef OpsworkKickstarter - Chef Opswork
Kickstarter - Chef Opswork
Hamza Waqas
 
Introduction To Continuous Compliance & Remediation
Introduction To Continuous Compliance & RemediationIntroduction To Continuous Compliance & Remediation
Introduction To Continuous Compliance & Remediation
Nicole Johnson
 
Practical Chef and Capistrano for Your Rails App
Practical Chef and Capistrano for Your Rails AppPractical Chef and Capistrano for Your Rails App
Practical Chef and Capistrano for Your Rails App
SmartLogic
 
Testable Infrastructure with Chef, Test Kitchen, and Docker
Testable Infrastructure with Chef, Test Kitchen, and DockerTestable Infrastructure with Chef, Test Kitchen, and Docker
Testable Infrastructure with Chef, Test Kitchen, and Docker
Mandi Walls
 
Tips and Tricks for Automating Windows with Chef
Tips and Tricks for Automating Windows with ChefTips and Tricks for Automating Windows with Chef
Tips and Tricks for Automating Windows with Chef
Chef Software, Inc.
 
Deploying a Chef Server
Deploying a Chef ServerDeploying a Chef Server
Deploying a Chef Server
Hart Hoover
 
Testing for infra code using test-kitchen,docker,chef
Testing for infra code using  test-kitchen,docker,chefTesting for infra code using  test-kitchen,docker,chef
Testing for infra code using test-kitchen,docker,chef
kamalikamj
 
San Antonio Chef Users Meetup, Jun 2014 - Chef Metal
San Antonio Chef Users Meetup, Jun 2014 - Chef MetalSan Antonio Chef Users Meetup, Jun 2014 - Chef Metal
San Antonio Chef Users Meetup, Jun 2014 - Chef Metal
Hart Hoover
 
Cloud Automation with Opscode Chef
Cloud Automation with Opscode ChefCloud Automation with Opscode Chef
Cloud Automation with Opscode Chef
Sri Ram
 
Introduction to Chef
Introduction to ChefIntroduction to Chef
Introduction to Chef
kevsmith
 
Lessons from Etsy: Avoiding Kitchen Nightmares - #ChefConf 2012
Lessons from Etsy: Avoiding Kitchen Nightmares - #ChefConf 2012Lessons from Etsy: Avoiding Kitchen Nightmares - #ChefConf 2012
Lessons from Etsy: Avoiding Kitchen Nightmares - #ChefConf 2012
Patrick McDonnell
 
Configuration Management in a Containerized World
Configuration Management in a Containerized WorldConfiguration Management in a Containerized World
Configuration Management in a Containerized World
Julian Dunn
 
Chef basics - write infrastructure as code
Chef basics - write infrastructure as codeChef basics - write infrastructure as code
Chef basics - write infrastructure as code
stevaaa
 
Atmosphere 2014: Really large scale systems configuration - Phil Dibowitz
Atmosphere 2014: Really large scale systems configuration - Phil DibowitzAtmosphere 2014: Really large scale systems configuration - Phil Dibowitz
Atmosphere 2014: Really large scale systems configuration - Phil Dibowitz
PROIDEA
 
Michelin Starred Cooking with Chef
Michelin Starred Cooking with ChefMichelin Starred Cooking with Chef
Michelin Starred Cooking with Chef
Jon Cowie
 
Common configuration with Data Bags - Fundamentals Webinar Series Part 4
Common configuration with Data Bags - Fundamentals Webinar Series Part 4Common configuration with Data Bags - Fundamentals Webinar Series Part 4
Common configuration with Data Bags - Fundamentals Webinar Series Part 4
Chef
 
CLUG 2014-10 - Cookbook CI with Jenkins
CLUG 2014-10 - Cookbook CI with JenkinsCLUG 2014-10 - Cookbook CI with Jenkins
CLUG 2014-10 - Cookbook CI with Jenkins
Zachary Stevens
 
Test Driven Development with Chef
Test Driven Development with ChefTest Driven Development with Chef
Test Driven Development with Chef
Simone Soldateschi
 
Kickstarter - Chef Opswork
Kickstarter - Chef OpsworkKickstarter - Chef Opswork
Kickstarter - Chef Opswork
Hamza Waqas
 
Introduction To Continuous Compliance & Remediation
Introduction To Continuous Compliance & RemediationIntroduction To Continuous Compliance & Remediation
Introduction To Continuous Compliance & Remediation
Nicole Johnson
 
Practical Chef and Capistrano for Your Rails App
Practical Chef and Capistrano for Your Rails AppPractical Chef and Capistrano for Your Rails App
Practical Chef and Capistrano for Your Rails App
SmartLogic
 
Testable Infrastructure with Chef, Test Kitchen, and Docker
Testable Infrastructure with Chef, Test Kitchen, and DockerTestable Infrastructure with Chef, Test Kitchen, and Docker
Testable Infrastructure with Chef, Test Kitchen, and Docker
Mandi Walls
 
Tips and Tricks for Automating Windows with Chef
Tips and Tricks for Automating Windows with ChefTips and Tricks for Automating Windows with Chef
Tips and Tricks for Automating Windows with Chef
Chef Software, Inc.
 
Deploying a Chef Server
Deploying a Chef ServerDeploying a Chef Server
Deploying a Chef Server
Hart Hoover
 
Testing for infra code using test-kitchen,docker,chef
Testing for infra code using  test-kitchen,docker,chefTesting for infra code using  test-kitchen,docker,chef
Testing for infra code using test-kitchen,docker,chef
kamalikamj
 
San Antonio Chef Users Meetup, Jun 2014 - Chef Metal
San Antonio Chef Users Meetup, Jun 2014 - Chef MetalSan Antonio Chef Users Meetup, Jun 2014 - Chef Metal
San Antonio Chef Users Meetup, Jun 2014 - Chef Metal
Hart Hoover
 
Cloud Automation with Opscode Chef
Cloud Automation with Opscode ChefCloud Automation with Opscode Chef
Cloud Automation with Opscode Chef
Sri Ram
 
Introduction to Chef
Introduction to ChefIntroduction to Chef
Introduction to Chef
kevsmith
 
Lessons from Etsy: Avoiding Kitchen Nightmares - #ChefConf 2012
Lessons from Etsy: Avoiding Kitchen Nightmares - #ChefConf 2012Lessons from Etsy: Avoiding Kitchen Nightmares - #ChefConf 2012
Lessons from Etsy: Avoiding Kitchen Nightmares - #ChefConf 2012
Patrick McDonnell
 
Configuration Management in a Containerized World
Configuration Management in a Containerized WorldConfiguration Management in a Containerized World
Configuration Management in a Containerized World
Julian Dunn
 
Chef basics - write infrastructure as code
Chef basics - write infrastructure as codeChef basics - write infrastructure as code
Chef basics - write infrastructure as code
stevaaa
 
Atmosphere 2014: Really large scale systems configuration - Phil Dibowitz
Atmosphere 2014: Really large scale systems configuration - Phil DibowitzAtmosphere 2014: Really large scale systems configuration - Phil Dibowitz
Atmosphere 2014: Really large scale systems configuration - Phil Dibowitz
PROIDEA
 
Michelin Starred Cooking with Chef
Michelin Starred Cooking with ChefMichelin Starred Cooking with Chef
Michelin Starred Cooking with Chef
Jon Cowie
 
Common configuration with Data Bags - Fundamentals Webinar Series Part 4
Common configuration with Data Bags - Fundamentals Webinar Series Part 4Common configuration with Data Bags - Fundamentals Webinar Series Part 4
Common configuration with Data Bags - Fundamentals Webinar Series Part 4
Chef
 

Similar to Cookbook refactoring & abstracting logic to Ruby(gems) (20)

What Makes a Good Cookbook?
What Makes a Good Cookbook?What Makes a Good Cookbook?
What Makes a Good Cookbook?
Julian Dunn
 
Cloud Automation with Opscode Chef
Cloud Automation with Opscode ChefCloud Automation with Opscode Chef
Cloud Automation with Opscode Chef
Sri Ram
 
Chef training - Day2
Chef training - Day2Chef training - Day2
Chef training - Day2
Andriy Samilyak
 
Configuration management with Chef
Configuration management with ChefConfiguration management with Chef
Configuration management with Chef
Juan Vicente Herrera Ruiz de Alejo
 
Cloud Automation with Opscode Chef
Cloud Automation with Opscode ChefCloud Automation with Opscode Chef
Cloud Automation with Opscode Chef
Sri Ram
 
Chef 0.8, Knife and Amazon EC2
Chef 0.8, Knife and Amazon EC2Chef 0.8, Knife and Amazon EC2
Chef 0.8, Knife and Amazon EC2
Robert Berger
 
Mojolicious
MojoliciousMojolicious
Mojolicious
Marcos Rebelo
 
Cooking 5 Star Infrastructure with Chef
Cooking 5 Star Infrastructure with ChefCooking 5 Star Infrastructure with Chef
Cooking 5 Star Infrastructure with Chef
G. Ryan Fawcett
 
BP-6 Repository Customization Best Practices
BP-6 Repository Customization Best PracticesBP-6 Repository Customization Best Practices
BP-6 Repository Customization Best Practices
Alfresco Software
 
Chef or how to make computers do the work for us
Chef or how to make computers do the work for usChef or how to make computers do the work for us
Chef or how to make computers do the work for us
sickill
 
DevOps Hackathon: Session 3 - Test Driven Infrastructure
DevOps Hackathon: Session 3 - Test Driven InfrastructureDevOps Hackathon: Session 3 - Test Driven Infrastructure
DevOps Hackathon: Session 3 - Test Driven Infrastructure
Antons Kranga
 
What Makes a Good Chef Cookbook? (May 2014 Edition)
What Makes a Good Chef Cookbook? (May 2014 Edition)What Makes a Good Chef Cookbook? (May 2014 Edition)
What Makes a Good Chef Cookbook? (May 2014 Edition)
Julian Dunn
 
Rails 3: Dashing to the Finish
Rails 3: Dashing to the FinishRails 3: Dashing to the Finish
Rails 3: Dashing to the Finish
Yehuda Katz
 
Bangpypers april-meetup-2012
Bangpypers april-meetup-2012Bangpypers april-meetup-2012
Bangpypers april-meetup-2012
Deepak Garg
 
On secure application of PHP wrappers
On secure application  of PHP wrappersOn secure application  of PHP wrappers
On secure application of PHP wrappers
Positive Hack Days
 
Learning Puppet basic thing
Learning Puppet basic thing Learning Puppet basic thing
Learning Puppet basic thing
DaeHyung Lee
 
Using Test Kitchen for testing Chef cookbooks
Using Test Kitchen for testing Chef cookbooksUsing Test Kitchen for testing Chef cookbooks
Using Test Kitchen for testing Chef cookbooks
Timur Batyrshin
 
Chef advance
Chef advanceChef advance
Chef advance
Ramesh Sencha
 
Chef advance
Chef advanceChef advance
Chef advance
Ramesh Sencha
 
Doing the Refactor Dance - Making Your Puppet Modules More Modular - PuppetCo...
Doing the Refactor Dance - Making Your Puppet Modules More Modular - PuppetCo...Doing the Refactor Dance - Making Your Puppet Modules More Modular - PuppetCo...
Doing the Refactor Dance - Making Your Puppet Modules More Modular - PuppetCo...
Puppet
 
What Makes a Good Cookbook?
What Makes a Good Cookbook?What Makes a Good Cookbook?
What Makes a Good Cookbook?
Julian Dunn
 
Cloud Automation with Opscode Chef
Cloud Automation with Opscode ChefCloud Automation with Opscode Chef
Cloud Automation with Opscode Chef
Sri Ram
 
Cloud Automation with Opscode Chef
Cloud Automation with Opscode ChefCloud Automation with Opscode Chef
Cloud Automation with Opscode Chef
Sri Ram
 
Chef 0.8, Knife and Amazon EC2
Chef 0.8, Knife and Amazon EC2Chef 0.8, Knife and Amazon EC2
Chef 0.8, Knife and Amazon EC2
Robert Berger
 
Cooking 5 Star Infrastructure with Chef
Cooking 5 Star Infrastructure with ChefCooking 5 Star Infrastructure with Chef
Cooking 5 Star Infrastructure with Chef
G. Ryan Fawcett
 
BP-6 Repository Customization Best Practices
BP-6 Repository Customization Best PracticesBP-6 Repository Customization Best Practices
BP-6 Repository Customization Best Practices
Alfresco Software
 
Chef or how to make computers do the work for us
Chef or how to make computers do the work for usChef or how to make computers do the work for us
Chef or how to make computers do the work for us
sickill
 
DevOps Hackathon: Session 3 - Test Driven Infrastructure
DevOps Hackathon: Session 3 - Test Driven InfrastructureDevOps Hackathon: Session 3 - Test Driven Infrastructure
DevOps Hackathon: Session 3 - Test Driven Infrastructure
Antons Kranga
 
What Makes a Good Chef Cookbook? (May 2014 Edition)
What Makes a Good Chef Cookbook? (May 2014 Edition)What Makes a Good Chef Cookbook? (May 2014 Edition)
What Makes a Good Chef Cookbook? (May 2014 Edition)
Julian Dunn
 
Rails 3: Dashing to the Finish
Rails 3: Dashing to the FinishRails 3: Dashing to the Finish
Rails 3: Dashing to the Finish
Yehuda Katz
 
Bangpypers april-meetup-2012
Bangpypers april-meetup-2012Bangpypers april-meetup-2012
Bangpypers april-meetup-2012
Deepak Garg
 
On secure application of PHP wrappers
On secure application  of PHP wrappersOn secure application  of PHP wrappers
On secure application of PHP wrappers
Positive Hack Days
 
Learning Puppet basic thing
Learning Puppet basic thing Learning Puppet basic thing
Learning Puppet basic thing
DaeHyung Lee
 
Using Test Kitchen for testing Chef cookbooks
Using Test Kitchen for testing Chef cookbooksUsing Test Kitchen for testing Chef cookbooks
Using Test Kitchen for testing Chef cookbooks
Timur Batyrshin
 
Doing the Refactor Dance - Making Your Puppet Modules More Modular - PuppetCo...
Doing the Refactor Dance - Making Your Puppet Modules More Modular - PuppetCo...Doing the Refactor Dance - Making Your Puppet Modules More Modular - PuppetCo...
Doing the Refactor Dance - Making Your Puppet Modules More Modular - PuppetCo...
Puppet
 
Ad

More from Chef Software, Inc. (20)

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...
Chef Software, Inc.
 
Chef Fundamentals Training Series Module 4: The Chef Client Run and Expanding...
Chef Fundamentals Training Series Module 4: The Chef Client Run and Expanding...Chef Fundamentals Training Series Module 4: The Chef Client Run and Expanding...
Chef Fundamentals Training Series Module 4: The Chef Client Run and Expanding...
Chef Software, Inc.
 
Chef Fundamentals Training Series Module 3: Setting up Nodes and Cookbook Aut...
Chef Fundamentals Training Series Module 3: Setting up Nodes and Cookbook Aut...Chef Fundamentals Training Series Module 3: Setting up Nodes and Cookbook Aut...
Chef Fundamentals Training Series Module 3: Setting up Nodes and Cookbook Aut...
Chef Software, Inc.
 
Chef Fundamentals Training Series Module 2: Workstation Setup
Chef Fundamentals Training Series Module 2: Workstation SetupChef Fundamentals Training Series Module 2: Workstation Setup
Chef Fundamentals Training Series Module 2: Workstation Setup
Chef Software, Inc.
 
Chef Fundamentals Training Series Module 1: Overview of Chef
Chef Fundamentals Training Series Module 1: Overview of ChefChef Fundamentals Training Series Module 1: Overview of Chef
Chef Fundamentals Training Series Module 1: Overview of Chef
Chef Software, Inc.
 
Opscode Webinar: Managing Your VMware Infrastructure with Chef
Opscode Webinar: Managing Your VMware Infrastructure with ChefOpscode Webinar: Managing Your VMware Infrastructure with Chef
Opscode Webinar: Managing Your VMware Infrastructure with Chef
Chef Software, Inc.
 
Opscode Webinar: Cooking with Chef on Microsoft Windows
Opscode Webinar: Cooking with Chef on Microsoft WindowsOpscode Webinar: Cooking with Chef on Microsoft Windows
Opscode Webinar: Cooking with Chef on Microsoft Windows
Chef Software, Inc.
 
Opscode tech festa july 2013
Opscode tech festa   july 2013Opscode tech festa   july 2013
Opscode tech festa july 2013
Chef Software, Inc.
 
Opscode Webinar: Automation for Education May 08-2013
Opscode Webinar: Automation for Education May 08-2013Opscode Webinar: Automation for Education May 08-2013
Opscode Webinar: Automation for Education May 08-2013
Chef Software, Inc.
 
Utility HPC: Right Systems, Right Scale, Right Science
Utility HPC: Right Systems, Right Scale, Right ScienceUtility HPC: Right Systems, Right Scale, Right Science
Utility HPC: Right Systems, Right Scale, Right Science
Chef Software, Inc.
 
Using Kanban and Chef: A Case Study – Jeffrey Hulten
Using Kanban and Chef: A Case Study – Jeffrey HultenUsing Kanban and Chef: A Case Study – Jeffrey Hulten
Using Kanban and Chef: A Case Study – Jeffrey Hulten
Chef Software, Inc.
 
SDN, Network Virtualization and the Software Defined Data Center – Brad Hedlund
SDN, Network Virtualization and the Software Defined Data Center – Brad HedlundSDN, Network Virtualization and the Software Defined Data Center – Brad Hedlund
SDN, Network Virtualization and the Software Defined Data Center – Brad Hedlund
Chef Software, Inc.
 
ChefConf 2013 Keynote Session – Opscode – Adam Jacob
ChefConf 2013 Keynote Session – Opscode – Adam JacobChefConf 2013 Keynote Session – Opscode – Adam Jacob
ChefConf 2013 Keynote Session – Opscode – Adam Jacob
Chef Software, Inc.
 
Using Chef and AppFirst to Automate Scale-out/Scale-down of Web Applications ...
Using Chef and AppFirst to Automate Scale-out/Scale-down of Web Applications ...Using Chef and AppFirst to Automate Scale-out/Scale-down of Web Applications ...
Using Chef and AppFirst to Automate Scale-out/Scale-down of Web Applications ...
Chef Software, Inc.
 
The InstallShield of the 21st Century – Theo Schlossnagle
The InstallShield of the 21st Century – Theo SchlossnagleThe InstallShield of the 21st Century – Theo Schlossnagle
The InstallShield of the 21st Century – Theo Schlossnagle
Chef Software, Inc.
 
Chef ignited a DevOps revolution – BK Box
Chef ignited a DevOps revolution – BK BoxChef ignited a DevOps revolution – BK Box
Chef ignited a DevOps revolution – BK Box
Chef Software, Inc.
 
The unintended benefits of Chef
The unintended benefits of ChefThe unintended benefits of Chef
The unintended benefits of Chef
Chef Software, Inc.
 
Push jobs: an orchestration building block for private Chef
Push jobs: an orchestration building block for private ChefPush jobs: an orchestration building block for private Chef
Push jobs: an orchestration building block for private Chef
Chef Software, Inc.
 
Multi-provider Vagrant and Chef: AWS, VMware, and more
Multi-provider Vagrant and Chef: AWS, VMware, and moreMulti-provider Vagrant and Chef: AWS, VMware, and more
Multi-provider Vagrant and Chef: AWS, VMware, and more
Chef Software, Inc.
 
Welcome to the IT Industrial Revolution! Are you ready?
Welcome to the IT Industrial Revolution! Are you ready?Welcome to the IT Industrial Revolution! Are you ready?
Welcome to the IT Industrial Revolution! Are you ready?
Chef Software, Inc.
 
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...
Chef Software, Inc.
 
Chef Fundamentals Training Series Module 4: The Chef Client Run and Expanding...
Chef Fundamentals Training Series Module 4: The Chef Client Run and Expanding...Chef Fundamentals Training Series Module 4: The Chef Client Run and Expanding...
Chef Fundamentals Training Series Module 4: The Chef Client Run and Expanding...
Chef Software, Inc.
 
Chef Fundamentals Training Series Module 3: Setting up Nodes and Cookbook Aut...
Chef Fundamentals Training Series Module 3: Setting up Nodes and Cookbook Aut...Chef Fundamentals Training Series Module 3: Setting up Nodes and Cookbook Aut...
Chef Fundamentals Training Series Module 3: Setting up Nodes and Cookbook Aut...
Chef Software, Inc.
 
Chef Fundamentals Training Series Module 2: Workstation Setup
Chef Fundamentals Training Series Module 2: Workstation SetupChef Fundamentals Training Series Module 2: Workstation Setup
Chef Fundamentals Training Series Module 2: Workstation Setup
Chef Software, Inc.
 
Chef Fundamentals Training Series Module 1: Overview of Chef
Chef Fundamentals Training Series Module 1: Overview of ChefChef Fundamentals Training Series Module 1: Overview of Chef
Chef Fundamentals Training Series Module 1: Overview of Chef
Chef Software, Inc.
 
Opscode Webinar: Managing Your VMware Infrastructure with Chef
Opscode Webinar: Managing Your VMware Infrastructure with ChefOpscode Webinar: Managing Your VMware Infrastructure with Chef
Opscode Webinar: Managing Your VMware Infrastructure with Chef
Chef Software, Inc.
 
Opscode Webinar: Cooking with Chef on Microsoft Windows
Opscode Webinar: Cooking with Chef on Microsoft WindowsOpscode Webinar: Cooking with Chef on Microsoft Windows
Opscode Webinar: Cooking with Chef on Microsoft Windows
Chef Software, Inc.
 
Opscode Webinar: Automation for Education May 08-2013
Opscode Webinar: Automation for Education May 08-2013Opscode Webinar: Automation for Education May 08-2013
Opscode Webinar: Automation for Education May 08-2013
Chef Software, Inc.
 
Utility HPC: Right Systems, Right Scale, Right Science
Utility HPC: Right Systems, Right Scale, Right ScienceUtility HPC: Right Systems, Right Scale, Right Science
Utility HPC: Right Systems, Right Scale, Right Science
Chef Software, Inc.
 
Using Kanban and Chef: A Case Study – Jeffrey Hulten
Using Kanban and Chef: A Case Study – Jeffrey HultenUsing Kanban and Chef: A Case Study – Jeffrey Hulten
Using Kanban and Chef: A Case Study – Jeffrey Hulten
Chef Software, Inc.
 
SDN, Network Virtualization and the Software Defined Data Center – Brad Hedlund
SDN, Network Virtualization and the Software Defined Data Center – Brad HedlundSDN, Network Virtualization and the Software Defined Data Center – Brad Hedlund
SDN, Network Virtualization and the Software Defined Data Center – Brad Hedlund
Chef Software, Inc.
 
ChefConf 2013 Keynote Session – Opscode – Adam Jacob
ChefConf 2013 Keynote Session – Opscode – Adam JacobChefConf 2013 Keynote Session – Opscode – Adam Jacob
ChefConf 2013 Keynote Session – Opscode – Adam Jacob
Chef Software, Inc.
 
Using Chef and AppFirst to Automate Scale-out/Scale-down of Web Applications ...
Using Chef and AppFirst to Automate Scale-out/Scale-down of Web Applications ...Using Chef and AppFirst to Automate Scale-out/Scale-down of Web Applications ...
Using Chef and AppFirst to Automate Scale-out/Scale-down of Web Applications ...
Chef Software, Inc.
 
The InstallShield of the 21st Century – Theo Schlossnagle
The InstallShield of the 21st Century – Theo SchlossnagleThe InstallShield of the 21st Century – Theo Schlossnagle
The InstallShield of the 21st Century – Theo Schlossnagle
Chef Software, Inc.
 
Chef ignited a DevOps revolution – BK Box
Chef ignited a DevOps revolution – BK BoxChef ignited a DevOps revolution – BK Box
Chef ignited a DevOps revolution – BK Box
Chef Software, Inc.
 
Push jobs: an orchestration building block for private Chef
Push jobs: an orchestration building block for private ChefPush jobs: an orchestration building block for private Chef
Push jobs: an orchestration building block for private Chef
Chef Software, Inc.
 
Multi-provider Vagrant and Chef: AWS, VMware, and more
Multi-provider Vagrant and Chef: AWS, VMware, and moreMulti-provider Vagrant and Chef: AWS, VMware, and more
Multi-provider Vagrant and Chef: AWS, VMware, and more
Chef Software, Inc.
 
Welcome to the IT Industrial Revolution! Are you ready?
Welcome to the IT Industrial Revolution! Are you ready?Welcome to the IT Industrial Revolution! Are you ready?
Welcome to the IT Industrial Revolution! Are you ready?
Chef Software, Inc.
 
Ad

Recently uploaded (20)

Talentsskskaskkakakakak Aquisition OEC108.pptx
Talentsskskaskkakakakak Aquisition OEC108.pptxTalentsskskaskkakakakak Aquisition OEC108.pptx
Talentsskskaskkakakakak Aquisition OEC108.pptx
sriyansh4443
 
mr discrimination________________________________________________________1111...
mr discrimination________________________________________________________1111...mr discrimination________________________________________________________1111...
mr discrimination________________________________________________________1111...
Leonid Ledata
 
Prelims Saarang IITM Chennai Finals+ Answers.pptx
Prelims Saarang IITM Chennai Finals+ Answers.pptxPrelims Saarang IITM Chennai Finals+ Answers.pptx
Prelims Saarang IITM Chennai Finals+ Answers.pptx
gabssienna0o
 
mr discrimination________________________________________________________1111...
mr discrimination________________________________________________________1111...mr discrimination________________________________________________________1111...
mr discrimination________________________________________________________1111...
Leonid Ledata
 
Jeopardy halloween game for esl students
Jeopardy halloween game for esl studentsJeopardy halloween game for esl students
Jeopardy halloween game for esl students
JohanOrtega18
 
西班牙阿利坎特大学毕业证书留信网认证UA成绩单办本科学位证
西班牙阿利坎特大学毕业证书留信网认证UA成绩单办本科学位证西班牙阿利坎特大学毕业证书留信网认证UA成绩单办本科学位证
西班牙阿利坎特大学毕业证书留信网认证UA成绩单办本科学位证
taqyea
 
Stray Kids Powerpoint template guide to skz
Stray Kids Powerpoint template guide to skzStray Kids Powerpoint template guide to skz
Stray Kids Powerpoint template guide to skz
izabelucu
 
mr discrimination________________________________________________________1111...
mr discrimination________________________________________________________1111...mr discrimination________________________________________________________1111...
mr discrimination________________________________________________________1111...
Leonid Ledata
 
Jeopardy u.s. independece day game for esl students
Jeopardy  u.s. independece day game for esl studentsJeopardy  u.s. independece day game for esl students
Jeopardy u.s. independece day game for esl students
JohanOrtega18
 
Who is Advoree Her Rise, Struggles .pdf
Who is Advoree Her Rise, Struggles       .pdfWho is Advoree Her Rise, Struggles       .pdf
Who is Advoree Her Rise, Struggles .pdf
Psshunt
 
A Hypothetical ad for ether a Video Game, TV show, Movie.
A Hypothetical ad for ether a Video Game, TV show,  Movie.A Hypothetical ad for ether a Video Game, TV show,  Movie.
A Hypothetical ad for ether a Video Game, TV show, Movie.
skylarleakeybusiness
 
Best IPTV Provider 2025 Top 5 Ranked IPTV Subscriptions.pdf
Best IPTV Provider 2025 Top 5 Ranked IPTV Subscriptions.pdfBest IPTV Provider 2025 Top 5 Ranked IPTV Subscriptions.pdf
Best IPTV Provider 2025 Top 5 Ranked IPTV Subscriptions.pdf
MimounKhamhand1
 
ch11.pptKGYUTFYDRERLJIOUY7T867RVHOJIP09-IU08Y7GTFGYU890-I90UIYGUI
ch11.pptKGYUTFYDRERLJIOUY7T867RVHOJIP09-IU08Y7GTFGYU890-I90UIYGUIch11.pptKGYUTFYDRERLJIOUY7T867RVHOJIP09-IU08Y7GTFGYU890-I90UIYGUI
ch11.pptKGYUTFYDRERLJIOUY7T867RVHOJIP09-IU08Y7GTFGYU890-I90UIYGUI
Abodahab
 
1st-Course.pdf fdnxhsgsgsegessgrrhrhdgrhed
1st-Course.pdf fdnxhsgsgsegessgrrhrhdgrhed1st-Course.pdf fdnxhsgsgsegessgrrhrhdgrhed
1st-Course.pdf fdnxhsgsgsegessgrrhrhdgrhed
evelynoor
 
mr discrimination________________________________________________________.pdf
mr discrimination________________________________________________________.pdfmr discrimination________________________________________________________.pdf
mr discrimination________________________________________________________.pdf
Leonid Ledata
 
Pension-Rules-1-2021040512 0919.ppt
Pension-Rules-1-2021040512      0919.pptPension-Rules-1-2021040512      0919.ppt
Pension-Rules-1-2021040512 0919.ppt
SwathyKrishna55
 
Khloé Kardashian Biography The Celeb Post
Khloé Kardashian Biography The Celeb PostKhloé Kardashian Biography The Celeb Post
Khloé Kardashian Biography The Celeb Post
Lionapk
 
Travis Kelce Life Biography The Celeb Post
Travis Kelce Life Biography The Celeb PostTravis Kelce Life Biography The Celeb Post
Travis Kelce Life Biography The Celeb Post
Lionapk
 
Movement intervention in sepecial population children .pptx
Movement intervention in sepecial population children .pptxMovement intervention in sepecial population children .pptx
Movement intervention in sepecial population children .pptx
nakisanianeani
 
1883 Season 2_ What’s Really Going On With the Yellowstone Prequel.docx
1883 Season 2_ What’s Really Going On With the Yellowstone Prequel.docx1883 Season 2_ What’s Really Going On With the Yellowstone Prequel.docx
1883 Season 2_ What’s Really Going On With the Yellowstone Prequel.docx
voice ofarticle
 
Talentsskskaskkakakakak Aquisition OEC108.pptx
Talentsskskaskkakakakak Aquisition OEC108.pptxTalentsskskaskkakakakak Aquisition OEC108.pptx
Talentsskskaskkakakakak Aquisition OEC108.pptx
sriyansh4443
 
mr discrimination________________________________________________________1111...
mr discrimination________________________________________________________1111...mr discrimination________________________________________________________1111...
mr discrimination________________________________________________________1111...
Leonid Ledata
 
Prelims Saarang IITM Chennai Finals+ Answers.pptx
Prelims Saarang IITM Chennai Finals+ Answers.pptxPrelims Saarang IITM Chennai Finals+ Answers.pptx
Prelims Saarang IITM Chennai Finals+ Answers.pptx
gabssienna0o
 
mr discrimination________________________________________________________1111...
mr discrimination________________________________________________________1111...mr discrimination________________________________________________________1111...
mr discrimination________________________________________________________1111...
Leonid Ledata
 
Jeopardy halloween game for esl students
Jeopardy halloween game for esl studentsJeopardy halloween game for esl students
Jeopardy halloween game for esl students
JohanOrtega18
 
西班牙阿利坎特大学毕业证书留信网认证UA成绩单办本科学位证
西班牙阿利坎特大学毕业证书留信网认证UA成绩单办本科学位证西班牙阿利坎特大学毕业证书留信网认证UA成绩单办本科学位证
西班牙阿利坎特大学毕业证书留信网认证UA成绩单办本科学位证
taqyea
 
Stray Kids Powerpoint template guide to skz
Stray Kids Powerpoint template guide to skzStray Kids Powerpoint template guide to skz
Stray Kids Powerpoint template guide to skz
izabelucu
 
mr discrimination________________________________________________________1111...
mr discrimination________________________________________________________1111...mr discrimination________________________________________________________1111...
mr discrimination________________________________________________________1111...
Leonid Ledata
 
Jeopardy u.s. independece day game for esl students
Jeopardy  u.s. independece day game for esl studentsJeopardy  u.s. independece day game for esl students
Jeopardy u.s. independece day game for esl students
JohanOrtega18
 
Who is Advoree Her Rise, Struggles .pdf
Who is Advoree Her Rise, Struggles       .pdfWho is Advoree Her Rise, Struggles       .pdf
Who is Advoree Her Rise, Struggles .pdf
Psshunt
 
A Hypothetical ad for ether a Video Game, TV show, Movie.
A Hypothetical ad for ether a Video Game, TV show,  Movie.A Hypothetical ad for ether a Video Game, TV show,  Movie.
A Hypothetical ad for ether a Video Game, TV show, Movie.
skylarleakeybusiness
 
Best IPTV Provider 2025 Top 5 Ranked IPTV Subscriptions.pdf
Best IPTV Provider 2025 Top 5 Ranked IPTV Subscriptions.pdfBest IPTV Provider 2025 Top 5 Ranked IPTV Subscriptions.pdf
Best IPTV Provider 2025 Top 5 Ranked IPTV Subscriptions.pdf
MimounKhamhand1
 
ch11.pptKGYUTFYDRERLJIOUY7T867RVHOJIP09-IU08Y7GTFGYU890-I90UIYGUI
ch11.pptKGYUTFYDRERLJIOUY7T867RVHOJIP09-IU08Y7GTFGYU890-I90UIYGUIch11.pptKGYUTFYDRERLJIOUY7T867RVHOJIP09-IU08Y7GTFGYU890-I90UIYGUI
ch11.pptKGYUTFYDRERLJIOUY7T867RVHOJIP09-IU08Y7GTFGYU890-I90UIYGUI
Abodahab
 
1st-Course.pdf fdnxhsgsgsegessgrrhrhdgrhed
1st-Course.pdf fdnxhsgsgsegessgrrhrhdgrhed1st-Course.pdf fdnxhsgsgsegessgrrhrhdgrhed
1st-Course.pdf fdnxhsgsgsegessgrrhrhdgrhed
evelynoor
 
mr discrimination________________________________________________________.pdf
mr discrimination________________________________________________________.pdfmr discrimination________________________________________________________.pdf
mr discrimination________________________________________________________.pdf
Leonid Ledata
 
Pension-Rules-1-2021040512 0919.ppt
Pension-Rules-1-2021040512      0919.pptPension-Rules-1-2021040512      0919.ppt
Pension-Rules-1-2021040512 0919.ppt
SwathyKrishna55
 
Khloé Kardashian Biography The Celeb Post
Khloé Kardashian Biography The Celeb PostKhloé Kardashian Biography The Celeb Post
Khloé Kardashian Biography The Celeb Post
Lionapk
 
Travis Kelce Life Biography The Celeb Post
Travis Kelce Life Biography The Celeb PostTravis Kelce Life Biography The Celeb Post
Travis Kelce Life Biography The Celeb Post
Lionapk
 
Movement intervention in sepecial population children .pptx
Movement intervention in sepecial population children .pptxMovement intervention in sepecial population children .pptx
Movement intervention in sepecial population children .pptx
nakisanianeani
 
1883 Season 2_ What’s Really Going On With the Yellowstone Prequel.docx
1883 Season 2_ What’s Really Going On With the Yellowstone Prequel.docx1883 Season 2_ What’s Really Going On With the Yellowstone Prequel.docx
1883 Season 2_ What’s Really Going On With the Yellowstone Prequel.docx
voice ofarticle
 

Cookbook refactoring & abstracting logic to Ruby(gems)