【问题标题】:Programmatically get Vagrant property in Chef solo recipe以编程方式在 Chef solo recipe 中获取 Vagrant 属性
【发布时间】:2013-12-15 23:48:02
【问题描述】:

我有一个 Chef (solo) recipe,它生成一个 CSS 文件并将其放在 web 根目录的某个位置(在我的例子中是 VM 上的/vagrant/css)。问题是配方需要知道 VM 上 vagrant 同步目录的绝对路径 - 它是 Vagrantfile 所在的文件夹,默认情况下它映射到 VM 内的 /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"] 会很不方便。硬编码路径要好得多,但它迫使我在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


【解决方案1】:

因此,在理解它的工作原理方面似乎存在一些脱节。

在编写配方时,通常使用节点属性来定义事物的结束位置 - 例如您的 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 食谱之类的东西,那么这里有 already an attributenode['apache']['docroot_dir'],因此您可以使用它来控制引用事物的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多