Chef 官方食谱的语法错误,配置 Vagrant

Syntax error on a Chef official recipe, provisioning Vagrant

我在官方食谱上遇到语法错误。当我试图从一个流浪者盒子里 运行 这个食谱时,它工作正常。我用过:

chef-client --local-mode --runlist [...]

现在我正在尝试为盒子提供 chef-solo,因为 chef-client 需要服务器和密钥。应该是等价的。

这是我的 Vagrantfile,我有两台机器,每台机器都由一些厨师食谱提供。我还设置了 ssh 为 X 模式、名称解析的 DNS 重定向、分配给每台机器的内存以及共享文件夹。

如果我添加到 运行 列表食谱 1、食谱 2,甚至 运行 列表中没有任何食谱,都会出现错误。

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.box = "hashicorp/precise64"

  # Needs vagrant 1.7.2 or newer
  # chef.install = true
  # chef.version = "latest"

  # ---- BEGIN MOST RELEVANT PART ----
  config.vm.define "mybox" do |a|
    a.vm.network "private_network", ip: "192.168.33.12"
    config.vm.provision "chef_solo" do |chef|
        chef.cookbooks_path = "myproject-cookbook/cookbooks"
        #chef.add_recipe "myproject::recipe1"
        #chef.add_recipe "myproject::recipe2"
        #chef.add_recipe "myproject::recipe3"
    end
  end
  # ---- END MOST RELEVANT PART ----

  config.vm.define "myotherbox" do |c|
    c.vm.network "private_network", ip: "192.168.33.11"
    config.vm.provision "chef_solo" do |chef|
        chef.cookbooks_path = "myproject-cookbook/cookbooks"
        chef.add_recipe "myproject::recipe4"
    end
  end

  config.ssh.forward_x11 = true

  config.vm.provider :virtualbox do |vb|
      # DNS queries to the host, which becomes a DNS Proxy
      vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]

      # Lease more RAM to the guest
      vb.customize ["modifyvm", :id, "--memory", "2048"]
  end
  config.vm.synced_folder "../shared", "/home/vagrant/public"
end

实际错误来自官方食谱,windows,如果我没有为 运行 指定一个食谱,我不知道为什么厨师 运行 会这样.

