SlideShare ist ein Scribd-Unternehmen logo
1 von 32
Downloaden Sie, um offline zu lesen
ORCHESTRATED FUNCTIONAL 
TESTING WITH PUPPET-SPEC 
AND MSPECTATOR 
RAPHAËL PINSON
Who am I? 
Raphaël Pinson (@raphink) 
■ Infrastructure Developer & Trainer @ Camptocamp 
■ Augeas & Augeasproviders developer 
■ Various contributions to Puppet & ecosystem 
www.camptocamp.com / 2/32
Monitoring vs. Functional Tests 
Complementary or redundant? 
www.camptocamp.com / 3/32
Conformity Tests 
■ Check if machines comply to standards 
■ Avoid permanent heavy monitoring checks 
■ Tests must be inter-dependent 
■ Focus on getting sysadmins to fix one thing at a time to converge 
toward standards 
www.camptocamp.com / 4/32
Treetester 
■ Back in 2008 
■ Written in Perl 
■ Orchestrate conformity tests on a 4k+ server fleet 
www.camptocamp.com / 5/32
Treetester: modules output 
■ For all hosts/modules 
■ Number of hosts filtered per module 
■ Modules dependency tree 
■ Colors by priority 
www.camptocamp.com / 6/32
Treetester: host output 
■ For each host 
■ Failed steps in the module tree 
■ Green: OK, Red: KO, Purple: Ignored 
www.camptocamp.com / 7/32
Treetester architecture 
■ All data in a database (MySQL) 
■ Tests scripts output YAML 
■ Tests scripts can be local (hosts as STDIN) or remote (ssh or http) 
■ Tests are inter-dependent 
■ Generate filtered data as a tree 
■ Generate graphs (graphviz) 
www.camptocamp.com / 8/32
Treetester filters 
■ For each test/module 
■ Based on data in MySQL (joins and additional SQL conditions) 
■ Allows to link tests to each other 
■ Like multiple sieves 
www.camptocamp.com / 9/32
Treetester: future? 
■ Not open-sourced :'-( 
■ Too monolithic/not flexible enough 
■ Heavily linked to specific architecture 
■ Needed a rewrite 
www.camptocamp.com / 10/32
Adding specs to Puppet runs 
■ Testing the catalog before it gets applied 
■ Testing the node after the catalog is applied 
Enter the Puppet-spec module 
www.camptocamp.com / 11/32
Rspec-puppet 
■ http://rspec-puppet.com 
■ Now the standard to unit test Puppet manifests 
■ Generates catalogs in clean environments 
■ Asserts catalogs for resources/classes 
require 'spec_helper' 
describe 'logrotate::rule' do 
let(:title) { 'nginx' } 
it { should compile.with_all_deps } 
it { should contain_class('logrotate::setup') } 
end 
www.camptocamp.com / 12/32
Puppet-spec 
■ Runs tests from within Puppet runs 
■ Test catalogs using rspec-puppet 
■ Test hosts using serverspec 
www.camptocamp.com / 13/32
Puppet-spec: Unit testing 
■ Catalog exposed by PuppetSpec::Catalog.instance.catalog 
■ Uses rspec-puppet matchers 
■ Asserts real catalogs 
■ Runs on the master or agent side (as catalog indirection terminii) 
describe 'puppet' do 
subject { PuppetSpec::Catalog.instance.catalog } 
it { should contain_package('puppet') } 
it { should contain_package('ppet') } 
it { should include_class('puppet') } 
it { should include_class('puppet::client::base') } 
end 
www.camptocamp.com / 14/32
Puppet-spec: Unit tests output 
# puppet agent -t 
info: Retrieving plugin 
err: Could not retrieve catalog from remote server: Unit tests failed: 
F.. 
Failures: 
1) package 
Failure/Error: it { should contain_package('augeas') } 
expected that the catalogue would contain Package[augeas] 
# /var/lib/puppet/lib/spec/class/augeas/package_spec.rb:3 
# /var/lib/puppet/lib/puppet/indirector/catalog/rest_spec.rb:31:in `find' 
Finished in 0.00092 seconds 
3 examples, 1 failure 
Failed examples: 
rspec /var/lib/puppet/lib/spec/class/augeas/package_spec.rb:3 # package 
info: Not using expired catalog for foo.example.com from cache; expired at Tue Apr 02 17:40:21 +0200 2013 
notice: Using cached catalog 
www.camptocamp.com / 15/32
Puppet-spec: Deploying unit tests 
■ On the master side: 
○ Tests are located in the spec/catalog/class directory of the 
environment 
○ Only the directories named after classes declared in the catalog 
are tested 
■ On the agent side: 
○ Deploy tests using pluginsync 
○ Tests are located in the lib/spec/catalog/class directory of each 
module 
○ Only the directories named after classes declared in the catalog 
are tested 
www.camptocamp.com / 16/32
Puppet-spec: Unit tests limits 
■ When to apply the tests (currently based on class names) 
■ Tests on master, or need to deploy all tests with pluginsync 
■ Redundant with existing unit tests, or additional security? 
www.camptocamp.com / 17/32
Puppet-spec: Setting up Unit testing 
■ Tests achieved from catalog indirection terminii 
■ Plugins (terminii) deployed with pluginsync 
■ Setup done in routes.yaml: 
agent: 
catalog: 
# Either on the agent side 
terminus: rest_spec 
cache: yaml 
master: 
catalog: 
# Or on the master side 
terminus: compiler_spec 
www.camptocamp.com / 18/32
Serverspec 
■ http://serverspec.org 
■ Provides RSpec matchers for local functional tests (packages, 
users, services, ports, etc.) 
■ Independant from configuration management tools 
require 'spec_helper' 
describe service('httpd') do 
it { should be_enabled } 
it { should be_running } 
end 
describe port(80) do 
it { should be_listening } 
end 
describe file('/etc/httpd/conf/httpd.conf') do 
it { should be_file } 
its(:content) { should match /ServerName www.example.jp/ } 
end 
www.camptocamp.com / 19/32
Serverspec backends 
Allows to use various means of launching tests: 
■ SSH (default) 
■ Exec 
■ Puppet (RAL, removed from core) 
$ serverspec-init 
Select OS type: 
1) UN*X 
2) Windows 
Select number: 1 
Select a backend type: 
1) SSH 
2) Exec (local) 
Select number: 1 
www.camptocamp.com / 20/32
Puppet-spec: Functional testing 
■ Uses serverspec/specinfra matchers 
■ Tests the machine state (not the catalog) 
require 'spec_helper' 
describe service('httpd') do 
it { should be_enabled } 
it { should be_running } 
end 
describe port(80) do 
it { should be_listening } 
end 
describe file('/etc/httpd/conf/httpd.conf') do 
it { should be_file } 
its(:content) { should match /ServerName www.example.jp/ } 
end 
www.camptocamp.com / 21/32
Puppet-spec: Function tests output 
# puppet agent -t 
info: Retrieving plugin 
info: Caching catalog for foo.example.com 
info: Applying configuration version 'raphink/a2c8e0f [+]' 
... Applying changes ... 
notice: Finished catalog run in 59.19 seconds 
err: Could not send report: Unit tests failed: 
FF 
Failures: 
1) augeas 
Failure/Error: it { should be_installed } 
expected "augeas" to be installed 
# /var/lib/puppet/lib/spec/server/class/foo.example.com/package_spec.rb:2 
# /var/lib/puppet/lib/puppet/indirector/report/rest_spec.rb:45:in `save' 
2) /usr/share/augeas/lenses/dist 
Failure/Error: it { should be_file } 
expected "/usr/share/augeas/lenses/dist" to be file 
# /var/lib/puppet/lib/spec/server/class/foo.example.com/package_spec.rb:6 
# /var/lib/puppet/lib/puppet/indirector/report/rest_spec.rb:45:in `save' 
Finished in 0.06033 seconds 
2 examples, 2 failures 
Failed examples: 
rspec /var/lib/puppet/lib/spec/server/class/foo.example.com/package_spec.rb:2 # augeas 
rspec /var/lib/puppet/lib/spec/server/class/foo.example.com/package_spec.rb:6 # /usr/share/augeas/lenses/www.camptocamp.com / 22/32
Puppet-spec: Deploying functional 
tests 
■ Tests are run after catalog application 
■ Tests can be distributed via pluginsync (in the spec/server/class) 
directory of each module 
■ Tests can be distributed with file Puppet resources, optionally 
using the spec::serverspec defined resource type 
www.camptocamp.com / 23/32
Puppet-spec: MCollective agent 
■ Communicates with distant nodes 
■ Sends action and values to specinfra check commands 
■ Does not implement serverspec syntax 
■ Returns true/false 
■ Uses MCollective as transport (instead of SSH) 
Examples: 
$ mco rpc spec check action=user values=rpinson 
$ mco rpc spec check action=file values=/etc/passwd 
$ mco rpc spec check action=resolvable values=google.fr,A 
$ mco rpc spec check action=listening values=80 
$ mco rpc spec check action=process values=mcollectived 
$ mco rpc spec check action=file_contain values=/etc/passwd,rpinson 
www.camptocamp.com / 24/32
Mspectator 
■ https://github.com/raphink/mspectator 
■ RSpec matchers 
■ Calls MCollective to achieve tests 
■ Uses MCollective spec agent (among others) 
www.camptocamp.com / 25/32
Mspectator architecture 
■ Client runs RSpec 
■ RSpec calls MCollective 
■ MCollective calls distant spec agent 
■ spec agent calls specinfra backend 
www.camptocamp.com / 26/32
Mspectator syntax 
Own matchers, mapping to specinfra backend methods: 
require 'mspectator' 
describe 'apache' do 
it { should find_nodes(100).or_less } # Counts discovered nodes 
it { should pass_puppet_spec } # Runs the `spec` agent 
it { should have_certificate.signed } # Uses the `puppetca` agent 
context 'when on Debian', 
:facts => { :operatingsystem => 'Debian' } do # Filter by facts 
it { should find_nodes(5).with_agent('spec') } 
it { should have_package('apache2.2-common') } 
it { should_not have_package('httpd') } 
it { should have_service('apache2').with( 
:ensure => 'running' 
) } 
it { should have_file('/etc/apache2/apache2.conf') } 
it { should have_directory('/etc/apache2/conf.d') } 
it { should have_user('www-data') } 
end 
context 'when using SSL', :classes => ['apache::ssl'] do # Filter by classes 
it { should find_nodes(50).or_more } 
it { should have_package('ca-certificates') } 
end 
end 
www.camptocamp.com / 27/32
Mspectator output 
$ rake spec SPEC=apache_spec.rb 
/home/rpinson/.rvm/rubies/ruby-1.8.7-p371/bin/ruby -S rspec apache_spec.rb 
apache 
should find nodes 100 
should pass puppet spec (FAILED - 1) 
should have certificate 
when on Debian 
should find nodes 5 (FAILED - 2) 
... 
when using SSL 
should find nodes 50 (FAILED - 3) 
No request sent, we did not discover any nodes. should have package "ca-certificates" 
Failures: 
1) apache 
Failure/Error: it { should pass_puppet_spec } 
expected that all hosts would pass tests, the following didn't: 
soekris01.wrk.cby.camptocamp.com: 
soekris02.wrk.cby.camptocamp.com: 
# ./apache_spec.rb:5 
... 
www.camptocamp.com / 28/32
Mspectator demo 
www.camptocamp.com / 29/32
Contribute 
On GitHub: 
■ puppet-spec: https://github.com/raphink/puppet-spec 
■ mspectator: https://github.com/raphink/mspectator 
www.camptocamp.com / 30/32
Thank you! 
■ raphael.pinson@camptocamp.com 
■ @raphink on Twitter/Github 
■ raphink on Freenode 
■ Slides: slideshare.net/raphink 
www.camptocamp.com / 31/32
Orchestrated Functional Testing with Puppet-spec and Mspectator - PuppetConf 2014

