我有一个Chef(独奏)配方,它会生成一个CSS文件并将其放在Web根目录(我的VM上的/vagrant/css
)中。问题是配方需要知道VM上流浪汉同步目录的绝对路径 - 它是Vagrantfile
所在的文件夹,默认情况下它映射到VM内的/vagrant
。
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"]
,但有一个缺点:如果我要编写多个配方,在每个配方中使用node["base_directory"]
会很不方便。硬编码路径要好得多,但它迫使我在chef.json
上为每个配方使用相同的密钥。
此外,如果我希望分享我的食谱,我会强制用户在"base_directory" => "/vagrant"
中使用Vagrantfile
键/值对。
是否有一种API方法可以在配方代码中在VM上获取此同步目录路径?或者更通用:有没有办法从Chef配方中获取特定于Vagrant的属性?
我搜索了Vagrant文档,但似乎只有一个single page on that topic,因为它是Vagrant特有的,Chef docs中也没有相关信息。
答案 0 :(得分: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 cookbook,那么already an attribute就是node['apache']['docroot_dir']
,所以使用它可以控制引用的内容。