Ruby/Chef include_recipe and know variables from parent file

chefchef-soloruby

I am trying to use a local variable in an included file. I get the error that's it's not defined. I am not sure a way to do this, do you? I have a recipe folder with:

recipes/
    development.rb
    testing.rb
    config.rb

development.rb

username = "vagrant"
static = []
django = ["project1", "project2"]

include_recipe "server::config"   # <-- Trying to use static and django in there.

config.rb

static.each do |vhost|  #  <-- How do I get the "static" var in here?
    ...
end

django.each do |vhost|  #  <-- How do I get the "django" var in here?
    ...
end

Best Answer

You can't share variables between recipes, but there are two ways to share data between recipes.

  1. The preferred route would be to externalize static and django as attributes in attributes/default.rb. This means they'll become available on the node object and accessible from each recipe.

attributes/default.rb

default["server"]["static"] = []
default["server"]["django] = ["project1", "project2"]

recipes/config.rb

node["server"]["static"].each do |vhost|
  ...
end

node["server"]["django"].each do |vhost|
  ...
end
  1. Use Chef libraries to make a common method that returns these arrays.

My suggestion is to definitely stick with option one, it's the most common approach. Hope that helps!