【问题标题】:Provisioning Vagrant box with chef-solo and vagrant用 chef-solo 和 vagrant 配置 Vagrant 盒子
【发布时间】:2017-02-17 01:35:38
【问题描述】:

我想启动一个 Vagrant 盒子并使用 chef-solo 和 berkshelf 配置一个 LAMP 堆栈。这是我采取的步骤:

berks cookbook my_project

然后在 Berksfile 中:

site :opscode

cookbook 'wordpress', '~> 3.0.0'
cookbook 'apache2', '~> 3.2.2'
cookbook 'mysql', '~> 8.2.0'
cookbook 'php', '~> 2.2.0'

然后berks vendor cookbooks

流浪文件

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = '2'

Vagrant.require_version '>= 1.5.0'

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.hostname = 'unify-config-berkshelf'

  if Vagrant.has_plugin?("vagrant-omnibus")
    config.omnibus.chef_version = 'latest'
  end

  config.vm.box = 'bento/ubuntu-14.04'

  config.vm.network :private_network, type: 'dhcp'

  config.vm.provision :chef_solo do |chef|
    chef.json = {
      mysql: {
        server_root_password: 'rootpass',
        server_debian_password: 'debpass',
        server_repl_password: 'replpass'
      }
    }

    chef.run_list = [
        "recipe[apache2]",
        "recipe[apache2::mod_php5]",
        "recipe[mysql::client]",
        "recipe[mysql::server]",
        "recipe[php]",
        "recipe[php::module_mysql]"
    ]
  end
end

然后我试着用vagrant up 把盒子拿出来。这是我得到的错误。

The following berks command failed to execute:

/Users/stoebelj/.rbenv/shims/berks --version --format json

The stdout and stderr are shown below:

stdout: 
stderr: Ignoring ffi-1.9.14 because its extensions are not built.  Try: gem pristine ffi --version 1.9.14
Ignoring nokogiri-1.6.7.1 because its extensions are not built.  Try: gem pristine nokogiri --version 1.6.7.1
Ignoring unf_ext-0.0.7.2 because its extensions are not built.  Try: gem pristine unf_ext --version 0.0.7.2
Ignoring wdm-0.1.1 because its extensions are not built.  Try: gem pristine wdm --version 0.1.1
/Users/stoebelj/.rbenv/versions/2.3.1/lib/ruby/2.3.0/rubygems/dependency.rb:319:in `to_specs': Could not find 'berkshelf' (>= 0.a) among 47 total gem(s) (Gem::LoadError)
Checked in 'GEM_PATH=/opt/vagrant/embedded/gems', execute `gem env` for more information
from /Users/stoebelj/.rbenv/versions/2.3.1/lib/ruby/2.3.0/rubygems/dependency.rb:328:in `to_spec'
from /Users/stoebelj/.rbenv/versions/2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_gem.rb:65:in `gem'
from /Users/stoebelj/.rbenv/versions/2.3.1/bin/berks:22:in `<main>'


It appears that you are not using the ChefDK. Please note that Vagrant Berkshelf
works best when used with the ChefDK, and other installation methods are not
officially supported.

Please download and install the latest version of the ChefDK from:

https://downloads.chef.io/chef-dk

and follow the installation instructions. Do not forget to add the ChefDK to
your PATH.

我从给定的 URL 安装了 ChefDK,/usr/local/bin/chef 在我的PATH

我误会了什么?

更新

下面的一个问题建议我从我的 rbenv 中删除 berkshelf,这确实消除了以下错误。现在我有一个不同的错误:

The Berkshelf version at "/usr/local/bin/berks" is invalid.
Vagrant Berkshelf requires >= 4.0, but the current version is .

Please download and install the latest version of the ChefDK from:

https://downloads.chef.io/chef-dk

and follow the installation instructions. Do not forget to add the ChefDK to
your PATH.

对于上下文,我检查了this,它建议我更新我的插件。这没有用。我还尝试删除插件并安装也不起作用的 4.1 版。

对于上下文:

$ vagrant plugin list
vagrant-berkshelf (5.1.1)
vagrant-omnibus (1.5.0)
vagrant-share (1.1.6, system)
$ which berks
/usr/local/bin/berks

