Chef Cookbook Delivery - Chef server vs. artifactory + berkshelf

Posted

技术标签:

【中文标题】Chef Cookbook Delivery - Chef server vs. artifactory + berkshelf【英文标题】:chef cookbook delivery - chef server vs. artifactory + berkshelf 【发布时间】:2015-06-24 13:28:21 【问题描述】:

我的公司一直在对 Chef 进行大量投资。我们已经建立了一个受人尊敬的食谱库来自动化我们的基础设施。我们故意忽略了 Chef Server 和食谱共享的问题,因为我们希望首先在我们的食谱中获得一些临界质量,以推动我们如何解决这个问题。现在我们在那里,我们正在探索选择。我们已经对 Artifactory 进行了大量投资,我们很高兴使用 Artifactory 中的 nuget、ivy、maven、npm 和 bower 存储库来存储我们跨 Windows/.NET 和 Java 的 CI 系统产生的几乎所有内容。我一直在阅读关于这个主题的 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_solo 切换到 chef-server 的做事方式吗? 不确定您所说的“chef_solo 到 chef-server 的做事方式”到底是什么意思。我们一直专注于创建食谱并使用 chef-client+localmode/chef-solo 运行它们。我们将它们放在 svn/git 中,然后在我们想要的机器上拉取并运行它们。我们对扔厨师服务器犹豫不决,因为不清楚它实际上对我们有什么作用。只有当我们 90% 的技术工件都驻留在 Artifactory 中时,我们才会建立一个厨师服务器来充当食谱的仓库,这将是很奇怪的。使用 Chef Server 在我们的节点上运行说明书对我们来说没有多大价值 我的主要问题是berkshelf被指向神器 嗯,相当广泛,但要回答 Berkshelf 源:它们是 berkshelf API 服务器(包括在超市中,计划包括在 chef-server 12 中)、路径和 git/github 源。它是开源的,如果您需要特定的人工插件,您可以编写自己的插件。如果您不需要跨节点搜索来定义某些节点中的对等/条目,则可以避免使用厨师服务器。 【参考方案1】:

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

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

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

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

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

【讨论】:

我喜欢这种方法的声音...感谢您的详细回复 @kellyb - 想知道您是否无法解决这个问题以及如何解决? @Scooby 去年我学到了很多。我来自应用程序开发方面,厨师服务器的概念对我来说非常奇怪,因为我主要将其视为食谱存储库。实际上,它还有更多功能 - 例如存储管理下的库存节点、驱动食谱在这些节点上运行的属性,并让您了解这些节点的状态。如果 Chef Server 能够从 AF 或 Nexus 中提取食谱焦油,这对我来说会更有意义,但我已经结束了。我的建议是从您的 CI 管道中为 Chef Server 提供数据并继续使用它 值得注意的是,JFrog 在 v5 中为 Aritfactory 添加了 Chef Supermarket 支持(显然其他人也有与我类似的愿景)。我们找到了一个非常巧妙的解决方案,使用 Policyfiles、Artifactory 作为超市,以及 Chef 服务器作为这些策略的部署目标。

以上是关于Chef Cookbook Delivery - Chef server vs. artifactory + berkshelf的主要内容,如果未能解决你的问题,请参考以下文章

使用 AWS Cookbook InvalidInstanceIDNotFound 的 Chef EC2 EBS 卷

Cookbook 的深度依赖需要一个不可用的 Ruby 版本。如何通过 Chef for Amazon Linux 规避?

无法在 metadata.rb chef 中添加食谱依赖项

如何捕获Chef异常

在 Chef 食谱中使用变量

Chef/OpsWorks:实例在新发布的 Windows 食谱版本上失败