Weitere ähnliche Inhalte

Was ist angesagt?

OpenNebula and SaltStack - OpenNebulaConf 2013
OpenNebula and SaltStack - OpenNebulaConf 2013OpenNebula and SaltStack - OpenNebulaConf 2013
OpenNebula and SaltStack - OpenNebulaConf 2013
databus.pro
 

Was ist angesagt? (20)

Building and Testing from Scratch a Puppet Environment with Docker - PuppetCo...
Building and Testing from Scratch a Puppet Environment with Docker - PuppetCo...Building and Testing from Scratch a Puppet Environment with Docker - PuppetCo...
Building and Testing from Scratch a Puppet Environment with Docker - PuppetCo...
 
Puppet loves RSpec, why you should, too
Puppet loves RSpec, why you should, tooPuppet loves RSpec, why you should, too
Puppet loves RSpec, why you should, too
 
Testing for Ops: Going Beyond the Manifest - PuppetConf 2013
Testing for Ops: Going Beyond the Manifest - PuppetConf 2013Testing for Ops: Going Beyond the Manifest - PuppetConf 2013
Testing for Ops: Going Beyond the Manifest - PuppetConf 2013
 
Modern Infrastructure from Scratch with Puppet
Modern Infrastructure from Scratch with PuppetModern Infrastructure from Scratch with Puppet
Modern Infrastructure from Scratch with Puppet
 
