2013-05-03 68 views
2

我有一个厨师(独奏)配方,它会生成一个CSS文件并将其放到Web根目录(在我的案例中为虚拟机上的/vagrant/css)。问题是配方需要知道虚拟机上的流浪同步目录的绝对路径 - 它是一个文件夹,其中Vagrantfile是虚拟目录,默认情况下它映射到虚拟机内的/vagrant以编程方式获得厨师独奏配方中的Vagrant属性

我知道how to set that path

Vagrant.configure("2") do |config| 
    config.vm.synced_folder ".", "/synced/dir/on/vm" 
end 

但问题是,如何让配方知道/synced/dir/on/vm

目前我使用的是:

Vagrant.configure("2") do |config| 
    config.vm.provision :chef_solo do |chef| 
    chef.json = { 
     "base_directory" => "/vagrant" # THIS IS IT 
    } 
    end 
end 

它让我用node["base_directory"]的配方里面的代码,但是有一个缺点是:如果我是写多个配方,将它inconvinient使用node["base_directory"]在每一个配方。硬编码路径要好得多,但它迫使我在chef.json上为每个配方使用相同的密钥。此外,如果我希望分享我的配方,我会强制用户在其Vagrantfile中使用该"base_directory" => "/vagrant"键/值组。

是否有一种API方法在配方代码中的虚拟机上获取此同步目录路径?或者更一般地说:有没有一种方法可以从厨师食谱中获得Vagrant特有的属性?

我搜索了流浪病人的文档,但似乎只有一个single page on that topic,并且因为它特定于流浪者,所以Chef docs也没有相关信息。

+0

我也很想知道这一点。它看起来像曾经有这样做的一些方法,但它不再工作了:https://github.com/aespinosa/workstation-vagrant/blob/master/site-cookbooks/workstation/attributes/default.rb #L23和https://github.com/xforty/chef-drupal/blob/master/recipes/default.rb#L31 – alanthing 2013-06-29 01:42:15

+0

这不是很清楚为什么您要将VM上生成的文件放回到安装的文件夹中来自主机。如果您只需将文件放在“已知”位置,可以使用Chef :: Config [:file_cache_path]。另一个想法是: – CAB 2013-10-10 18:45:32

+0

。如果其他配方需要知道特定CSS文件的结束位置,请向css配方添加一个属性,如default [:cssrecipe] [:cssdir] =“”。在Vagrantfile json属性中做到这一点; chef.json = {:cssrecipe => {:cssdir => [“/ vagrant”]}}。在其他食谱的属性文件中这样做; include_attribute“cssrecipe”。在这些食谱中,您现在可以使用节点[:cssrecipe] [:cssdir]。这对于需要在每个Vagrantfile中使用chef.json来说并不难,但它使得配方之间的关系更容易理解。 – CAB 2013-10-10 18:53:34

回答

2

因此,看起来在理解这是如何工作的方面存在一些脱节。

在编写配方时,通常使用节点属性来定义最终的东西 - 比如web_root目录。

我可以设想包含配方的属性文件:

default['base_directory'] = '/var/www/html' 

这将适用于许多生产服务器在那里。

然后,写你的食谱时,你想让他们,如使用此属性来发送文件:

cookbook_file "#{node['base_directory']/css/myfile.css" do 
    owner "root" 
    ... 
end 

当分享你的食谱,任何人都在服务器上执行这个具有/var/www/html目录将在正确的地方接收你的文件。

在你Vagrantfile,以覆盖节点的base_directory属性的同步目录,你可以做这样的事情:

SYNCED_FOLDER = "/synced/dir/on/vm" 

Vagrant.configure("2") do |config| 

    config.vm.synced_folder ".", SYNCED_FOLDER 

    config.vm.provision :chef_solo do |chef| 
    chef.json = { 
     "base_directory" => SYNCED_FOLDER 
    } 
    end 
end 

不过,你提到你不想有指定base_directory在你的食谱中,所以我会问你使用什么节点属性来驱动你的web根目标位置?

如果您使用的是来自社区网站的apache2食谱,那么对于此:node['apache']['docroot_dir']already an attribute,因此使用它可以控制引用事物的位置。