Chef 食谱交付 - Chef 服务器与 artifactory + berkshelf

chef cookbook delivery - chef server vs. artifactory + berkshelf

我的公司一直在对 Chef 进行大量投资。我们已经建立了一个受人尊敬的食谱库来自动化我们的基础设施。我们故意忽略了 Chef Server 和菜谱共享问题,因为我们希望首先在我们的菜谱中获得一些临界质量,以推动我们如何解决这个问题。现在我们在那里,我们正在探索各种选择。我们已经对 Artifactory 进行了大量投资,我们很高兴地使用它来存储来自 CI 系统的几乎所有内容,跨越 Windows/.NET 和 Java 使用 nuget、ivy , maven, npm 和 bower 存储库在 Artifactory 中。我一直在阅读关于这个主题的 SO:

Managing custom cookbooks in a chef repo

What do Berkshelf-api and Chef Supermarket do differently than traditional artifact repositories?

当我们在 Artfiactory 中已经有了一个通用工件服务器时,我很难将 Chef Server 看作一个食谱库的意义所在。最适合我们当前环境的模型是从我们的 Jenkins 工作中将食谱发布到 Artifactory,并根据需要使用 Berkshelf 从那里拉下来。根据我的阅读,Berkshelf 似乎能够与作为来源的 Artifactory 对话,但我还没有找到有关如何做到这一点的详细信息。到目前为止,我们遇到的每个包管理器都有一些方法可以将其指向 Artifactory,所以我假设这是可行的。

任何人都可以分享任何关于如何最好地解决这个问题的指导吗?谁能提供任何详细信息,说明 berkshelf 是否可以愉快地做到这一点?

如今使用 Chef 的大多数人直接从他们的源代码存储库进行部署。由于您已经在使用 Artifactory,因此您了解在某个时间点明确记录发布的重要性。发布工件存储库在构建软件和将其部署到目标系统之间创建了一个健康的划分。

使用 Chef 服务器的专用实例(存储已发布的食谱版本)只是一种选择。这种方法恰好与 Berkself-api 相得益彰,并允许您继续使用 Berkshelf 作为将食谱上传到目标 Chef 服务器的工具。

没有什么能阻止您使用 artifactory。您需要创建一个包含您的食谱及其所有依赖项的存档,berkshelf "package" 可以做到这一点。

berks package mycookbooks.tar.gz
mvn deploy:deploy-file \
    -Durl=$REPO_URL \
    -DrepositoryId=$REPO_ID \
    -DgroupId=org.myorg \
    -DartifactId=mycookbooks \
    -Dversion=1.2.3  \
    -Dpackaging=tar.gz \
    -Dfile=mycookbooks.tar.gz

tarball 可以用作您当前的 chef-solo 进程的一部分,或者可以选择用于填充目标 chef 服务器:

curl https://myrepo/org/myorg/1.2.3/mycookbooks-1.2.3.tar.gz
tar zxvf mycookbooks-1.2.3.tar.gz
knife cookbooks upload --all --environment my-prod-env

"environment" 选项将在 chef environment 上设置说明书版本限制,如果您想确定在 运行 时应用了哪些版本,这很有用。