Skip to main content Logo

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

Chef: include_recipe only_if or not_if

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

❗ This post is over eleven years old. It may no longer be up to date. Opinions may have changed.

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

Recently I removed all Google Ads from this site due to their invasive tracking, as well as Google Analytics. Please, if you found this content useful, consider a small donation using any of the options below:

I'm developing an open source monitoring app called Leaf Node Monitoring, for windows, linux & android. Go check it out!

Consider sponsoring me on Github. It means the world to me if you show your appreciation and you'll help pay the server costs.

You can also sponsor me by getting a Digital Ocean VPS. With this referral link you'll get $100 credit for 60 days.

Lets say you have a default recipe for all your nodes. It is a simple cookbook which includes other recipes via include_recipe. It sets standard configuration like users, ssh settings, mail settings and other stuff you want a server to have.

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

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

This won't work. As said above, include_recipe is not a normal resource (like template 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 to work 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