$ vagrant provision
==> mybox: Running provisioner: chef_solo...
Generating chef JSON and uploading...
==> mybox: Warning: Chef run list is empty. This may not be what you want.
==> mybox: Running chef-solo...
==> mybox: stdin: is not a tty
==> mybox: [2015-03-04T11:08:09+00:00] INFO: *** Chef 10.14.2 ***
==> mybox: [2015-03-04T11:08:11+00:00] INFO: Run List is []
==> mybox: [2015-03-04T11:08:11+00:00] INFO: Run List expands to []
==> mybox: [2015-03-04T11:08:11+00:00] INFO: Starting Chef Run for precise64
==> mybox: [2015-03-04T11:08:11+00:00] INFO: Running start handlers
==> mybox: [2015-03-04T11:08:11+00:00] INFO: Start handlers complete.
==> mybox: 
==> mybox: ================================================================================
==> mybox: Recipe Compile Error in /tmp/vagrant-chef-1/chef-solo-1/cookbooks/windows/libraries/windows_package.rb
==> mybox: ================================================================================
==> mybox: 
==> mybox: SyntaxError
==> mybox: -----------
==> mybox: /tmp/vagrant-chef-1/chef-solo-1/cookbooks/windows/libraries/windows_package.rb:239: syntax error, unexpected ':', expecting kEND
==> mybox:         provides :windows_package, os: "windows"
==> mybox:                                       ^
==> mybox: Cookbook Trace:
==> mybox: ---------------
==> mybox:   /opt/vagrant_ruby/lib/ruby/gems/1.8/gems/chef-10.14.2/bin/../lib/chef/run_context.rb:140:in `load'
==> mybox:   /opt/vagrant_ruby/lib/ruby/gems/1.8/gems/chef-10.14.2/bin/../lib/chef/run_context.rb:140:in `load_libraries'
==> mybox:   /opt/vagrant_ruby/lib/ruby/gems/1.8/gems/chef-10.14.2/bin/../lib/chef/run_context.rb:230:in `call'
==> mybox:   /opt/vagrant_ruby/lib/ruby/gems/1.8/gems/chef-10.14.2/bin/../lib/chef/run_context.rb:230:in `foreach_cookbook_load_segment'
==> mybox:   /opt/vagrant_ruby/lib/ruby/gems/1.8/gems/chef-10.14.2/bin/../lib/chef/run_context.rb:229:in `each'
==> mybox:   /opt/vagrant_ruby/lib/ruby/gems/1.8/gems/chef-10.14.2/bin/../lib/chef/run_context.rb:229:in `foreach_cookbook_load_segment'
==> mybox:   /opt/vagrant_ruby/lib/ruby/gems/1.8/gems/chef-10.14.2/bin/../lib/chef/run_context.rb:227:in `each'
==> mybox:   /opt/vagrant_ruby/lib/ruby/gems/1.8/gems/chef-10.14.2/bin/../lib/chef/run_context.rb:227:in `foreach_cookbook_load_segment'
==> mybox:   /opt/vagrant_ruby/lib/ruby/gems/1.8/gems/chef-10.14.2/bin/../lib/chef/run_context.rb:137:in `load_libraries'
==> mybox:   /opt/vagrant_ruby/lib/ruby/gems/1.8/gems/chef-10.14.2/bin/../lib/chef/run_context.rb:62:in `load'
==> mybox:   /opt/vagrant_ruby/lib/ruby/gems/1.8/gems/chef-10.14.2/bin/../lib/chef/client.rb:198:in `setup_run_context'
==> mybox:   /opt/vagrant_ruby/lib/ruby/gems/1.8/gems/chef-10.14.2/bin/../lib/chef/client.rb:418:in `do_run'
==> mybox:   /opt/vagrant_ruby/lib/ruby/gems/1.8/gems/chef-10.14.2/bin/../lib/chef/client.rb:176:in `run'
==> mybox:   /opt/vagrant_ruby/lib/ruby/gems/1.8/gems/chef-10.14.2/bin/../lib/chef/application/solo.rb:230:in `run_application'
==> mybox:   /opt/vagrant_ruby/lib/ruby/gems/1.8/gems/chef-10.14.2/bin/../lib/chef/application/solo.rb:218:in `loop'
==> mybox:   /opt/vagrant_ruby/lib/ruby/gems/1.8/gems/chef-10.14.2/bin/../lib/chef/application/solo.rb:218:in `run_application'
==> mybox:   /opt/vagrant_ruby/lib/ruby/gems/1.8/gems/chef-10.14.2/bin/../lib/chef/application.rb:70:in `run'
==> mybox:   /opt/vagrant_ruby/lib/ruby/gems/1.8/gems/chef-10.14.2/bin/chef-solo:25
==> mybox:   /opt/vagrant_ruby/bin/chef-solo:19:in `load'
==> mybox:   /opt/vagrant_ruby/bin/chef-solo:19
==> mybox: 
==> mybox: Relevant File Content:
==> mybox: ----------------------
==> mybox: /opt/vagrant_ruby/lib/ruby/gems/1.8/gems/chef-10.14.2/bin/../lib/chef/run_context.rb:
==> mybox: 
==> mybox:   1:  #
==> mybox:   2:  # Author:: Adam Jacob (<adam@opscode.com>)
==> mybox:   3:  # Author:: Christopher Walters (<cw@opscode.com>)
==> mybox:   4:  # Author:: Tim Hinderliter (<tim@opscode.com>)
==> mybox:   5:  # Copyright:: Copyright (c) 2008-2010 Opscode, Inc.
==> mybox:   6:  # License:: Apache License, Version 2.0
==> mybox:   7:  #
==> mybox:   8:  # Licensed under the Apache License, Version 2.0 (the "License");
==> mybox:   9:  # you may not use this file except in compliance with the License.
==> mybox: 
==> mybox: [2015-03-04T11:08:11+00:00] ERROR: Running exception handlers
==> mybox: [2015-03-04T11:08:11+00:00] ERROR: Exception handlers complete
==> mybox: [2015-03-04T11:08:11+00:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
==> mybox: [2015-03-04T11:08:11+00:00] FATAL: SyntaxError: /tmp/vagrant-chef-1/chef-solo-1/cookbooks/windows/libraries/windows_package.rb:239: syntax error, unexpected ':', expecting kEND
==> mybox:         provides :windows_package, os: "windows"
==> mybox:                                       ^
Chef never successfully completed! Any errors should be visible in the
output above. Please fix your recipes so that they properly complete.

重要的是我没有编辑这个食谱,它在 chef-client 手动执行它而不是从 vagrant 执行它时工作正常,最重要的是,ruby 的确切版本应该正在执行配方说没有语法:

$ /opt/chef/embedded/bin/ruby -c myproject-cookbook/cookbooks/windows/libraries/windows_package.rb 
Syntax OK

你可以检查失败的配方in github

食谱文件夹中的食谱是:


真题:

  1. 为什么这是 "windows_package" 食谱 运行?
  2. 为什么 chef 抱怨语法错误而 ruby 本身却没有?

编辑(我几乎没有任何特权): 是的,chef 奇怪地在 guest "mybox":

版本 10.14.2
vagrant@precise64:~$ chef-solo -v
Chef: 10.14.2

相反,主机中的 chef-client 是综合安装程序安装的版本...

user@host$ chef-solo -v
Chef: 12.1.0

我认为主机的厨师被复制到来宾然后 运行 在来宾中,我将重新检查配置并尝试使其安装正确的版本。

谢谢!


编辑2: 这实际上是厨师版。好像不需要事先在host上安装chef;相反,vagrant 会自行在 guest 上安装它,选择它喜欢的版本。

直到 vagrant 版本 1.7.2 需要安装 vagrant-omnibus 插件才能选择要安装的版本。参见 how to do it

从1.7.2开始,不需要任何插件,使用"install"和"version"方法即可。文档 here.

来源:Mazinlabs blog(日语)

我很确定这与盒子上安装的 chef 版本有关:

==> mybox: [2015-03-04T11:08:09+00:00] INFO: *** Chef 10.14.2 ***

我不能确定,但​​我敢打赌您在尝试使用 ssh 时使用的是不同的 chef 版本。不管怎样,10.14.2 已经很老了,你会在最近的食谱中遇到错误。

IIRC 有一个 install/upadte 厨师的 vagrant 插件(vagrant-omnibus?)