Bootstrapping Puppet and Application Deployment - PuppetConf 2013
Bootstrapping Puppet and Application Deployment - PuppetConf 2013Bootstrapping Puppet and Application Deployment - PuppetConf 2013
Bootstrapping Puppet and Application Deployment - PuppetConf 2013
 
Orchestrated Functional Testing with Puppet-spec and Mspectator
Orchestrated Functional Testing with Puppet-spec and MspectatorOrchestrated Functional Testing with Puppet-spec and Mspectator
Orchestrated Functional Testing with Puppet-spec and Mspectator
 
Puppet meetup testing
Puppet meetup testingPuppet meetup testing
Puppet meetup testing
 
Test-Driven Infrastructure with Ansible, Test Kitchen, Serverspec and RSpec
Test-Driven Infrastructure with Ansible, Test Kitchen, Serverspec and RSpecTest-Driven Infrastructure with Ansible, Test Kitchen, Serverspec and RSpec
Test-Driven Infrastructure with Ansible, Test Kitchen, Serverspec and RSpec
 
Workshop: Know Before You Push 'Go': Using the Beaker Acceptance Test Framewo...
Workshop: Know Before You Push 'Go': Using the Beaker Acceptance Test Framewo...Workshop: Know Before You Push 'Go': Using the Beaker Acceptance Test Framewo...
Workshop: Know Before You Push 'Go': Using the Beaker Acceptance Test Framewo...
 
