【发布时间】:2013-12-15 23:48:02
【问题描述】:
我有一个 Chef (solo) recipe,它生成一个 CSS 文件并将其放在 web 根目录的某个位置(在我的例子中是 VM 上的/vagrant/css)。问题是配方需要知道 VM 上 vagrant 同步目录的绝对路径 - 它是 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 上为每个配方使用相同的密钥。
此外,如果我想分享我的食谱,我会强制用户在他们的 Vagrantfile 中使用 "base_directory" => "/vagrant" 键/值对。
是否有 API 方法可以在配方代码中获取 VM 上的此同步目录路径? 或者更笼统地说:有没有办法从 Chef 配方中获取 Vagrant 特定的属性?
我搜遍了 Vagrant 文档,但似乎只有一个 single page on that topic,而且因为它是 Vagrant 特有的,所以 Chef docs 中也没有相关信息。
【问题讨论】:
-
我也很想知道这一点。看起来曾经有一些方法可以做到这一点,但它不再起作用了:github.com/aespinosa/workstation-vagrant/blob/master/… 和 github.com/xforty/chef-drupal/blob/master/recipes/…
-
不清楚为什么要将在 VM 上生成的文件放回从主机安装的文件夹中。如果您只需要将文件放在“已知”位置,则可以使用 Chef::Config[:file_cache_path]。
-
另一个想法;如果其他配方需要知道该特定 CSS 文件的最终位置,请向 css 配方添加一个属性,例如 default[:cssrecipe][:cssdir] = ""。在 Vagrantfile json 属性中执行此操作; chef.json = { :cssrecipe => { :cssdir => [ "/vagrant" ] }}。在其他配方的属性文件中执行此操作;包含属性“cssrecipe”。在这些配方中,您现在可以使用 node[:cssrecipe][:cssdir]。这与需要在每个 Vagrantfile 中使用 chef.json 一样繁重,但它使食谱之间的关系更容易理解。
-
没有。您必须将值传递到
node对象 -
您找到解决方案了吗?请不要忘记将答案标记为正确! :)
标签: api chef-infra vagrant chef-recipe