通过 Vagrant 进行 Chef 客户端服务器身份验证

Chef Client Server Authentication through Vagrant

我正在尝试通过连接到 Chef 服务器来提供带有 Chef 的 Vagrant 实例。

我的 Vagrantfile 看起来与此类似:

Vagrant.configure("2") do |config|

    config.vm.box = "opentable/win-2012r2-standard-amd64-nocm"
    config.vm.provider = "virtualbox"
    config.vm.communicator = "winrm"
    config.vm.guest = :windows

    config.omnibus.chef_version = :latest
    config.berkshelf.enabled = true

    config.vm.provision :chef_client do |chef|
      chef.chef_server_url = "https://chef.website.com"
      chef.validation_key_path = "C:/chef/validation.pem"
      chef.run_list = ["recipe[cookbook::default]"]
    end
end

根据this documentation,这个Vagrantfile应该包含我需要连接到Chef服务器并下载相关的cookbooks和databags的所有字段。

但是,当 运行使用 Chef 客户端配置程序时,我 运行 遇到以下错误:

The following berks command failed to execute:

    C:\opscode\chefdk\embedded\bin/berks.BAT upload --berksfile C:/path/to/cookbook/Berksfile --no-freeze --force

The stdout and stderr are shown below:

    stdout: E, [2015-08-10T17:02:57.654352 #8488] ERROR -- : Ridley::Errors::ClientKeyNotFoundOrInvalid: client key is not found or invalid or not found at: 'C:/chef/client.pem'

的确, client.pem 不存在。

虽然错误本身很容易解释,但我不明白为什么我需要在初始 Chef 客户端 运行.

上指定 client.pem

有没有办法让 Vagrant 自己创建它?更好的是,我可以让它根本不需要客户端标识符吗?

这只是一个 Vagrant 实例,因此我不需要将此节点保留在 Chef 服务器上。基于 the Chef client provisioner documentation,我不明白为什么我需要一个 client.pem 文件,因为说明中没有提到这一点。

感谢您的帮助!

尝试禁用 Berkshelf

config.berkshelf.enabled = false

针对 Chef 服务器引导新的 Chef 客户端不需要 Berkshelf。 Berkshelf 是 Chef 工作站 上用于管理 Chef 服务器上的食谱的工具。

PS

某一阶段的 Vagrant-berkshelf 插件是 deprecated in favour of Test kitchen。它似乎又回来了,但与此同时,我已经逐渐意识到测试驱动基础架构的好处!