Más contenido relacionado
La actualidad más candente (20)
Similar a Puppet camp2021 testing modules and controlrepo (20)
Puppet camp2021 testing modules and controlrepo
- 2. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH
Puppet since 2009, Puppet Trainer since
2011, Puppet Certified Consultant since 2015
CEO & Co-Founder example42 GmbH
tuxmea (Twitter, GitHub, Slack)
Puppet Consulting, Training and
Development
MartinAlfke
2
- 3. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH
Why testing?
3
Image: tatlin
- 4. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH
Why testing?
4
Can Puppet compiler parse your
code?
Can you upgrade to a newer Puppet
version?
Does the refactoring accidentally
change anything?
Image: tatlin
- 5. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH
Why testing?
5
What to use?
- puppet-lint
- rspec-puppet
- PDK
- OnceOver
- Beaker
- Litmus
- serverspec
- https://voxpupuli.org/plugins/
Image: tatlin
- 6. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH
Why testing?
6
But,
I only want to write Puppet code!
And now I must learn testing?
Let’s choose the most simple to use
solution!
Image: tatlin
- 7. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH
Why testing?
7
Which tests to run?
- Lint tests - check style guide
- Unit tests - check catalog
- Acceptance tests - check system
Image: tatlin
- 8. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH
Testing Modules
8
Image: tatlin
- 9. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH
Where do you want to run the test?
On your workstation (Windows, Mac
OS, Linux)
Within an automated CI pipeline (Linux
Shell, Container)
Testing Modules
9
Image: tatlin
- 10. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH
Testing Modules
10
Image: tatlin
PDK:
- easy to use
- all bundled
- different Puppet version tests possible
pdk validate --puppet-version=7
- 11. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH
Standalone Library (or Component)
Modules, not roles & profiles
Use PDK (Puppet Development Kit) to
generate module, classes, …
- pdk new module
- pdk new class, defined_type, fact,
function, provider, task
- pdk convert, update
Testing Modules
11
Image: tatlin
- 12. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH
Testing Modules
12
Image: tatlin
Use PDK (Puppet Development Kit) for
testing:
- pdk validate
- pdk test unit
- 13. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH
Testing Modules
13
Image: tatlin
Add dependencies like stdlib or inifile
to .fixtures.yml
Get dependencies from forge or git
(upstream or local)
- 14. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH
Testing Modules
14
Image: tatlin
You want to change the default
behaviour?
Check the pdk-template git repo and
use the possibility to configure PDK
(.sync.yml)
Run pdk update afterwards.
- 15. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH
Testing Modules
15
Image: tatlin
PDK uses Puppet version and
supported OS from metadata.json
But how to proceed with control-repo?
- 16. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH
Testing Control-Repo - PDK
16
Image: tatlin
- 17. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH 17
Syntax Tests:
Role and profile modules must be generated
using PDK
pushd site/profile && pdk validate && popd
pushd site/role && pdk validate && popd
Image: tatlin
Testing Control-Repo - PDK
- 18. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH 18
Using PDK for Unit Testing
Many dependencies (upstream or library
modules) like stdlib, inifile, core modules, ...
You want to use your control-repo Hiera config
and data
You want to use your manifests/site.pp
Image: tatlin
Testing Control-Repo - PDK
- 19. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH 19
Using PDK for Unit Testing
- profile and role module must be in PDK
format (use pdk convert on existing profile
and role modules)
- modules from Puppetfile must be installed
locally (r10k puppetfile install)
Image: tatlin
Testing Control-Repo - PDK
- 20. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH 20
Using PDK - solution
One needs:
- .fixtures.yml
- spec/spec_helper_local.rb
Image: tatlin
Testing Control-Repo - PDK
- 21. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH 21
Using PDK on profile module
-.fixtures.yml
# site/profile/.fixtures.yml
---
fixtures:
symlinks:
profile: "#{source_dir}"
../r10k: ‘../../../../modules'
Testing Control-Repo - PDK
Using PDK on role module
-.fixtures.yml
# site/role/.fixtures.yml
---
fixtures:
symlinks:
role: "#{source_dir}"
profile: "#{source_dir}/../profile"
../r10k: ‘../../../../modules'
- 22. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH 22
Using PDK - spec/spec_helper_local.rb
# site/{role|profile}/spec/spec_helper_local.rb
fixture_path = File.expand_path(File.join(__FILE__, '..', 'fixtures'))
RSpec.configure do |c|
c.module_path = File.join(fixture_path, 'modules') + ':' + File.join(fixture_path, ‘r10k')
c.manifest_dir = File.join(fixture_path, ‘../../../../manifests’)
c.manifest = File.join(fixture_path, ‘../../../../manifests/site.pp’)
c.hiera_config = File.join(fixture_path, '../../../../hiera.yaml')
end
Image: tatlin
Testing Control-Repo - PDK
- 23. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH 23
Run your control-repo tests:
r10k puppetfile install
pushd site/profile && pdk test unit && popd
pushd site/role && pdk test unit && popd
Image: tatlin
Testing Control-Repo - PDK
- 24. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH 24
Using PDK for Acceptance Testing
PDK does not officially support acceptance
testing.
Yes, PDK ships beaker and litmus
- pdk bundle exec rake -T
pdk bundle: not officially supported!
Image: tatlin
Testing Control-Repo - PDK
- 25. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH 25
How to deal with role or profile classes which
are designed for a specific OS only?
Reminder: PDK uses supported OS from
metadata.json
Many adoptions required.
Is there a more simple way?
Image: tatlin
Testing Control-Repo - PDK
- 26. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH
Testing Control-Repo - OnceOver
26
Image: tatlin
- 27. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH 27
https://github.com/dylanratcliffe/onceover
Specially created to test Puppet control-repo
Separation of concerns: tests for library
modules vs. tests for control-repo
Run syntax, unit and acceptance tests … and
one more thing ;-)
Image: tatlin
Testing Control-Repo - OnceOver
- 28. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH 28
Delivered as Ruby GEM:
gem install onceover onceover-codequality
Or: Gemfile: gem ‘onceover’
gem ‘onceover-codequality’
Initialize OnceOver on your control-repo:
onceover init
Run syntax tests: onceover run codequality
Image: tatlin
Testing Control-Repo - OnceOver
- 29. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH 29
onceover run codequality
INFO
-> Running Code Quality tests
INFO
-> Checking Puppetfile...
INFO
-> ...OK
INFO
-> Checking puppet-syntax rake task…
INFO
-> ...OK
WARN
-> Please install python and pyyaml for enhanced YAML validation (pip install pyyam
INFO
-> Checking lint in manifests...
INFO
-> ...OK
INFO
-> Checking lint in site...
Testing Control-Repo - OnceOver
- 30. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH 30
spec/onceover.yaml
- add classes and nodes,
- create class_groups and node_groups,
- build your test_matrix
Describe the unit tests in spec/classes/
<class>_spec.rb
Image: tatlin
Testing Control-Repo - OnceOver
- 31. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH 31
# spec/onceover.yaml
classes:
- role::base
nodes:
- CentOS-7.0-64
class_groups:
all_classes:
- role::base
…
Testing Control-Repo - OnceOver
# spec/onceover.yaml continued
…
node_groups:
testnodes:
- CentOS-7.0-64
test_matrix:
- all_nodes:
classes: 'role::base'
tests: 'spec'
- 32. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH 32
onceover run spec
INFO
-> Using Puppetfile ‘…/control-repo/.onceover/etc/puppetlabs/code/
environments/production/Puppetfile’
INFO
-> Updating module …/control-repo/.onceover/etc/puppetlabs/code/
environments/production/modules/yumrepo_core
…
role::base: P P P P
Testing Control-Repo - OnceOver
- 33. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH 33
Acceptance Tests are configures in spec/
acceptance/<class>_spec.rb
Nodesets are configured in spec/acceptance/
nodesets/onceover-nodes.yaml
Hint: onceover needs beaker and will print a
complaint about beaker deprecation.
One more thing!
Image: tatlin
Testing Control-Repo - OnceOver
- 34. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH 34
OnceOver Catalog diff
gem ‘onceover-octocatalog-diff’
onceover run diff --from <branch> --to <branch>
Image: tatlin
Testing Control-Repo - OnceOver
- 35. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH
Summary
35
Image: tatlin
- 36. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH
Summary
36
Image: tatlin
Testing is important but has a learning
curve!
Syntax and unit tests are essential and
easy to do
Acceptance tests are useful, but
harder to do
- 37. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH
Summary
37
Image: tatlin
Move from simple to harder.
Start using PDK.
Learn rspec-puppet.
Move to OnceOver for contro-repo testing.
Build an infrastructure for acceptance testing.
- 38. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH
Summary
38
Image: tatlin
PDK uses OS information from a modules
metadata.json.
Different tests for different OS needs adoption of spec
tests.
OnceOver lets you build a test matrix regarding
classes and OS to tests.
- 39. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH
Summary
39
Image: tatlin
Check the possibilities of your infrastructure and
your test requirements.
VM tests are possible in Docker, VMware,
Vagrant, AWS, …
https://github.com/voxpupuli/beaker/blob/master/
docs/how_to/hypervisors/README.md
https://github.com/puppetlabs/provision
- 40. Puppet Code Testing - Modules vs. Control-Repo - PuppetCamp 2021 - Martin Alfke © example42 GmbH
Please take care!
40
We are living in difficult times.
Cities and towns need diversity.
Diversity is provided by small businesses.
Support your local, small, owner or family run
businesses.
Stay healthy and take care!