在 Chef Solo 中,我在名为 projects 的食谱中创建了多个虚拟主机。我有三个用于编译1个项目的配方:
他们只生成所需的模板。我在想:
项目/ 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中有点棘手。谢谢你的帮助。
答案 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