![Berksfile 源无法识别自托管 Chef 服务器](https://linux22.com/image/651531/Berksfile%20%E6%BA%90%E6%97%A0%E6%B3%95%E8%AF%86%E5%88%AB%E8%87%AA%E6%89%98%E7%AE%A1%20Chef%20%E6%9C%8D%E5%8A%A1%E5%99%A8.png)
我有一个自托管的 Chef 服务器。我可以knife upload
访问该服务器,并以其他方式与其交互。因此,我的knife.rb
工作正常。我最近参数化了一个食谱,以便使其成为一系列相关食谱的基础。
问题是我希望这本食谱是私人的,所以它只存在于我的私人 Chef 服务器上。不幸的是,我无法berks install
在我的其他食谱上这样做。我已将我的指向Berksfile
我的 Chef 服务器:
source https://chef.myhost.com
这不管用。我思考这是因为该 URL 是 Chef Manage 的 URL,而不是 Chef Server API。但是,我不知道如何让 Berkshelf 识别我的 Chef Server 并使用其 API。
完整错误:
> berks install
Resolving cookbook dependencies...
Fetching 'blog_role' from source at .
Fetching cookbook index from chef.myhost.com...
Error retrieving universe from source: chef.myhost.com * [Berkshelf::APIClient::BadResponse] bad response #<Faraday::Response:0x36ae618 @on_complete_callbacks=[], @env=#<Faraday::Env @method=:get @body="<html><body>You are being <a href=\"chef.myhost.com:443/signup\">redirected</a>.</body></html>" @url=#<URI::HTTPS:0x36891f0 URL:chef.myhost.com/universe> @request=#<Faraday::RequestOptions timeout=30, open_timeout=30> @request_headers={"User-Agent"=>"Faraday v0.9.1"} @ssl=#<Faraday::SSLOptions (empty)> @response_headers={"server"=>"ngx_openresty/1.4.3.6", "date"=>"Sun, 08 Feb 2015 19:49:10 GMT", "content-type"=>"text/html; charset=utf-8", "transfer-encoding"=>"chunked", "connection"=>"close", "status"=>"302 Found", "strict-transport-security"=>"max-age=631138519", "x-frame-options"=>"DENY", "x-webkit-csp"=>"default-src 'self' chrome-extension:; connect-src 'self' chrome-extension:; font-src 'self' themes.googleusercontent.com chrome-extension:; frame-src 'none' chrome-extension:; img-src 'self' ssl.google-analytics.com chrome-extension: data:; media-src 'none' chrome-extension:; object-src 'none' chrome-extension:; script-src 'self' ssl.google-analytics.com 'unsafe-inline' chrome-extension:; style-src 'self' 'unsafe-inline' fonts.googleapis.com chrome-extension:; script-nonce REDACTED;", "x-xss-protection"=>"1", "location"=>"chef.myhost.com:443/signup", "x-ua-compatible"=>"IE=Edge,chrome=1", "cache-control"=>"no-cache", "set-cookie"=>"chef-manage=REDACTED; path=/; secure; HttpOnly", "x-request-id"=>"REDACTED", "x-runtime"=>"0.034395"} @status=302>>
Unable to satisfy constraints on package source_deploy, which does not exist, due to solution constraint (app_role = 0.9.1). Solution constraints that may result in a constraint on source_deploy: [(app_role = 0.9.1) -> (source_deploy >= 0.0.0)]
Missing artifacts: source_deploy
Demand that cannot be met: (app_role = 0.9.1)
Unable to find a solution for demands: app_role (0.9.1)
因此,它尝试访问https://chef.myhost.com/universe,但它被跳转到 /signup 页面,因为这是 Chef Manage,而不是 Chef Server API...但我不知道默认情况下 API 可以从哪里访问,如果有的话。在过去的一个小时里,我阅读了各种文档,但一无所获...
答案1
事实证明,source
a 中的Berksfile
实际上是 a 的 URLBerkshelf API 服务器,不是AChef 服务器 API。
在完成gem install berkshelf-api
并配置config.json
以使用我的 Chef Server 作为端点之后,我能够运行,然后使用我的 Chef Server 上的端口 26200 作为中berks-api
的目标。source
Berksfile
从这里开始,berks install
两者berks upload
都有效。
答案2
我刚刚遇到了和你一样的问题。自从在环境重滚中更新到较新版本的 Chef Server 和 Chef DK 后,我开始使用 berkshelf 进行依赖项管理。
我的元数据.rb就叫它食谱吧第二本地食谱引用第一本地食谱像这样:
depends 'first_local_cookbook'
然后当我跑步时:
berks install
在第二本地食谱确定食谱依赖关系,命令将以与您相同的方式失败:
Fetching cookbook index from https://supermarket.chef.io...
Unable to satisfy constraints on package first_local_cookbook, which does not exist, due to solution constraint (second_local_cookbook = 0.1.0).
Solution constraints that may result in a constraint on first_local_cookbook: [(second_local_cookbook = 0.1.0) -> (first_local_cookbook >= 0.0.0)]
Missing artifacts: first_local_cookbook
我没有尝试您的解决方案,因为我希望有一个简单的答案来引用本地私人食谱,而无需安装新的服务器 API。我在 berkshelf 的 GitHub 上找到了这个已关闭的问题 (https://github.com/berkshelf/berkshelf/issues/892)。要从另一本食谱中引用本地食谱,您只需引用第一本地食谱在里面伯克斯菲尔的第二本地食谱之前元数据像这样的区域:
source 'https://api.berkshelf.com'
cookbook 'first_local_cookbook', path: '../first_local_cookbook'
metadata
然后运行 berks install 就会成功:
berks install
Resolving cookbook dependencies...
Fetching 'first_local_cookbook' from source at ../first_local_cookbook
Fetching 'second_local_cookbook' from source at .
...
然后我可以成功运行 berks 上传:
berks upload second_local_cookbook --no-freeze
Uploaded second_local_cookbook (0.1.0) to: 'https://chefserver:443/organizations/organization'