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

Cookbook Reusability

someara
October 02, 2014

Cookbook Reusability

Chef Summit 2014

someara

October 02, 2014
Tweet

More Decks by someara

Other Decks in Technology

Transcript

  1. Cookbook Reusability!
    Chef Community Summit
    2014

    View Slide

  2. Sean OMeara!
    [email protected]!
    @someara

    View Slide

  3. whoami

    View Slide

  4. A Year in Review

    View Slide

  5. Diversification

    View Slide

  6. 7zip!
    apache2!
    ark!
    application*!
    couchdb!
    Imagemagick!
    java

    View Slide

  7. logrotate!
    mercurial!
    munin!
    nagios!
    nginx!
    ntp!
    openvpn

    View Slide

  8. pacman!
    postgresql!
    python!
    reprepro!
    rabbitmq!
    runit!
    supervisor

    View Slide

  9. selinux!
    tmux!
    varnish !
    wordpress!

    View Slide

  10. Supermarket
    https://www.flickr.com/photos/mobilestreetlife/10885044043

    View Slide

  11. • Escaped the tyranny of JIRA!
    • Moved to Github Issues!
    • Automated CLA checking!
    • OSS Artifact Repository

    View Slide

  12. Rewrites

    View Slide

  13. 2009
    0.5.2
    Chef
    Vagrant
    ChefSpec
    0.1.0
    0.0.2
    Minitest-Chef
    Berkshelf
    Test Kitchen
    2010
    0.9.0
    2011
    0.10.0
    2012
    10.12.0
    1.0.0
    0.2.0
    1.0.0
    0.7.0
    1.0.0
    2013 2014
    1.0.0
    2.0.0
    1.0.0
    2.0.0
    1.4.0
    11.0.0 12.0.0
    1.6.5
    3.0.0
    3.0.0
    1.2.2
    ServerSpec
    ChefDK
    0.0.1 2.0.0
    0.2.2
    TDI Capability
    0.8.0

    View Slide

  14. yum!
    yum-*!
    jenkins!
    mysql!
    httpd

    View Slide

  15. The Evolution of a Chef
    Cookbook

    View Slide

  16. Stage 1 - Paradise
    https://www.flickr.com/photos/nattu/1385100375/

    View Slide

  17. View Slide

  18. test / repair
    test / repair
    test / repair

    View Slide

  19. Easy to read

    Easy to grok

    Easy to test
    }

    View Slide

  20. Stage 2 - if statements

    View Slide

  21. logic
    compiled into
    resource collection

    View Slide

  22. Resource
    DSL
    }
    Just
    Ruby
    }

    View Slide

  23. Resource
    DSL
    }
    Just
    Ruby
    } }Chef

    View Slide

  24. Stage 3 - Crazytown
    https://www.flickr.com/photos/kwl/4595324641

    View Slide

  25. View Slide

  26. wat

    View Slide

  27. Why?

    View Slide

  28. Reusable is useful

    View Slide

  29. Cross-platform is useful

    View Slide

  30. We desire useful things

    View Slide

  31. Platform idioms are hard

    View Slide

  32. Keeping the Dream Alive
    https://www.flickr.com/photos/kalexanderson/7014655351/

    View Slide

  33. Most people just write their
    own cookbooks from
    scratch

    View Slide

  34. I really really really want
    reusable cross-platform
    cookbooks

    View Slide

  35. Lessons Learned

    View Slide

  36. Attributes are routinely
    abused
    https://www.flickr.com/photos/jabberwocky381/2828863789

    View Slide

  37. View Slide

  38. Attributes are an
    interface

    View Slide

  39. Attributes are tunable
    knobs

    View Slide

  40. View Slide

  41. You probably just want a
    variable

    View Slide

  42. View Slide

  43. Or even a method

    View Slide

  44. View Slide

  45. Using an attribute to track
    state during a Chef run
    causes tears and sorrow

    View Slide

  46. Prefer resource parameters

    View Slide

  47. View Slide

  48. View Slide

  49. Primitives are more useful
    than opinionated policy

    View Slide

  50. “They’re Just Resources”!
    !
    LWRP is Googleable

    View Slide

  51. Zoom out a level!
    !
    Think about services and
    runtimes, not files and processes

    View Slide

  52. Singleton resources are good but
    confusing. Possibly even
    dangerous.!
    !
    Multiple instance support is better!
    !
    Cross-platform resources are best

    View Slide

  53. View Slide

  54. BDD / TDD yields high
    quality cookbooks
    https://www.flickr.com/photos/glenirah/4376553184

    View Slide

  55. Test Kitchen!
    ServerSpec / Minitest / Bats!
    ChefSpec

    View Slide

  56. 2009
    0.5.2
    Chef
    Vagrant
    ChefSpec
    0.1.0
    0.0.2
    Minitest-Chef
    Berkshelf
    Test Kitchen
    2010
    0.9.0
    2011
    0.10.0
    2012
    10.12.0
    1.0.0
    0.2.0
    1.0.0
    0.7.0
    1.0.0
    2013 2014
    1.0.0
    2.0.0
    1.0.0
    2.0.0
    1.4.0
    11.0.0 12.0.0
    1.6.5
    3.0.0
    3.0.0
    1.2.2
    ServerSpec
    ChefDK
    0.0.1 2.0.0
    0.2.2
    This Slide Again
    0.8.0

    View Slide

  57. Full test coverage is tedious

    View Slide

  58. Full test coverage is totally
    worth it

    View Slide

  59. Let users bring their own
    configurations

    View Slide

  60. It is better to add to a
    resource_collection than to
    monkey patch it

    View Slide

  61. Configuration files are the
    brains of a service

    View Slide

  62. Manage minimal
    configuration to get a service
    running

    View Slide

  63. Offload further configuration
    to the user

    View Slide

  64. conf.d is your friend

    View Slide

  65. Hide everything else
    inside a resource

    View Slide

  66. Add resource parameters
    when appropriate

    View Slide

  67. View Slide

  68. View Slide

  69. Cross-platform cookbooks
    are hard
    https://www.flickr.com/photos/glenirah/4376553184

    View Slide

  70. Cross-platform resources
    are even harder

    View Slide

  71. They can be done!

    View Slide

  72. Create a resource

    View Slide

  73. View Slide

  74. Create a provider

    View Slide

  75. View Slide

  76. Subclass platform providers

    View Slide

  77. View Slide

  78. View Slide

  79. View Slide

  80. View Slide

  81. View Slide

  82. Set provider default for
    platforms

    View Slide

  83. View Slide

  84. Do Repeat Yourself

    View Slide

  85. Some resources are often
    the duplicated across
    providers

    View Slide

  86. That’s fine. It’s the pattern
    as a whole that’s important

    View Slide

  87. Maximize for grokability

    View Slide

  88. People will be reading your
    code for the first time
    during operations work

    View Slide

  89. Init systems are annoying

    View Slide

  90. Using a service resource
    usually requires file or
    template resources in
    addition to
    service[thingd]

    View Slide

  91. Debconf!
    Docker!
    LaunchD!
    Runit!
    SMF!
    Simple!
    SystemD!
    Sysvinit!
    Upstart!
    Windows Services

    View Slide

  92. Subclassing is awesome

    View Slide

  93. View Slide

  94. Customize before recipe
    compilation

    View Slide

  95. Going Forward

    View Slide

  96. Cookbooks that ship
    resource primitives

    View Slide

  97. More examples to copy

    View Slide

  98. More breaking backwards
    compatibility (sorry)

    View Slide

  99. Providers implemented
    with Docker containers
    (why not?)

    View Slide

  100. chef-metal

    View Slide

  101. Tell me what you think

    View Slide

  102. Please don’t hurt me =)

    View Slide

  103. View Slide