31

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.

Steve Bennett
  • 5,539
  • 12
  • 45
  • 57

2 Answers2

47

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

if node.chef_environment == "dev"
  # stuff
end
Tim Potter
  • 1,754
  • 15
  • 15
  • 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 00: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
Ilja
  • 432
  • 2
  • 9