【问题标题】:vagrant up error when creating client? chef-stacktrace: OpenSSL::PKey::RSAError: private key needed创建客户端时出现 vagrant up 错误? chef-stacktrace:OpenSSL::PKey::RSAError:需要私钥
【发布时间】:2013-08-17 04:29:00
【问题描述】:

我目前正在将 Vagrant 与 Chef-solo 一起使用,并且效果很好。我想将流浪魔法扩展到厨师服务器。我已将 Vagrantfile 中的配置器从 chef-solo 切换到 chef-client,并添加了必要的代码:

chef.chef_server_url        = "https://chef.mydomain.com"
chef.validation_client_name = "chef-validator"
chef.validation_key_path    = "/Users/inigo/.chef/chef-validator.pem"

我的问题是如何自动创建客户端,这样我就不必发出刀命令来创建客户端和相应的 client.pem 键。然后我必须在完成后发出刀命令删除客户端。

我希望这是 Vagrant 可以做的事情,我只需要在 Vagrantfile 中添加一些代码,然后“vagrant up”“vagrant destroy”命令将处理这一切。不幸的是,我的谷歌搜索没有发现任何东西。我看过有关如何使用 vagrant 设置厨师服务器的帖子,但我对厨师客户感兴趣。也许是 vagrant 或 berkshelf 的插件?

还有一个问题.. 现在,当我生成 client.pem 密钥时,我将它放在共享目录中:/vagrant 以便 VM 可以访问它。有没有更好的办法?

谢谢!

这是vagrant up的输出:

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Importing base box 'Berkshelf-CentOS-6.3-x86_64-minimal'...
[default] Matching MAC address for NAT networking...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[Berkshelf] Uploading cookbooks to 'https://chef.mydomain.com:443/'
[Berkshelf] Using testcookbook (0.0.1)
[Berkshelf] Uploading testcookbook (0.0.1) to: 'https://chef.mydomain.com:443/'
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few minutes.
[default] VM booted and ready for use!
[default] Setting hostname...
[default] Configuring and enabling network interfaces...
[default] Mounting shared folders...
[default] -- /vagrant
[default] Installing Chef 11.6.0 Omnibus package...
[default] Running provisioner: chef_client...
Creating folder to hold client key...
Uploading chef client validation key...
Generating chef JSON and uploading...
Running chef-client...
[2013-08-15T15:42:28+00:00] INFO: Forking chef instance to converge...
[2013-08-15T15:42:28+00:00] INFO: *** Chef 11.6.0 ***
[2013-08-15T15:42:28+00:00] INFO: Client key /etc/chef/client.pem is not present - registering

====================================================================================
Chef encountered an error attempting to create the client "mytestcookbook-berkshelf"
====================================================================================


