2

我有一个 Chef (solo) recipe,它生成一个 CSS 文件并将其放在 web 根目录的某个位置(/vagrant/css在我的例子中是在 VM 上)。问题是配方需要知道虚拟机上 vagrant 同步目录的绝对路径——它是一个文件夹,Vagrantfile默认情况下它映射到/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 文档,但似乎只有一页关于该主题的页面,而且由于它是 Vagrant 特有的,因此Chef 文档中也没有相关信息。

4

1 回答 1

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'],因此您可以使用它来控制引用事物的位置。

于 2013-12-15T15:48:02.387 回答