Api 以编程方式获取Chef solo recipe中的Vagrant属性

Api 以编程方式获取Chef solo recipe中的Vagrant属性,api,chef-infra,vagrant,chef-recipe,Api,Chef Infra,Vagrant,Chef Recipe,我有一个Chef(solo)菜谱,它生成一个CSS文件并将其放在web根目录的某个地方(在我的例子中是VM上的/vagrant/CSS)。问题是配方需要知道VM上vagrant Synched目录的绝对路径-它是Vagrantfile所在的文件夹,默认情况下,它映射到VM中的/vagrant 我知道: Vagrant.configure(“2”)do | config| config.vm.synced_文件夹“,”/synced/dir/on/vm” 结束 但问题是如何让配方知道/synce

我有一个Chef(solo)菜谱,它生成一个CSS文件并将其放在web根目录的某个地方(在我的例子中是VM上的
/vagrant/CSS
)。问题是配方需要知道VM上vagrant Synched目录的绝对路径-它是
Vagrantfile
所在的文件夹,默认情况下,它映射到VM中的
/vagrant

我知道:

Vagrant.configure(“2”)do | config|
config.vm.synced_文件夹“,”/synced/dir/on/vm”
结束
但问题是如何让配方知道
/synced/dir/on/vm

目前我使用的是:

Vagrant.configure(“2”)do | config|
config.vm.provision:chef_solo do|chef|
chef.json={
“基本目录”=>“/vagrant”#就是它
}
结束
结束
它允许我在配方代码中使用
node[“base\u directory”]
,但这有一个缺点:如果我要编写多个配方,在每个配方中使用
node[“base\u directory”]
。硬编码路径要好得多,但它迫使我在
chef.json
上对每个菜谱使用相同的键

此外,如果我想分享我的配方,我会强制用户在他们的
vagrant文件中使用
基目录=>“/vagrant”
键/值对

配方代码中是否有API方法可以在VM上获取此同步目录路径?或者更一般地说:是否有方法从厨师配方中获取特定于流浪者的属性


我搜索了流浪汉的文档,但似乎只有一个,而且因为它是针对流浪汉的,在这两个文档中都没有相关信息。

因此,在理解这是如何工作的过程中,似乎存在一些脱节

在编写菜谱时,通常使用节点属性来定义最终的位置,例如web\u根目录

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

default['base_directory'] = '/var/www/html'
这将适用于许多生产服务器

然后,在编写食谱时,使用此属性将文件发送到您希望的位置,例如:

cookbook_file "#{node['base_directory']/css/myfile.css" do
  owner "root"
  ...
end
在共享您的烹饪书时,在具有
/var/www/html
目录的服务器上执行此操作的任何人都将在正确的位置接收您的文件

在Vagrant文件中,为了将节点的
base\u目录
属性覆盖到同步目录,可以执行以下操作:

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\u目录
,因此我想问一下,您使用什么节点属性来驱动web根目录的目标位置


如果您使用的是来自社区站点的apache2 cookbook之类的东西,那么这里就有:
节点['apache']['docroot\u dir']
,因此使用它您可以控制引用对象的位置。

我也想知道这一点。看起来以前有一些方法可以做到这一点,但现在已经不起作用了:现在还不清楚为什么要将VM上生成的文件放回从主机装载的文件夹中。如果只需要将文件放到“已知”位置,可以使用Chef::Config[:file\u cache\u path];如果其他配方需要知道特定CSS文件的最终位置,请向CSS配方添加一个属性,如default[:cssrecipe][:cssdir]=“”。在Vagrantfile中,json属性执行此操作;chef.json={:cssrecipe=>{:cssdir=>[“/vagrant”]}。在其他配方的属性文件中执行此操作;包括_属性“cssrecipe”。在这些配方中,您现在可以使用node[:cssrecipe][:cssdir]。在每个Vagrant文件中都需要使用chef.json,这同样是一项繁重的工作,但它使菜谱之间的关系更容易理解。不。您必须将这些值传递到
节点
对象。您找到解决方案了吗?请不要忘记将答案标记为正确!:)