如何配置 berks API 服务器?

How do I configure a berks API server?

我想在我的基础架构中实施 Berks API,包括 Jenkins、Git 服务器和 Chef 12 Enterprise 服务器。按照 Berkshelf 的方式,每本食谱都在 Git 服务器中它自己的存储库中。基本上,我只希望我的顶级 Berksfile 仅包含角色说明书,然后 "let" Berkshelf 从我的 Git 服务器中提取传递依赖项。

我已经阅读了服务器安装的 Berks API README,但是 "where" 我需要安装说明书吗?我是否将它安装在我的 Git 服务器上?我已经阅读了 Berks API 厨师服务器已准备就绪,但我不会从那里拿出我的食谱,我 "uploading" 他们在那里。

请解惑。

更新 2

我能够通过将我的 Berksfile 中的源行从 https 更改为 http 来修复我的 SSL 错误,即

source "http://myserver.domain.com:26200"

更新

我已经通过 ~/.berkshelf/api-server/config.json

中的以下 config.json 文件配置了我的 berks-api 服务器端点
{
  "endpoints": [
    {
      "type": "chef_server",
       "options": {
       "url": "https://myserver.domain.com/organizations/berks-api",
       "client_name": "jenkins",
       "client_key": "/etc/berkshelf/api-server/jenkins.pem",
       "ssl_verify" : false
      }
    }
  ]
}

然后我 运行 berks-api,并在我的终端上看到前几行,所以我知道它是 运行ning

[2015-04-14T18:49:12.737950 #10033] INFO -- : Cache manager starting...
I, [2015-04-14T18:49:12.738207 #10033] INFO -- : Loading save from /root/.berkshelf/api-server/cerch
W, [2015-04-14T18:49:12.739368 #10033] WARN -- : Endpoints in config have changed - invalidating cache
I, [2015-04-14T18:49:12.739465 #10033] INFO -- : Cache contains 0 items
I, [2015-04-14T18:49:12.740341 #10033] INFO -- : Cache Builder starting...
I, [2015-04-14T18:49:12.846975 #10033] INFO -- : REST Gateway listening on 0.0.0.0:26200
I, [2015-04-14T18:49:12.887143 #10033] INFO -- : Processing chef_server: https://myserver.domain.com/organizations/berks-api
I, [2015-04-14T18:49:12.963418 #10033] INFO -- : Found 25 cookbooks from chef_server: https://myserver.domain.com/organizations/berks-api
I, [2015-04-14T18:49:12.964527 #10033] INFO -- : Processing metadata for 25 cookbooks with 0 remaining on chef_server: https://myserver.domain.com/organizations/berks-api

我的一本食谱中的 Berksfile 中有这一行

source "https://myserver.domain.com:26200"

但是,当我在我的一个 Chef 工作站上安装 berks 时,我得到

Fetching cookbook index from https://myserver.domain.com:26200...
/opt/chef/embedded/lib/ruby/2.1.0/net/http.rb:920:in `connect': SSL_connect SYSCALL returned=5 errno=0 state=SSLv2/v3 read server hello A (Faraday::SSLError)
from /opt/chef/embedded/lib/ruby/2.1.0/net/http.rb:920:in `block in connect'
from /opt/chef/embedded/lib/ruby/2.1.0/timeout.rb:91:in `block in timeout'
from /opt/chef/embedded/lib/ruby/2.1.0/timeout.rb:101:in `call'
from /opt/chef/embedded/lib/ruby/2.1.0/timeout.rb:101:in `timeout'
from /opt/chef/embedded/lib/ruby/2.1.0/net/http.rb:920:in `connect'
from /opt/chef/embedded/lib/ruby/2.1.0/net/http.rb:863:in `do_start'
from /opt/chef/embedded/lib/ruby/2.1.0/net/http.rb:852:in `start'
from /opt/chef/embedded/lib/ruby/2.1.0/net/http.rb:1369:in `request'
from /opt/chef/embedded/lib/ruby/2.1.0/net/http.rb:1128:in `get'
from /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/faraday-0.9.1/lib/faraday/adapter/net_http.rb:80:in `perform_request'
from /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/faraday-0.9.1/lib/faraday/adapter/net_http.rb:40:in `block in call'
from /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/faraday-0.9.1/lib/faraday/adapter/net_http.rb:87:in `with_net_http_connection'
from /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/faraday-0.9.1/lib/faraday/adapter/net_http.rb:32:in `call'
from /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/faraday-0.9.1/lib/faraday/request/retry.rb:110:in `call'
from /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/faraday-0.9.1/lib/faraday/response.rb:8:in `call'
from /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/faraday-0.9.1/lib/faraday/response.rb:8:in `call'
from /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/faraday-0.9.1/lib/faraday/rack_builder.rb:139:in `build_response'
from /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/faraday-0.9.1/lib/faraday/connection.rb:377:in `run_request'
from /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/faraday-0.9.1/lib/faraday/connection.rb:140:in `get'
from /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/berkshelf-api-client-1.2.1/lib/berkshelf/api_client/connection.rb:62:in `universe'
from /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/berkshelf-3.2.3/lib/berkshelf/source.rb:22:in `build_universe'
from /opt/chef/embedded/lib/ruby/gems/2.1.0/gems/berkshelf-3.2.3/lib/berkshelf/installer.rb:21:in `block (2 levels) in build_universe'

我建议调查 pipeline cookbook。它展示了一个 Jenkins 解决方案,我认为它证明您不需要 Berkshelf API 服务器。

该说明书创建了一个非常标准的 Jenkins 作业,该作业使用 Berkshelf 下载说明书并上传您的角色、数据包和环境(来自您的 chef repo)。烹饪书的巧妙之处在于,它还会在 GIT 和 运行 有用的工具(例如食品评论家和测试厨房)中自动为您的食谱生成特殊的烹饪书作业。

希望对你有用。

更新

Berkshelf API 是一个索引器。如果您决定使用它,那么您需要设置一个额外的 Chef server/organisation 来保存食谱并在 Berkshelf API 配置中进行配置。然后,您的 Jenkins 构建服务器会将说明书更改加载到此 Chef 服务器中,因此它就像您的 "released" 说明书的二进制存储库。

Berkshelf 客户端能够从 API 服务器检索每本食谱的位置,但仍负责实际下载。对我来说,这是 "gotcha"。我的食谱加载过程的含义是我需要两个配置文件:

berks install -c ~/.berkshelf/config-cookbooks.json
berks upload 

默认的 berkshelf 配置文件指向我的目标厨师服务器,但我需要第二个配置文件,其中包含存放我的食谱的厨师服务器的凭据。

更复杂的设置(可能会避免上述凭据问题)是将 Chef 服务器替换为 Chef 超市的本地实例。

https://github.com/opscode-cookbooks/supermarket

总之,我认为这不是您真正想要的。它类似于我个人使用的工作流程,但大多数人会认为它太复杂了。