api - 以编程方式获取 Chef 独奏菜谱中的 Vagrant 属性

标签 api chef-infra vagrant chef-recipe

我有一个 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/

相关文章:

javascript - 使用 AWS OpsWorks 以具有 sudo 权限的用户身份运行 `before_migrate.rb` 中的命令

ssh - 如何使用 "vagrant ssh"进行 ssh 代理转发?

android - 使用来自 Android 应用程序的自签名证书访问在服务器上运行的 REST API

javascript - 在 React.js 中将字符串转换为真正的 HTML

linux - 警告 : the use of `tmpnam' is dangerous, 更好地使用 `mkstemp'

vagrant - 如何在 Vagrant 中为多机环境指定配置器默认值?

Vagrant Chef solo 无法访问 Recipe

javascript - 是否可以通过网络浏览器 api 访问移动设备的电池状态或充电?

chef-infra - 从 Ruby 脚本调用 Knife 命令,无需脱壳

linux - 无法上传我的 Recipe