[chef] Re: Re: Re: Re: Re: Re: RE: Re: RE: Re: Re: Conditional execution for custom resources


Chronological Thread 
  • From: Warren Bain < >
  • To: " " < >
  • Subject: [chef] Re: Re: Re: Re: Re: Re: RE: Re: RE: Re: Re: Conditional execution for custom resources
  • Date: Fri, 22 Mar 2013 06:01:30 +1100
  • Accept-language: en-US
  • Acceptlanguage: en-US

Well said Zac!

Waz


Warren Bain
http://ninefold.com
Australia's cloud
direct: +61 2 8221 7729
mobile: +61 414 867 559
follow: http://twitter.com/thoughtcroft

Zac Stevens 
< >
 wrote:
On Tue, Mar 19, 2013 at 9:34 PM, Jay Feldblum 
< <mailto: >>
 wrote:
But a definition is essentially a parameterized recipe template (macro). Not 
an abstraction. That's why I talked about resources and providers being an 
abstraction, but talked about definitions being merely a grouping of related 
resource declarations.

An example of something suited to be a definition would be: the apache_conf 
definition in the apache2 cookbook. The right level of abstraction for this 
particular case is to call a procedure (macro) that simply declares another 
resource with some predefined attributes and some other parameterized 
attributes. Every apache config file change needs to trigger a reload or 
restart of the service, and there may be many such config files, so wrapping 
that up in a definition (macro) is useful.

This is a good example.  Some others, that I've used...

1) Accumulating template variables

This pattern is documented here: 
http://docs.opscode.com/essentials_cookbook_definitions_example_one_definition.html

2) Setting node attributes or run state

In this case, the definition might not contain any resources, but instead 
wraps up setting some attributes, or stashing some data for other recipes to 
use later.  Why not use plain old ruby methods, defined in libraries?  
They're much harder for those new to ruby to write in the first place, and 
the syntax in recipes is different (which has pro's and con's).

3) "How do I run a recipe multiple times with different data?"

I've heard this question a number of times, on IRC and from co-workers.  
After working through getting a recipe to work (at all), the next requirement 
is to "run" it more than once, with different data.  The smallest increment 
required to achieve this involves changing the recipe into into a definition. 
 Could they move straight to LWRPs?  Sure, but that's a bunch more to learn, 
particularly for folks who are early on the ruby learning curve, and have not 
yet properly apprehended the resource/provider model.


<hyperbole>
To my mind, "Definitions are just crappy LWRPs" is the second most irritating 
meme in the Chef community.  If we were to remove them just because they can 
be misused, what of all the other Chef features that fall into that category? 
 I've seen terrible sins committed using execute/script when more appropriate 
resources were available - should they go?  A whole class of criticism of 
Chef is the ability to use arbitrary ruby in our recipes.  Should that 
ability go away too?
</hyperbole>

Definitions have their own place in Chef's conceptual model, separate from 
Resources and Providers.  Some new users do struggle with their purpose, 
which isn't at all surprising - the docs are not amazing, apache_site is a 
poor example (that probably should be an LWRP), and many people seem to think 
that Definitions should be ignored entirely, in favour of LWRPs.  I think the 
problem is communication: the feature is sound, the guidance needs 
improvement.

So, my arguments in favour of keeping definitions are that they have a 
distinct (albeit under-appreciated) purpose, and that they can ease the 
learning curve for new users.


Zac



  • [chef] Re: Re: Re: Re: Re: Re: RE: Re: RE: Re: Re: Conditional execution for custom resources, Warren Bain, 03/21/2013

Archive powered by MHonArc 2.6.16.

§