厨师循环食谱和传递数据?

Chef Looping Recipes and Passing Data?

Chef Solo 中,我在一个名为 projects 的食谱中创建了多个虚拟主机。我有三个用于编译 1 个项目的配方:

他们只生成需要的模板。我在想:


projects/default.rb

django.each do |params|
    include_recipe "gunicorn::addsite"
    include_recipe "nginx::addsite"
    include_recipe "supervisor::addsite"
end

那么在那个循环的食谱中,我可以像下面这样传递全局变量吗?

gunicorn/addsite.rb

template "/var/server/gunicorn/#{params['vhost']}.sh" do
   ..
   ..
end

我没有使用数据包,因为我使用的是 Vagrant 和 OpsWorks,这在 OpsWorks 中有点棘手。谢谢你的帮助。

您可以为每次迭代(每个应用程序)动态填充节点属性,这些属性基本上是全局变量。只需将其设置在主食谱中,然后在其他食谱中阅读即可。

例如:

projects/default.rb

django.each do |params|
    node.default["my_app"]["virtual_host"] = params

    include_recipe "gunicorn::addsite"
    include_recipe "nginx::addsite"
    include_recipe "supervisor::addsite"
end

gunicorn/addsite.rb

template "/var/server/gunicorn/#{node['my_app']['virtual_host']}.sh" do
   ..
   ..
end

__

此方法的替代方法是使嵌套食谱接收数组。并将数组创建到主配方中。使用这种方法,您的食谱可以根据传递的数组中的元素数量创建一个或多个模板。

projects/default.rb

node.default["my_app"]["virtual_hosts"] = django

include_recipe "gunicorn::addsite"
include_recipe "nginx::addsite"
include_recipe "supervisor::addsite"

gunicorn/addsite.rb

node['my_app']['virtual_hosts'].each do |host|
  template "/var/server/gunicorn/#{host}.sh" do
    ..
    ..
  end
end