2013-05-03 67 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,因此使用它可以控制引用事物的位置。