Testing Your Automation Code (Docker Version)
Testing Your Automation Code (Docker Version)Testing Your Automation Code (Docker Version)
Testing Your Automation Code (Docker Version)
 
Test driven infrastructure
Test driven infrastructureTest driven infrastructure
Test driven infrastructure
 
The Challenges of Container Configuration
The Challenges of Container ConfigurationThe Challenges of Container Configuration
The Challenges of Container Configuration
 
Cookbook testing with KitcenCI and Serverrspec
Cookbook testing with KitcenCI and ServerrspecCookbook testing with KitcenCI and Serverrspec
Cookbook testing with KitcenCI and Serverrspec
 
Test Driven Infrastructure with Docker, Test Kitchen and Serverspec
Test Driven Infrastructure with Docker, Test Kitchen and ServerspecTest Driven Infrastructure with Docker, Test Kitchen and Serverspec
Test Driven Infrastructure with Docker, Test Kitchen and Serverspec
 
London Hashicorp Meetup #8 - Testing Programmable Infrastructure By Matt Long
London Hashicorp Meetup #8 -  Testing Programmable Infrastructure By Matt LongLondon Hashicorp Meetup #8 -  Testing Programmable Infrastructure By Matt Long
London Hashicorp Meetup #8 - Testing Programmable Infrastructure By Matt Long
 
OpenNebula and SaltStack - OpenNebulaConf 2013
OpenNebula and SaltStack - OpenNebulaConf 2013OpenNebula and SaltStack - OpenNebulaConf 2013
OpenNebula and SaltStack - OpenNebulaConf 2013
 
Puppet for dummies - ZendCon 2011 Edition
Puppet for dummies - ZendCon 2011 EditionPuppet for dummies - ZendCon 2011 Edition
Puppet for dummies - ZendCon 2011 Edition
 
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
 
Portland PUG April 2014: Beaker 101: Acceptance Test Everything
Portland PUG April 2014: Beaker 101: Acceptance Test EverythingPortland PUG April 2014: Beaker 101: Acceptance Test Everything
Portland PUG April 2014: Beaker 101: Acceptance Test Everything
 
Introduction to Ansible (Pycon7 2016)
Introduction to Ansible (Pycon7 2016)Introduction to Ansible (Pycon7 2016)
Introduction to Ansible (Pycon7 2016)
 

Ähnlich wie Orchestrated Functional Testing with Puppet-spec and Mspectator - PuppetConf 2014

Puppet camp chicago-automated_testing2
Puppet camp chicago-automated_testing2Puppet camp chicago-automated_testing2
Puppet camp chicago-automated_testing2
nottings
 
Provisioning with Puppet
Provisioning with PuppetProvisioning with Puppet
Provisioning with Puppet
Joe Ray
 

Ähnlich wie Orchestrated Functional Testing with Puppet-spec and Mspectator - PuppetConf 2014 (20)

Puppet
PuppetPuppet
Puppet
 
Test-Driven Puppet Development - PuppetConf 2014
Test-Driven Puppet Development - PuppetConf 2014Test-Driven Puppet Development - PuppetConf 2014
Test-Driven Puppet Development - PuppetConf 2014
 
More on bpftrace for MariaDB DBAs and Developers - FOSDEM 2022 MariaDB Devroom
More on bpftrace for MariaDB DBAs and Developers - FOSDEM 2022 MariaDB DevroomMore on bpftrace for MariaDB DBAs and Developers - FOSDEM 2022 MariaDB Devroom
More on bpftrace for MariaDB DBAs and Developers - FOSDEM 2022 MariaDB Devroom
 
