Skip to main content Logo (IEC resistor symbol)logo

Quis custodiet ipsos custodes?
Home | About | All pages | RSS Feed | Gopher

Chef: include_recipe only_if or not_if

Published: 06-10-2013 | Author: Remy van Elst | Text only version of this article

Table of Contents

Chef supports including other recipes in cookbooks, for example, I can includethe MySQL recipe from a PHP recipe. However, this is not a normal resource but anormal method. Therefore it ignores anything passed to it, including only if ornot if. This tutorial shows you how to include or not include a recipe based ona variable, comparable with not if or only if.

If you like this article, consider sponsoring me by trying out a Digital OceanVPS. With this link you'll get $100 credit for 60 days). (referral link)

Lets say you have a default recipe for all your nodes. It is a simple cookbookwhich includes other recipes via include_recipe. It sets standardconfiguration like users, ssh settings, mail settings and other stuff you want aserver to have.

But what if you want to deploy a mailserver, which has other config than isincluded in your default recipe, but do want all the other stuff from therecipe? Probably you would change your recipe to something like:

include_recipe "postfix::server" do  only_if node["defaults"]["postfix_server"] = trueend

This won't work. As said above, include_recipe is not a normal resource (liketemplate or user) but a method. Therefore it ignores anything passed to it,including only if or not if.

The solution is quite simple, it fall back to using normal Ruby.

Note, there probably are more elegant solutions for this, but I find this towork quite well.

Instead of the above, try adding this to your cookbook:

this_node_is_postfix_server = node["defaults"]["postfix_server"] unless node["defaults"]["postfix_server"].nil?include_recipe "postfix::server" if this_node_is_postfix_server

As you can see, regular Ruby fixes this problem.

Tags: chef, deployment, devops, not_if, only_if, ruby, tutorials