[2013-08-15T15:42:29+00:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
[2013-08-15T15:42:29+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)
Chef never successfully completed! Any errors should be visible in the
output above. Please fix your recipes so that they properly complete.

这是在失败vagrant up 上的 chef-stacktrace.out 文件的内容:

Generated at 2013-08-16 03:42:20 +0000
OpenSSL::PKey::RSAError: private key needed.
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/mixlib-authentication-1.3.0/lib/mixlib/authentication/signedheaderauth.rb:94:in `private_encrypt'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/mixlib-authentication-1.3.0/lib/mixlib/authentication/signedheaderauth.rb:94:in `sign'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.0/lib/chef/rest/auth_credentials.rb:51:in `signature_headers'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.0/lib/chef/rest.rb:322:in `authentication_headers'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.0/lib/chef/rest.rb:368:in `build_headers'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.0/lib/chef/rest.rb:166:in `raw_http_request'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.0/lib/chef/rest.rb:161:in `api_request'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.0/lib/chef/rest.rb:121:in `post'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.0/lib/chef/api_client/registration.rb:93:in `create'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.0/lib/chef/api_client/registration.rb:84:in `create_or_update'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.0/lib/chef/api_client/registration.rb:57:in `run'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.0/lib/chef/client.rb:376:in `register'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.0/lib/chef/client.rb:480:in `do_run'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.0/lib/chef/client.rb:199:in `block in run'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.0/lib/chef/client.rb:193:in `fork'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.0/lib/chef/client.rb:193:in `run'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.0/lib/chef/application.rb:183:in `run_chef_client'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.0/lib/chef/application/client.rb:302:in `block in run_application'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.0/lib/chef/application/client.rb:294:in `loop'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.0/lib/chef/application/client.rb:294:in `run_application'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.0/lib/chef/application.rb:66:in `run'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.6.0/bin/chef-client:26:in `<top (required)>'
/usr/bin/chef-client:23:in `load'
/usr/bin/chef-client:23:in `<main>'

为了更好的衡量......这是当前的 Vagrantfile 减去所有注释行:

# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
  config.vm.hostname = "testcookbook-berkshelf"
  config.vm.box = "Berkshelf-CentOS-6.3-x86_64-minimal"
  config.vm.box_url = "https://dl.dropbox.com/u/31081437/Berkshelf-CentOS-6.3-x86_64-minimal.box"
  config.vm.network :private_network, ip: "33.33.33.10"
  config.ssh.max_tries = 40
  config.ssh.timeout   = 120
  config.berkshelf.enabled = true
  config.omnibus.chef_version = :latest
  config.vm.provision :chef_client do |chef|
    chef.chef_server_url        = "https://chef.mydomain.com"
    chef.validation_client_name = "chef-validator"
    chef.validation_key_path    = "/Users/inigo/.chef/chef-validator.pem"
    chef.run_list = [
        "recipe[testcookbook::default]"
    ]
  end
end

【问题讨论】:

    标签: chef-infra vagrant berkshelf


    【解决方案1】:

    您的示例中唯一错误的是chef.validation_key_path 可能指向错误的位置。

    您必须将其设置为工作站中验证密钥的位置(可能类似于 "#{ENV['HOME']}/.chef/validation.pem" 或类似名称)。

    一旦你准备好了,当你 vagrant up 时,它会将验证密钥文件复制到 VM 并使用它在 Chef 服务器上自动创建 clientnode

    如果你不介意我的无耻插件,我编写了一个名为 Vagrant::Butcher 的 Vagrant 插件,它可以在你发出 vagrant destroy 时自动删除 nodeclient

    【讨论】:

    • 那部分确实有效。它从我位于/etc/chef 的工作站中获取validation.pem 文件,然后启动VM,安装chef 并运行chef-client,它尝试注册新的VM 来厨师服务器。我希望它此时会创建 client.pem 文件,但它只是抱怨找不到它。
    • 感谢插件!.. 这正是我完成测试后所需要的。如果有对应的,那就太好了:vagrant up。我是厨师新手,所以我可能错过了一些可以照顾我正在寻找的东西。
    • 正如我所说,vagrant up 应该在 Chef 服务器上创建对象,然后创建 client.pem 文件。如果它失败了,那么有一些特定于您的环境的东西不允许它这样做。在运行up 之前,您是否检查过服务器上不存在客户端?如果存在,请先删除它(及其对应的节点),然后重试。如果它仍然失败,请将完整的错误粘贴到某处——这可能会给我们一个线索来了解正在发生的事情。 :)
    • 我做了一个berks reconfig 并设置了 chef_client 供应商而不是 chef_solo。然后我在我的食谱目录中编辑了Vagrantfile。并添加以下内容: chef.client_key_path = "/vagrant/.chef/client.pem" 然后运行刀客户端创建命令以生成 client.pem 密钥并将其指向说明书的 .chef 目录。这在正确的位置创建了 pem 文件,我能够vagrant up 没问题。我想我只会添加一个 :shell 供应商。我需要更多地阅读它,但我认为我可以删除那一行来即时创建 pem 密钥。
    • berks initchef_client 设置为我的意思是提供者
    猜你喜欢
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多