【问题标题】:vagrant Berkshelf berksfile_pathvagrant Berkshelf berksfile_path
【发布时间】:2016-07-22 10:12:45
【问题描述】:

我在根项目中有一个食谱文件夹,其中也有 Vagrantfile。 我只有几本食谱(starter 依赖于 "apt",数据库依赖于 mysql)。这些食谱是使用 berks cookbook 生成的。

现在的问题是在 Vagrantfile 中设置 config.berkshelf.berksfile_path 时,我不知道是放 ./cookbooks/starter/Berksfile 还是./cookbooks/database/Berksfile 因为两本食谱都有 berks 依赖项。

我尝试了多种选择,例如将这些食谱移入 cookbooks-src 并遍历它们中的每一个并执行 berks vendor ../../cookbooks 但没有工作,因为第二个供应商生成的食谱会覆盖以前的。

还尝试将每个食谱依赖项供应到 ./cookbooks/the-cookbook/cookbooks,但 vagrant 无法识别它们。

这是我的流浪文件:

Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.hostname = "chef-DK"

  config.vm.provider "virtualbox" do |v|
    v.customize ["modifyvm", :id, "--cpuexecutioncap", "67"]
    v.memory = 537
  end

  config.berkshelf.enabled = true
  config.berkshelf.berksfile_path = "./cookbooks/starter/Berksfile"
  config.vm.provision :chef_solo do |chef|
    chef.install = false  

    chef.run_list = [
      'recipe[starter::default]',
      'recipe[database::default]'
    ]
  end
end

project/
├── cookbooks/
│   ├── database
│   │         ├── recipes
│   │         ├── Berksfile
│   │         └── metadata.rb
│   └── starter
│             ├── recipes
│             ├── Berksfile
│             └── metadata.rb
└── Vagrantfile

=============================================

starter/metadata.rb 的内容:

name             'starter'
maintainer       'YOUR_NAME'
maintainer_email 'YOUR_EMAIL'
license          'All rights reserved'
description      'Installs/Configures starter'
long_description 'Installs/Configures starter'
version          '0.1.0'

depends 'apt', '~> 3.0.0'

starter/Berksfile 的内容:

source "https://supermarket.chef.io"

metadata

cookbook 'apt', '~> 3.0.0'

=============================================

database/metadata.rb 的内容:

name 'database'
maintainer 'The Authors'
maintainer_email 'you@example.com'
license 'all_rights'
description 'Installs/Configures database'
long_description 'Installs/Configures database'
version '0.1.0'

depends 'mysql', '~> 6.0'

数据库/Berksfile 的内容:

source "https://supermarket.chef.io"

metadata

cookbook 'mysql', '~> 6.1.3'

【问题讨论】:

  • 能否将Berksfiles 和depends 的输出添加到metadata.rb 文件中?只是为了检查你没有任何不寻常的依赖。可能您需要创建另一个包含其他两个说明书的 Berksfile。
  • 我刚刚将您要求的内容添加到主要问题中。我试图在这几本食谱所在的根文件夹中添加一个berksfile,但随后vagrant会抱怨berksfile旁边没有metadata.rb。我尝试了一种实际可行但不是我想要的解决方法。我只是通过路径属性在我的 starter/berksfile 中放入了对数据库说明书的依赖项,并将数据库/berksfile 的所有依赖项移动到 starter/berksfile 中,最后是供应商 starter 说明书,但这又不是我真正想要的随心所欲地工作。

标签: vagrant chef-infra berkshelf


【解决方案1】:

首先我想澄清一下,berkshelf metadata 指令读取说明书 metadata.rb(即,您的 Berksfiles 中的 cookbook 条目似乎是多余的)。

在您的情况下,您可以在您的主 project/ 目录(在您的 Vagrantfile 旁边)创建一个 Berksfile,其中包含以下内容:

source 'https://supermarket.chef.io'

cookbook 'database', path: 'cookbooks/database'
cookbook 'starter', path: 'cookbooks/starter'

然后将其添加到您的 Vagrantfile

config.berkshelf.berksfile_path = './Berksfile'

我认为您的问题是您在 vagrant Berksfile 中添加了 metadata 指令,这就是为什么您会收到 "there is no metadata.rb" 错误。

【讨论】:

  • 不知道是什么让你“思考”,因为 5 个文件的内容都在这里。感谢您提供的提示,我可以在 vagrant 旁边的根目录中添加一个额外的 berksfile,但它仍然会提示有关 metadata.rb 的错误。感谢您提供有关将相对路径放入食谱的提示。我认为有解决方法,但不是真正的解决方案。如果有任何人可以测试这个,我就是这么小的测试?创建 2 个带有 berks 依赖项的食谱,并尝试用它来提供一个 vagrant box。它只是行不通。
  • 我在回答您的问题之前对此进行了测试,它确实有效。也许我没有正确解释自己。我正在使用流浪版本1.6.5、berkshelf 版本4.3.0vagrant-berkshelf 插件版本4.1.0。我的意思是,也许当您尝试使用 root Berksfile 时,您在其中添加了 metadata 指令,这就是您收到有关 metadata.rb 错误的原因。如果您不添加 metadata 指令,则不应抱怨需要 metadata.rb
  • 所以我应该有一个空白的 metadata.rb 文件。会试试的。
  • 不,您不需要一个空的 metadata.rb。只是不要在 vagrant 使用的 root Berksfile 中放置 metadata 指令。如果您这样做,它不应该抱怨 missing metadata.rb
猜你喜欢
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
相关资源
最近更新 更多