hand crafted artisanal chef resources
TRANSCRIPT
Hand Crafted ArtisanalChef Resources
Config Management CampGhent, BelgiumFebruary 2016
Sean [email protected]
@someara
whoami
Part 1
Writing library cookbooks An opinionated workflow Step by step
Step 1 - Disregard dogma “Unit tests first” is a dirty lie
https://flic.kr/p/aTSiXF
Contrived examples are the best examples
Place this off to the side, we will come back for it later.
mkdir -p ~/src/custom-resources-tutorialcd ~/src/custom-resources-tutorialemacs metadata.rb
Step 4 - Embed a test cookbook. By hand. Be a wizard. Again.
https://flic.kr/p/ai36NG
mkdir -p test/cookbooks/my_file_testcd test/cookbooks/my_file_testecho “test cookbook” > README.mdmkdir recipestouch recipes/default.rbemacs metadata.rb
cd ~/src/custom-resources-tutorialemacs Berksfile
emacs .kitchen.yml
kitchen test ; echo $?
cd ~/src/custom-resources-tutorialcp ~/src/chef-cookbooks/docker/.gitignore .cp ~/src/chef-cookbooks/docker/.rubocop.yml .
rubocop -agit initgit add .git commit -a -m 'v0.0.1 - cookbook skeleton' git tag v0.0.1
emacs test/cookbooks/my_file_test/recipes/default.rb
kitchen converge ; echo $?
cd ~/src/custom-resources-tutorialmkdir librariesemacs libraries/my_file.rb
kitchen converge ; echo $?kitchen converge ; echo $?
Step 10 - Test for behavior
https://i.ytimg.com/vi/1y8Rqvz-Jcg/maxresdefault.jpgz
mkdir -p test/integration/my_file/inspecemacs -p test/integration/my_file/inspec/run_spec.rb
kitchen verify ; echo $?
cd ~/src/custom-resources-tutorialmkdir specemacs spec/spec_helper.rb
emacs spec/my_file_spec.rb
rubocop -arspec ; echo $?git add .git commit -a -m “v0.1.0 - my_file resource”git tag v0.1.0
stove 0.1.0
Congratulations, you have now written one software.
You must now maintain it forever.
muahaha.
Part 2
Custom Resources Tips and Tricks
Converge twice during development Use markers for “negative” actions
https://flic.kr/p/pqwd5U
STAR WIPE
Pure Ruby resources utilize
- The Ruby Standard Library - Chef helper libs (mixlib-shellout) - Ruby gems
It might make sense to vendor gems
load_current_value
- Runs at converge time - Just before the action body - Loads desired state values
converge_if_changed
- Runs if any desired_state: true property differs from user input
- desired_state: false avoids comparison
coerce transforms values
- Called when property is set - Called when property is read - Use this to raise errors on bad input
The docker_container resource uses coercion heavily
https://github.com/chef-cookbooks/docker/blob/master/libraries/docker_container.rb
lazy defaults
- Delays evaluation until used - Useful for calculated values
Composite resources
- Reuse Chef resources - Actions look like recipes - Do not use load_current_value
etcd_installation_binary :create
httpd_config_rhel :create
Resources should be minimalist
Early versions might be simple
They rarely stay that way
Iterate and add more features Break down into smaller resources
Use naming semantics to describe strategy
etcd_installation_binaryetcd_installation_dockeretcd_installation_package
etcd_service_manager_dockeretcd_service_manager_executeetcd_service_manager_systemdetcd_service_manager_sysvinitetcd_service_manager_upstart
Recycle patterns as they emerge
docker_installation_binarydocker_installation_packagedocker_installation_script
docker_service_manager_executedocker_service_manager_systemddocker_service_manager_sysvinitdocker_service_manager_upstart
Chef selects defaults with the provider resolution system
…
…
Compose resources Most specific to least specific
Enjoy
fin