From SaltStack to Puppet and beyond...
From SaltStack to Puppet and beyond...From SaltStack to Puppet and beyond...
From SaltStack to Puppet and beyond...
 
Continuous Delivery: The Next Frontier
Continuous Delivery: The Next FrontierContinuous Delivery: The Next Frontier
Continuous Delivery: The Next Frontier
 
Puppet control-repo 
to the next level
Puppet control-repo 
to the next levelPuppet control-repo 
to the next level
Puppet control-repo 
to the next level
 
Smoking docker
Smoking dockerSmoking docker
Smoking docker
 
How I hack on puppet modules
How I hack on puppet modulesHow I hack on puppet modules
How I hack on puppet modules
 
Automated Puppet Testing - PuppetCamp Chicago '12 - Scott Nottingham
Automated Puppet Testing - PuppetCamp Chicago '12 - Scott NottinghamAutomated Puppet Testing - PuppetCamp Chicago '12 - Scott Nottingham
Automated Puppet Testing - PuppetCamp Chicago '12 - Scott Nottingham
 
Puppet camp chicago-automated_testing2
Puppet camp chicago-automated_testing2Puppet camp chicago-automated_testing2
Puppet camp chicago-automated_testing2
 
Puppet: From 0 to 100 in 30 minutes
Puppet: From 0 to 100 in 30 minutesPuppet: From 0 to 100 in 30 minutes
Puppet: From 0 to 100 in 30 minutes
 
Puppet Camp Paris 2014: Test Driven Development
Puppet Camp Paris 2014: Test Driven DevelopmentPuppet Camp Paris 2014: Test Driven Development
Puppet Camp Paris 2014: Test Driven Development
 
20140408 tdd puppetcamp-paris
20140408 tdd puppetcamp-paris20140408 tdd puppetcamp-paris
20140408 tdd puppetcamp-paris
 
Our Puppet Story (GUUG FFG 2015)
Our Puppet Story (GUUG FFG 2015)Our Puppet Story (GUUG FFG 2015)
Our Puppet Story (GUUG FFG 2015)
 
Intro to-puppet
Intro to-puppetIntro to-puppet
Intro to-puppet
 
Installing and updating software packages [autosaved]
Installing and updating software packages [autosaved]Installing and updating software packages [autosaved]
Installing and updating software packages [autosaved]
 
#OktoCampus - Workshop : An introduction to Ansible
#OktoCampus - Workshop : An introduction to Ansible#OktoCampus - Workshop : An introduction to Ansible
#OktoCampus - Workshop : An introduction to Ansible
 
Nagios Conference 2014 - Mike Weber - Expanding NRDS Capabilities on Linux Sy...
Nagios Conference 2014 - Mike Weber - Expanding NRDS Capabilities on Linux Sy...Nagios Conference 2014 - Mike Weber - Expanding NRDS Capabilities on Linux Sy...
Nagios Conference 2014 - Mike Weber - Expanding NRDS Capabilities on Linux Sy...
 
Provisioning with Puppet
Provisioning with PuppetProvisioning with Puppet
Provisioning with Puppet
 
DPDK in Containers Hands-on Lab
DPDK in Containers Hands-on LabDPDK in Containers Hands-on Lab
DPDK in Containers Hands-on Lab
 

Mehr von Puppet

Puppet camp2021 testing modules and controlrepo
Puppet camp2021 testing modules and controlrepoPuppet camp2021 testing modules and controlrepo
Puppet camp2021 testing modules and controlrepo
Puppet
 
2021 04-15 operational verification (with notes)
2021 04-15 operational verification (with notes)2021 04-15 operational verification (with notes)
2021 04-15 operational verification (with notes)
Puppet
 
Enforce compliance policy with model-driven automation
Enforce compliance policy with model-driven automationEnforce compliance policy with model-driven automation
Enforce compliance policy with model-driven automation
Puppet
 

Mehr von Puppet (20)

Puppet camp2021 testing modules and controlrepo
Puppet camp2021 testing modules and controlrepoPuppet camp2021 testing modules and controlrepo
Puppet camp2021 testing modules and controlrepo
 
Puppetcamp r10kyaml
Puppetcamp r10kyamlPuppetcamp r10kyaml
Puppetcamp r10kyaml
 
2021 04-15 operational verification (with notes)
2021 04-15 operational verification (with notes)2021 04-15 operational verification (with notes)
2021 04-15 operational verification (with notes)
 
Puppet camp vscode
Puppet camp vscodePuppet camp vscode
Puppet camp vscode
 
Modules of the twenties
Modules of the twentiesModules of the twenties
Modules of the twenties
 
