Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Hand Crafted Artisinal Chef Resources

someara
February 02, 2016

Hand Crafted Artisinal Chef Resources

Configuration Management Camp
Ghent Belgium
February 2016

someara

February 02, 2016
Tweet

More Decks by someara

Other Decks in Technology

Transcript

  1. Hand Crafted Artisanal
    Chef Resources

    View Slide

  2. Config Management Camp
    Ghent, Belgium
    February 2016

    View Slide

  3. Sean OMeara
    [email protected]
    @someara

    View Slide

  4. whoami

    View Slide

  5. Part 1

    View Slide

  6. Writing library cookbooks
    An opinionated workflow
    Step by step

    View Slide

  7. Step 1 - Disregard dogma
    “Unit tests first” is a dirty lie
    https://flic.kr/p/aTSiXF

    View Slide

  8. Step 2 - Make things up
    Then work backwards
    https://flic.kr/p/dXkQ5s

    View Slide

  9. Contrived examples are the best
    examples

    View Slide

  10. View Slide

  11. Place this off to the side, we will
    come back for it later.

    View Slide

  12. Step 3 - Create a cookbook
    By hand. Be a wizard.
    https://flic.kr/p/3mMW6e

    View Slide

  13. mkdir -p ~/src/custom-resources-tutorial
    cd ~/src/custom-resources-tutorial
    emacs metadata.rb

    View Slide

  14. View Slide

  15. Step 4 - Embed a test cookbook.
    By hand. Be a wizard. Again.
    https://flic.kr/p/ai36NG

    View Slide

  16. mkdir -p test/cookbooks/my_file_test
    cd test/cookbooks/my_file_test
    echo “test cookbook” > README.md
    mkdir recipes
    touch recipes/default.rb
    emacs metadata.rb

    View Slide

  17. View Slide

  18. Step 5 - Tell Berkshelf about it
    https://flic.kr/p/k5jmja

    View Slide

  19. cd ~/src/custom-resources-tutorial
    emacs Berksfile

    View Slide

  20. View Slide

  21. Step 6 - Configure Test Kitchen
    https://flic.kr/p/r38F5c

    View Slide

  22. emacs .kitchen.yml

    View Slide

  23. View Slide

  24. kitchen test ; echo $?

    View Slide

  25. Step 7 - Save game
    https://flic.kr/p/6ZJ4G7

    View Slide

  26. cd ~/src/custom-resources-tutorial
    cp ~/src/chef-cookbooks/docker/.gitignore .
    cp ~/src/chef-cookbooks/docker/.rubocop.yml .

    View Slide

  27. rubocop -a
    git init
    git add .
    git commit -a -m 'v0.0.1 - cookbook skeleton'
    git tag v0.0.1

    View Slide

  28. Step 8 - Use resource in test recipe
    https://flic.kr/p/8MuUAX

    View Slide

  29. emacs test/cookbooks/my_file_test/recipes/
    default.rb

    View Slide

  30. View Slide

  31. kitchen converge ; echo $?

    View Slide

  32. Step 9 - Implement resource
    https://flic.kr/p/bkVKRb

    View Slide

  33. cd ~/src/custom-resources-tutorial
    mkdir libraries
    emacs libraries/my_file.rb

    View Slide

  34. View Slide

  35. kitchen converge ; echo $?
    kitchen converge ; echo $?

    View Slide

  36. Step 10 - Test for behavior
    https://i.ytimg.com/vi/1y8Rqvz-Jcg/
    maxresdefault.jpgz

    View Slide

  37. mkdir -p test/integration/my_file/inspec
    emacs -p test/integration/my_file/inspec/
    run_spec.rb

    View Slide

  38. View Slide

  39. kitchen verify ; echo $?

    View Slide

  40. Step 11 - Add specs and commit
    https://flic.kr/p/rrgfZh

    View Slide

  41. cd ~/src/custom-resources-tutorial
    mkdir spec
    emacs spec/spec_helper.rb

    View Slide

  42. View Slide

  43. emacs spec/my_file_spec.rb

    View Slide

  44. View Slide

  45. rubocop -a
    rspec ; echo $?
    git add .
    git commit -a -m “v0.1.0 - my_file resource”
    git tag v0.1.0

    View Slide

  46. stove 0.1.0

    View Slide

  47. Step 12 - Iterate indefinitely
    https://flic.kr/p/8Ny8Jt

    View Slide

  48. Congratulations, you have now written one
    software.

    View Slide

  49. You must now maintain it forever.

    View Slide

  50. muahaha.

    View Slide

  51. View Slide

  52. Part 2

    View Slide

  53. Custom Resources
    Tips and Tricks

    View Slide

  54. Be explicit
    https://flic.kr/p/pz1JAo

    View Slide

  55. View Slide

  56. View Slide

  57. View Slide

  58. View Slide

  59. Converge twice during development
    Use markers for “negative” actions
    https://flic.kr/p/pqwd5U

    View Slide

  60. View Slide

  61. View Slide

  62. Tests let you refactor with confidence
    https://flic.kr/p/4WnjM4

    View Slide

  63. View Slide

  64. STAR WIPE

    View Slide

  65. View Slide

  66. Pure Ruby resources
    https://flic.kr/p/5km2fM

    View Slide

  67. Pure Ruby resources utilize
    - The Ruby Standard Library
    - Chef helper libs (mixlib-shellout)
    - Ruby gems

    View Slide

  68. View Slide

  69. It might make sense to vendor gems

    View Slide

  70. load_current_value
    - Runs at converge time
    - Just before the action body
    - Loads desired state values

    View Slide

  71. View Slide

  72. converge_if_changed
    - Runs if any desired_state: true
    property differs from user input
    - desired_state: false avoids
    comparison

    View Slide

  73. View Slide

  74. coerce transforms values
    - Called when property is set
    - Called when property is read
    - Use this to raise errors on bad input

    View Slide

  75. The docker_container resource uses
    coercion heavily
    https://github.com/chef-cookbooks/
    docker/blob/master/libraries/
    docker_container.rb

    View Slide

  76. lazy defaults
    - Delays evaluation until used
    - Useful for calculated values

    View Slide

  77. View Slide

  78. Composite resources
    https://flic.kr/p/fm58oo

    View Slide

  79. Composite resources
    - Reuse Chef resources
    - Actions look like recipes
    - Do not use load_current_value

    View Slide

  80. etcd_installation_binary :create

    View Slide

  81. httpd_config_rhel :create

    View Slide

  82. Avoid leaky abstractions
    https://flic.kr/p/7d1kDc

    View Slide

  83. Resources should be minimalist

    View Slide

  84. Early versions might be simple

    View Slide

  85. View Slide

  86. They rarely stay that way

    View Slide

  87. Iterate and add more features
    Break down into smaller resources

    View Slide

  88. Use naming semantics to
    describe strategy

    View Slide

  89. etcd_installation_binary
    etcd_installation_docker
    etcd_installation_package
    etcd_service_manager_docker
    etcd_service_manager_execute
    etcd_service_manager_systemd
    etcd_service_manager_sysvinit
    etcd_service_manager_upstart

    View Slide

  90. Recycle patterns as they emerge

    View Slide

  91. docker_installation_binary
    docker_installation_package
    docker_installation_script
    docker_service_manager_execute
    docker_service_manager_systemd
    docker_service_manager_sysvinit
    docker_service_manager_upstart

    View Slide

  92. Chef selects defaults with the
    provider resolution system

    View Slide


  93. View Slide


  94. View Slide

  95. Compose resources
    Most specific to least specific

    View Slide

  96. View Slide

  97. Enjoy

    View Slide

  98. fin

    View Slide