我有一个 Chef(独奏)配方,它生成一个 CSS 文件并将其放入 Web 根目录中的某个位置(在我的例子中,/vagrant/css
在 VM 上)。问题是配方需要知道虚拟机上 vagrant 同步目录的绝对路径 - 这是一个文件夹,其中 Vagrantfile
是,默认情况下它映射到 /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"]
在菜谱代码里面,但是这样做有一个缺点:如果我要写多个菜谱,使用 node["base_directory"]
会很不方便。在每个 Recipe 中。对路径进行硬编码要好得多,但它迫使我在 chef.json
上使用相同的 key 每个 Recipe 。
此外,如果我想分享我的 Recipe ,我会强制用户使用 "base_directory" => "/vagrant"
Vagrantfile
中的键/值对.
是否有 API 方法可以在配方代码中获取 VM 上的同步目录路径?或者更一般地说:有没有办法从 Chef 配方中获取 Vagrant 特定的属性?
我搜索了 Vagrant 文档,但似乎只有一个 single page on that topic ,又因为是Vagrant特有的,所以Chef docs中没有相关信息要么。
最佳答案
因此,对于其工作原理的理解似乎存在一些脱节。
编写配方时,通常使用节点属性来定义事物的最终位置 - 例如您的 web_root 目录。
我可以想象配方的属性文件包含:
default['base_directory'] = '/var/www/html'
这适用于许多生产服务器。
然后,在编写 Recipe 时,使用此属性将文件发送到您想要的位置,例如:
cookbook_file "#{node['base_directory']/css/myfile.css" do
owner "root"
...
end
共享您的 Recipe 时,任何在具有 /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
但是,您提到您不想在 Recipe 中指定base_directory
,所以我想问您使用什么节点属性来驱动网络根目录的目标位置?
如果您使用的是社区站点中的 apache2 Recipe 之类的内容,那么有 already an attribute为此:node['apache']['docroot_dir']
,因此您可以使用它来控制引用事物的位置。
关于api - 以编程方式获取 Chef 独奏菜谱中的 Vagrant 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16367220/