30

I want to run a cookbook_file resource only if the current environment is "dev". How can this be expressed?

The documentation suggests this:

In a recipe, a code block like this would be useful:

qa_nodes = search(:node,"chef_environment:QA")      
qa_nodes.each do |qa_node|                          
    # Do useful specific to qa nodes only
end

But I'm not sure that's what I want - the fact it's a loop seems wrong.

46

Look in the chef_environment Ruby attribute (not a regular Chef attribute) on the node:

if node.chef_environment == "dev"
  # stuff
end
  • 7
    Specifically, chef_environment is a method on the Chef::Node object that returns the value of the node's environment. It is not a node attribute and should not be confused as such. – jtimberman Aug 15 '12 at 21:50
  • Thanks @jtimberman. I had always thought of an environment being an attribute of a node but it does make sense that it's not. – Tim Potter Aug 15 '12 at 22:56
  • 3
    Great, this works. So the answer to my original question is to add only_if { node.chef_environment == "dev" }. Confirmed. – Steve Bennett Aug 16 '12 at 0:39
  • Couldn't get this answer to work. This syntax does work for me: if "#{node.chef_environment}" == "dev" – spuder Aug 20 '15 at 16:31
2

another elegant way:

if ['production','development'].include? node.chef_environment
    #do something here
end

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.