berks 本身似乎可以正常工作,但会产生我不明白的警告:

$ berks
W, [2017-02-13T13:46:00.590751 #3199]  WARN -- : You are setting a key that conflicts with a built-in method Hashie::Mash#frozen? defined in Kernel. This can cause unexpected behavior when accessing the key via as a property. You can still access the key via the #[] method.
W, [2017-02-13T13:46:00.591227 #3199]  WARN -- : You are setting a key that conflicts with a built-in method Hashie::Mash#frozen? defined in Kernel. This can cause unexpected behavior when accessing the key via as a property. You can still access the key via the #[] method.
W, [2017-02-13T13:46:00.591452 #3199]  WARN -- : You are setting a key that conflicts with a built-in method VariaModel::Attributes#frozen? defined in Kernel. This can cause unexpected behavior when accessing the key via as a property. You can still access the key via the #[] method.
W, [2017-02-13T13:46:00.591672 #3199]  WARN -- : You are setting a key that conflicts with a built-in method VariaModel::Attributes#frozen? defined in Kernel. This can cause unexpected behavior when accessing the key via as a property. You can still access the key via the #[] method.
W, [2017-02-13T13:46:00.629581 #3199]  WARN -- : You are setting a key that conflicts with a built-in method VariaModel::Attributes#default defined in Hash. This can cause unexpected behavior when accessing the key via as a property. You can still access the key via the #[] method.
W, [2017-02-13T13:46:00.629737 #3199]  WARN -- : You are setting a key that conflicts with a built-in method VariaModel::Attributes#default defined in Hash. This can cause unexpected behavior when accessing the key via as a property. You can still access the key via the #[] method.
Resolving cookbook dependencies...
Fetching 'unify_config' from source at .
Using apache2 (3.2.2)
Using build-essential (7.0.3)
Using compat_resource (12.16.3)
Using iis (5.0.5)
Using mingw (1.2.5)
Using mysql (8.2.0)
Using ohai (4.2.3)
Using php (2.2.0)
Using seven_zip (2.0.2)
Using unify_config (0.1.0) from source at .
Using windows (2.1.1)
Using xml (3.1.1)
Using yum-epel (2.1.1)

【问题讨论】:

    标签: vagrant chef-infra chef-solo berkshelf


    【解决方案1】:

    正如它尝试运行的命令所示,问题不是chef 可执行文件,而是berks。删除您通过 gems 安装的副本,并确保来自 ChefDK 的副本正常工作。

    【讨论】:

    • 谢谢!这完美地回答了最初的问题,但现在我有一个新问题。见上文。
    • 是的,但我收到警告,不知道是否相关:W, [2017-02-13T13:46:00.590751 #3199] WARN -- : You are setting a key that conflicts with a built-in method Hashie::Mash#frozen? defined in Kernel. This can cause unexpected behavior when accessing the key via as a property. You can still access the key via the #[] method.
    • 这很好,已知错误中的错误,但问题只是一个警告。听起来vagrant-berkshelf 没有找到正确的可执行文件。它使用Which.which('berks') 并且不可配置。检查您的$PATH
    • 这是我的路径/Library/Frameworks/Python.framework/Versions/3.4/bin:/Users/stoebelj/.rbenv/shims:/usr/local/bin:/opt/chefdk/bin:/usr/local/bin/chef:/usr/local/share/python:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Users/stoebelj/.npm-global/bin/
    • 哦,嘿,您仍然对破坏的 Hashie 警告感到困惑,这可能会干扰版本解析器。试试chef gem install berkshelf
    【解决方案2】:

    几天前也遇到了这个问题。回滚 ChefDK 的版本对我有帮助:

    ChefDK 1.1.16

    我的同事是挖掘推理的人,他说:

    "vagrant 使用berks -version --format json 或类似的东西来获取berks 的版本,但运行该命令会导致某些依赖berks 使用输出的一些警告日志 这就是版本为空白的原因”

    【讨论】:

    • 谢谢,这成功了!这里给出的两个答案都解决了我的问题。没有办法同时接受两者,所以我接受第一个答案,因为它解决了最初的问题。你的解决了次要问题。