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

时间:2015-02-17 16:52:16

标签: ruby chef chef-solo

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

  • 食谱
    • gunicorn :: addsite
    • nginx的:: addsite
    • 监:: addsite

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

  • 如何在循环中运行所有三个配方来创建多个项目?
  • 以下正确的方式包括食谱?

项目/ 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中有点棘手。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

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

例如:

<强>项目/ 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

__

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

<强>项目/ 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