Artifactory 托管 Chef Supermarket + Chef Server 集成

Artifactory hosted Chef Supermarket + Chef Server integration

我已经设置了一个 Artifactory 实例并在其上设置了一个远程 Chef Supermarket,它从另一个 Artifactory 上的本地存储库进行复制。我对现有的管道感到满意,因为这意味着通过 push/pull 复制将工件自动交付给客户。

在客户端,我们还有一个 Chef 服务器,旨在通过 运行 根据其 roles/environment 设置在各种服务器上配置说明书来协调部署。

ORG:  Artifactory (Local Chef Repo)
-----------------------------------
           |
         <web>
           |
-----------------------------------
CUST: Artifactory (Remote Chef Repo) 
      Chef Server

我创建了一个空目录。chef/knife.rb,获得了厨师服务器之间的信任并配置了我的超市。

knife[:supermarket_site] = 'http://<user>:<api_key>@customer-artifactory:8081/artifactory/api/chef/org-chef'

当我 运行 knife supermarket list 时,我从人工制品中托管的 Chef Supermarket 获得了所有食谱的列表。但是,我面临的问题是,当我将 Chef Server 加入其中时,它无法解析食谱。

user@workstation:~/chef-ops$ knife ssh 'name:vm01' sudo chef-client -x <user> -P <password>
vm01 knife sudo password:
vm01
vm01 Starting Chef Infra Client, version 15.3.14
vm01 resolving cookbooks for run list: ["repository"]
vm01
vm01 ================================================================================
vm01 Error Resolving Cookbooks for Run List:
vm01 ================================================================================
vm01
vm01 Missing Cookbooks:
vm01 ------------------
vm01 The following cookbooks are required by the client but don't exist on the server:
vm01 * repository
vm01
vm01
vm01 Expanded Run List:
vm01 ------------------
vm01 * repository
vm01
vm01 System Info:
vm01 ------------
vm01 chef_version=15.3.14
vm01 platform=ubuntu
vm01 platform_version=18.04
vm01 ruby=ruby 2.6.4p104 (2019-08-28 revision 67798) [x86_64-linux]
vm01 program_name=/usr/bin/chef-client
vm01 executable=/opt/chef/bin/chef-client
vm01
vm01
vm01 Running handlers:
vm01 [2019-10-11T10:28:05+00:00] ERROR: Running exception handlers
vm01 Running handlers complete
vm01 [2019-10-11T10:28:05+00:00] ERROR: Exception handlers complete
vm01 Chef Infra Client failed. 0 resources updated in 04 seconds
vm01 [2019-10-11T10:28:05+00:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
vm01 [2019-10-11T10:28:05+00:00] FATAL: Please provide the contents of the stacktrace.out file if you file a bug report
vm01 [2019-10-11T10:28:05+00:00] FATAL: Net::HTTPServerException: 412 "Precondition Failed"

我意识到这可能是因为 knife.rb 中的设置未传播到 Chef Server,因此我需要配置 Chef Server 以查看 Artifactory。

我查看了以下有关使用私人 Chef Supermarkets 的文档,但它们似乎不适合我的用例。

查看了这些各种资源(以及更多)后,我不确定是否可以设置 Artifactory 和 Chef Server 来实现自动食谱解析。似乎没有关于此的任何文档。例如,Chef Server 回调 URL 在 Artifactory 下是什么?

  oc_id['applications'] = {
    'supermarket' => {
       'redirect_uri' => 'http://customer-artifactory:8081/artifactory/api/oauth2/???'
     }
  }

我是否认为 Chef Server 无法直接从 Artifactory 解析食谱,我们需要创建某种管道来将 Chef Server 与 Artifactory chef 存储库同步?

我能看到的唯一选择是创建一个定期执行 knife supermarket list 的过程,然后遍历结果,从 Artifactory Supermarket 下载它们,然后通过 shell 定期执行脚本 (cron job/jenkins)。我认为 Chef Server 最好从超市临时请求食谱,因为它只会在任何给定时刻请求它需要的东西。

我是否认为这感觉像是 Artifactory/Chef 服务器 could/should 为我做的事情?

AFAIK:Chef Supermarket 和 Chef Infra Server(Bookshelf)未连接,因此没有自动食谱解析。您需要一个将食谱从 supermarket/Artifactory 上传到 Chef 服务器的过程,或者使用策略文件 https://docs.chef.io/policyfile.html 方法。

让我试着澄清一下:

  • chef supermarket 是一个食谱存储库,其中托管开源食谱。不过,你可以运行私人超市存放你的私人食谱
  • cookbook 的 metadata.rb 定义了 cookbook 依赖项,使用 depends instruction
  • 您可以使用 berkshelf 来管理食谱依赖项
  • chef 服务器还充当其客户端(节点)的食谱存储库,这意味着节点只能从该节点所属的厨师服务器中提取食谱(see client.rb

因为您正在使用

在实践中,您将:

  1. 使用 berkshelf 管理来自 artifactory 和 supermarket(私人或 public)的 cookbook 依赖项
  2. 使用berkshelf vendor(复制并下载)所有食谱依赖项(包括您自己的食谱)
  3. 使用 knife or berkshelf 上传出售的食谱