Applying Roles and Profiles method to compliance code
Applying Roles and Profiles method to compliance codeApplying Roles and Profiles method to compliance code
Applying Roles and Profiles method to compliance code
 
KGI compliance as-code approach
KGI compliance as-code approachKGI compliance as-code approach
KGI compliance as-code approach
 
Enforce compliance policy with model-driven automation
Enforce compliance policy with model-driven automationEnforce compliance policy with model-driven automation
Enforce compliance policy with model-driven automation
 
Keynote: Puppet camp compliance
Keynote: Puppet camp complianceKeynote: Puppet camp compliance
Keynote: Puppet camp compliance
 
Automating it management with Puppet + ServiceNow
Automating it management with Puppet + ServiceNowAutomating it management with Puppet + ServiceNow
Automating it management with Puppet + ServiceNow
 
Puppet: The best way to harden Windows
Puppet: The best way to harden WindowsPuppet: The best way to harden Windows
Puppet: The best way to harden Windows
 
Simplified Patch Management with Puppet - Oct. 2020
Simplified Patch Management with Puppet - Oct. 2020Simplified Patch Management with Puppet - Oct. 2020
Simplified Patch Management with Puppet - Oct. 2020
 
Accelerating azure adoption with puppet
Accelerating azure adoption with puppetAccelerating azure adoption with puppet
Accelerating azure adoption with puppet
 
Puppet catalog Diff; Raphael Pinson
Puppet catalog Diff; Raphael PinsonPuppet catalog Diff; Raphael Pinson
Puppet catalog Diff; Raphael Pinson
 
ServiceNow and Puppet- better together, Kevin Reeuwijk
ServiceNow and Puppet- better together, Kevin ReeuwijkServiceNow and Puppet- better together, Kevin Reeuwijk
ServiceNow and Puppet- better together, Kevin Reeuwijk
 
Take control of your dev ops dumping ground
Take control of your  dev ops dumping groundTake control of your  dev ops dumping ground
Take control of your dev ops dumping ground
 
100% Puppet Cloud Deployment of Legacy Software
100% Puppet Cloud Deployment of Legacy Software100% Puppet Cloud Deployment of Legacy Software
100% Puppet Cloud Deployment of Legacy Software
 
Puppet User Group
Puppet User GroupPuppet User Group
Puppet User Group
 
Continuous Compliance and DevSecOps
Continuous Compliance and DevSecOpsContinuous Compliance and DevSecOps
Continuous Compliance and DevSecOps
 
The Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick Maludy
The Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick MaludyThe Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick Maludy
The Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick Maludy
 

Kürzlich hochgeladen

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
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)

Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
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
 
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...
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
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
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
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
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
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
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 

