具有For Each语句和属性数组的多个Chef模板

时间:2016-05-11 10:42:04

标签: chef chef-solo

我正在尝试使用chef 11.10为我的网络服务器上的一系列虚拟主机创建多个单独的.conf文件。我希望这些文件的内容在每个vhost上略有不同。

当前实现创建了不同的文件名(数组中每个都有1个),但模板每次只包含数组中的最后一项。

例如,阵列中有3个虚拟主机 - example1.com,example2.com,example3.com。在我的/var/www/conf.d/目录中,我在配方运行后有3个文件

> example1.com.conf 
> example2.com.conf 
> example3.com.conf

这是一个好的开始,但是,这些文件的内容与正在使用的数组中的最后一个变量完全相同。所有这些人都有“example3.com”作为主持人,例如。

server {
  listen   80;
  server_name  example3.com;
  return 301 https://$host$request_uri;
}

我的食谱包含了这个

vhosts = node['nginx']['vhosts']

vhosts.each do |vhost|
  node.default['nginx']['hostname'] = vhost

  template "#{node[:nginx][:conf_dir]}/#{vhost}.conf" do
    source "#{node[:nginx][:vhost_template]}"
    owner "root"
    group "root"
    mode 0644
    notifies :restart, resources(:service => "nginx")
  end
end

并在我的模板中使用以下代码

  server {
  listen   443;
  server_name  <%= node[:nginx][:hostname] %>;
  return 301 http://$host$request_uri;
}

在我的attributes / default.rb文件中,我有以下数组。

default[:nginx][:vhosts] = [ "example1.com", "example2.com", "example3.com" ]

1 个答案:

答案 0 :(得分:1)

在循环中设置单个节点属性没有意义。由于Chef执行,实际创建模板资源时只保留最后一个值。尝试删除这一行:

TSLibraryImport *libraryImport = [[TSLibraryImport alloc] init];

[libraryImport importAsset:assetURL toURL:locationURL completionBlock:^(TSLibraryImport *libraryImport)
{
    if(libraryImport.status == AVAssetExportSessionStatusCompleted)
    {
         //Once complete the file will be store on the location URL you set earlier. Now you can get the file from that location and convert it to NSData and send it to the server. There are plenty of ways to do that.
     }

     else
     {
         //Here means import failed. :(
     }
}];

然后pass vhost in the template variables属性并在.erb文件中使用它。

(另外,作为参考,您通常不想在配方中设置默认节点属性,这是使用node.default['nginx']['hostname'] = vhost 所做的,但这不是根本问题。)