A big part of Chef’s resources internal nuts and bolts has been change over the last year. One of the most welcome changes has been recipe_eval – a mini Chef run that can be used inside Chef LWRP. This mechanism has been put to good use in use_inline_resources dsl directive in LWRP, in chef-stage and in inline_recipe.
Now that LWRPs have become so powerful, there aren’t many reasons to use definitions. The most common reason people use definitions and not LWRP is the absence of include_recipe – which now is available in LRWPs. Lets explore this:
action :send do begin require 'aws' rescue LoadError recipe_eval do run_context.include_recipe "xml::ruby" chef_gem "aws-sdk" end require 'aws' end converge_by(block_name) do # Actually sending by SNS now that we have the aws-sdk gem
As you can see, the trick is to use run_context.include_recipe instead of just include_recipe since it isn’t directly available in recipe_eval (alternatively one could include Chef::DSL::InclueRecipe mixin).