Orchestrated Functional Testing with Puppet-spec and Mspectator - PuppetConf 2014

  • 1. ORCHESTRATED FUNCTIONAL TESTING WITH PUPPET-SPEC AND MSPECTATOR RAPHAËL PINSON
  • 2. Who am I? Raphaël Pinson (@raphink) ■ Infrastructure Developer & Trainer @ Camptocamp ■ Augeas & Augeasproviders developer ■ Various contributions to Puppet & ecosystem www.camptocamp.com / 2/32
  • 3. Monitoring vs. Functional Tests Complementary or redundant? www.camptocamp.com / 3/32
  • 4. Conformity Tests ■ Check if machines comply to standards ■ Avoid permanent heavy monitoring checks ■ Tests must be inter-dependent ■ Focus on getting sysadmins to fix one thing at a time to converge toward standards www.camptocamp.com / 4/32
  • 5. Treetester ■ Back in 2008 ■ Written in Perl ■ Orchestrate conformity tests on a 4k+ server fleet www.camptocamp.com / 5/32
  • 6. Treetester: modules output ■ For all hosts/modules ■ Number of hosts filtered per module ■ Modules dependency tree ■ Colors by priority www.camptocamp.com / 6/32
  • 7. Treetester: host output ■ For each host ■ Failed steps in the module tree ■ Green: OK, Red: KO, Purple: Ignored www.camptocamp.com / 7/32
  • 8. Treetester architecture ■ All data in a database (MySQL) ■ Tests scripts output YAML ■ Tests scripts can be local (hosts as STDIN) or remote (ssh or http) ■ Tests are inter-dependent ■ Generate filtered data as a tree ■ Generate graphs (graphviz) www.camptocamp.com / 8/32
  • 9. Treetester filters ■ For each test/module ■ Based on data in MySQL (joins and additional SQL conditions) ■ Allows to link tests to each other ■ Like multiple sieves www.camptocamp.com / 9/32
  • 10. Treetester: future? ■ Not open-sourced :'-( ■ Too monolithic/not flexible enough ■ Heavily linked to specific architecture ■ Needed a rewrite www.camptocamp.com / 10/32
  • 11. Adding specs to Puppet runs ■ Testing the catalog before it gets applied ■ Testing the node after the catalog is applied Enter the Puppet-spec module www.camptocamp.com / 11/32
  • 12. Rspec-puppet ■ http://rspec-puppet.com ■ Now the standard to unit test Puppet manifests ■ Generates catalogs in clean environments ■ Asserts catalogs for resources/classes require 'spec_helper' describe 'logrotate::rule' do let(:title) { 'nginx' } it { should compile.with_all_deps } it { should contain_class('logrotate::setup') } end www.camptocamp.com / 12/32
  • 13. Puppet-spec ■ Runs tests from within Puppet runs ■ Test catalogs using rspec-puppet ■ Test hosts using serverspec www.camptocamp.com / 13/32
  • 14. Puppet-spec: Unit testing ■ Catalog exposed by PuppetSpec::Catalog.instance.catalog ■ Uses rspec-puppet matchers ■ Asserts real catalogs ■ Runs on the master or agent side (as catalog indirection terminii) describe 'puppet' do subject { PuppetSpec::Catalog.instance.catalog } it { should contain_package('puppet') } it { should contain_package('ppet') } it { should include_class('puppet') } it { should include_class('puppet::client::base') } end www.camptocamp.com / 14/32
  • 15. Puppet-spec: Unit tests output # puppet agent -t info: Retrieving plugin err: Could not retrieve catalog from remote server: Unit tests failed: F.. Failures: 1) package Failure/Error: it { should contain_package('augeas') } expected that the catalogue would contain Package[augeas] # /var/lib/puppet/lib/spec/class/augeas/package_spec.rb:3 # /var/lib/puppet/lib/puppet/indirector/catalog/rest_spec.rb:31:in `find' Finished in 0.00092 seconds 3 examples, 1 failure Failed examples: rspec /var/lib/puppet/lib/spec/class/augeas/package_spec.rb:3 # package info: Not using expired catalog for foo.example.com from cache; expired at Tue Apr 02 17:40:21 +0200 2013 notice: Using cached catalog www.camptocamp.com / 15/32
  • 16. Puppet-spec: Deploying unit tests ■ On the master side: ○ Tests are located in the spec/catalog/class directory of the environment ○ Only the directories named after classes declared in the catalog are tested ■ On the agent side: ○ Deploy tests using pluginsync ○ Tests are located in the lib/spec/catalog/class directory of each module ○ Only the directories named after classes declared in the catalog are tested www.camptocamp.com / 16/32
  • 17. Puppet-spec: Unit tests limits ■ When to apply the tests (currently based on class names) ■ Tests on master, or need to deploy all tests with pluginsync ■ Redundant with existing unit tests, or additional security? www.camptocamp.com / 17/32
  • 18. Puppet-spec: Setting up Unit testing ■ Tests achieved from catalog indirection terminii ■ Plugins (terminii) deployed with pluginsync ■ Setup done in routes.yaml: agent: catalog: # Either on the agent side terminus: rest_spec cache: yaml master: catalog: # Or on the master side terminus: compiler_spec www.camptocamp.com / 18/32
  • 19. Serverspec ■ http://serverspec.org ■ Provides RSpec matchers for local functional tests (packages, users, services, ports, etc.) ■ Independant from configuration management tools require 'spec_helper' describe service('httpd') do it { should be_enabled } it { should be_running } end describe port(80) do it { should be_listening } end describe file('/etc/httpd/conf/httpd.conf') do it { should be_file } its(:content) { should match /ServerName www.example.jp/ } end www.camptocamp.com / 19/32
  • 20. Serverspec backends Allows to use various means of launching tests: ■ SSH (default) ■ Exec ■ Puppet (RAL, removed from core) $ serverspec-init Select OS type: 1) UN*X 2) Windows Select number: 1 Select a backend type: 1) SSH 2) Exec (local) Select number: 1 www.camptocamp.com / 20/32
  • 21. Puppet-spec: Functional testing ■ Uses serverspec/specinfra matchers ■ Tests the machine state (not the catalog) require 'spec_helper' describe service('httpd') do it { should be_enabled } it { should be_running } end describe port(80) do it { should be_listening } end describe file('/etc/httpd/conf/httpd.conf') do it { should be_file } its(:content) { should match /ServerName www.example.jp/ } end www.camptocamp.com / 21/32
  • 22. Puppet-spec: Function tests output # puppet agent -t info: Retrieving plugin info: Caching catalog for foo.example.com info: Applying configuration version 'raphink/a2c8e0f [+]' ... Applying changes ... notice: Finished catalog run in 59.19 seconds err: Could not send report: Unit tests failed: FF Failures: 1) augeas Failure/Error: it { should be_installed } expected "augeas" to be installed # /var/lib/puppet/lib/spec/server/class/foo.example.com/package_spec.rb:2 # /var/lib/puppet/lib/puppet/indirector/report/rest_spec.rb:45:in `save' 2) /usr/share/augeas/lenses/dist Failure/Error: it { should be_file } expected "/usr/share/augeas/lenses/dist" to be file # /var/lib/puppet/lib/spec/server/class/foo.example.com/package_spec.rb:6 # /var/lib/puppet/lib/puppet/indirector/report/rest_spec.rb:45:in `save' Finished in 0.06033 seconds 2 examples, 2 failures Failed examples: rspec /var/lib/puppet/lib/spec/server/class/foo.example.com/package_spec.rb:2 # augeas rspec /var/lib/puppet/lib/spec/server/class/foo.example.com/package_spec.rb:6 # /usr/share/augeas/lenses/www.camptocamp.com / 22/32
  • 23. Puppet-spec: Deploying functional tests ■ Tests are run after catalog application ■ Tests can be distributed via pluginsync (in the spec/server/class) directory of each module ■ Tests can be distributed with file Puppet resources, optionally using the spec::serverspec defined resource type www.camptocamp.com / 23/32
  • 24. Puppet-spec: MCollective agent ■ Communicates with distant nodes ■ Sends action and values to specinfra check commands ■ Does not implement serverspec syntax ■ Returns true/false ■ Uses MCollective as transport (instead of SSH) Examples: $ mco rpc spec check action=user values=rpinson $ mco rpc spec check action=file values=/etc/passwd $ mco rpc spec check action=resolvable values=google.fr,A $ mco rpc spec check action=listening values=80 $ mco rpc spec check action=process values=mcollectived $ mco rpc spec check action=file_contain values=/etc/passwd,rpinson www.camptocamp.com / 24/32
  • 25. Mspectator ■ https://github.com/raphink/mspectator ■ RSpec matchers ■ Calls MCollective to achieve tests ■ Uses MCollective spec agent (among others) www.camptocamp.com / 25/32
  • 26. Mspectator architecture ■ Client runs RSpec ■ RSpec calls MCollective ■ MCollective calls distant spec agent ■ spec agent calls specinfra backend www.camptocamp.com / 26/32
  • 27. Mspectator syntax Own matchers, mapping to specinfra backend methods: require 'mspectator' describe 'apache' do it { should find_nodes(100).or_less } # Counts discovered nodes it { should pass_puppet_spec } # Runs the `spec` agent it { should have_certificate.signed } # Uses the `puppetca` agent context 'when on Debian', :facts => { :operatingsystem => 'Debian' } do # Filter by facts it { should find_nodes(5).with_agent('spec') } it { should have_package('apache2.2-common') } it { should_not have_package('httpd') } it { should have_service('apache2').with( :ensure => 'running' ) } it { should have_file('/etc/apache2/apache2.conf') } it { should have_directory('/etc/apache2/conf.d') } it { should have_user('www-data') } end context 'when using SSL', :classes => ['apache::ssl'] do # Filter by classes it { should find_nodes(50).or_more } it { should have_package('ca-certificates') } end end www.camptocamp.com / 27/32
  • 28. Mspectator output $ rake spec SPEC=apache_spec.rb /home/rpinson/.rvm/rubies/ruby-1.8.7-p371/bin/ruby -S rspec apache_spec.rb apache should find nodes 100 should pass puppet spec (FAILED - 1) should have certificate when on Debian should find nodes 5 (FAILED - 2) ... when using SSL should find nodes 50 (FAILED - 3) No request sent, we did not discover any nodes. should have package "ca-certificates" Failures: 1) apache Failure/Error: it { should pass_puppet_spec } expected that all hosts would pass tests, the following didn't: soekris01.wrk.cby.camptocamp.com: soekris02.wrk.cby.camptocamp.com: # ./apache_spec.rb:5 ... www.camptocamp.com / 28/32
  • 30. Contribute On GitHub: ■ puppet-spec: https://github.com/raphink/puppet-spec ■ mspectator: https://github.com/raphink/mspectator www.camptocamp.com / 30/32
  • 31. Thank you! ■ raphael.pinson@camptocamp.com ■ @raphink on Twitter/Github ■ raphink on Freenode ■ Slides: slideshare.net/raphink www.camptocamp.com / 31/32