【问题标题】:Chef Supermarket cookbooks with no metadata.rb file没有 metadata.rb 文件的 Chef Supermarket 食谱
【发布时间】:2017-10-25 04:03:40
【问题描述】:

从 Chef's Supermarket 安装/下载食谱时,一些食谱确实包含 metadata.json 文件,但不包含 metadata.rb 文件。

如果没有 metadata.rb 文件,用户将无法将食谱上传到厨师服务器。我的问题有两个:

  1. 如果下载/安装的说明书不包含,有没有办法为项目生成正确的 metadata.rb 文件?
  2. 在没有 metadata.rb 的情况下是否有办法将菜谱上传到厨师服务器?

这是在我的工作站上运行的 ChefDK 版本:

  1. Chef 开发工具包版本:1.3.43
  2. 主厨客户端版本:12.19.36
  3. 交付版本:master (dd319aa632c2f550c92a2172b9d1226478fea997)
  4. berks 版本:5.6.4
  5. 厨房版本:1.16.0

这是我用来从超市获取食谱的命令和食谱:

  1. 刀菜谱网站下载jenkins
  2. 刀菜谱网站安装 jenkins

网址:https://supermarket.chef.io/cookbooks/jenkins#readme

感谢您的帮助。我在 Chef 的文档中找不到太多关于使用不包含 metadata.rb 文件的食谱的文档。根据我的阅读,每本食谱都应该在每个食谱目录中都有一个 metadata.rb 文件。

【问题讨论】:

    标签: chef-infra metadata devops cookbook


    【解决方案1】:

    好的,所以这需要一些历史课来解释。在早期,每个人都通过使用 Web 表单并上传 tarball 手动将食谱上传到 Supermarket(当时是社区站点)。这很糟糕,所以我们添加了一个 API 和一个 CLI 命令knife cookbook site share。该命令的工作原理与knife cookbook upload 基本相似,因为它是为“chef-repo”monorepo 风格设计的,其中所有食谱都位于一个名为“cookbooks/”的文件夹中。随着 Berkshelf 越来越受欢迎,越来越多的人开始将每本食谱放在自己的仓库中,并单独使用它们。这使得使用knife cookbook site share 更难使用,因此编写了一个新工具:stove。 Stove 试图纠正knife cookbook site share 中的一系列问题,其中一个是动态元数据的持续问题。一些花哨的食谱使用 thor-scmversion 之类的工具来管理食谱元数据,这意味着 metadata.rb 有一行看起来基本上像version IO.read('VERSION')。还有其他示例,但简短的版本是,如果 metadata.rb 包含动态代码,您不希望在发布后重新运行该动态内容,因为它可能无法在您的计算机上运行(例如,如果它使用某些文件或仅存在于食谱作者机器上的工具)。当时,强制 Chef 世界中的所有内容不运行 metadata.rb 的唯一方法是不将其包含在上传中,而仅包含已编译的 metadata.json。

    所以我们到了。 knife cookbook site share 通常只上传.rb 而不是.json,而stove 则相反。我们现在已经修复了整个生态系统的问题,以知道如果 metadata.rb 和 metadata.json 都存在,则更喜欢 JSON。计划是修复所有上传者都上传这两个文件,但现在我们还停留在不同之处。

    也就是说,您实际上不需要 metadata.rb,您可以仅使用 JSON 上传到 Chef 服务器,Berkshelf 和策略系统都会为您自动执行此操作。

    【讨论】:

    • 很棒的信息!根据您的评论:“也就是说,您实际上不需要 metadata.rb 任何东西,您可以仅使用 JSON 上传到 Chef 服务器,Berkshelf 和策略系统都会为您自动执行此操作。”我曾尝试使用 Berkshelf,但是当我尝试在食谱目录中初始化 berkshelf 时,它不起作用,因为不存在 metadata.rb。手动创建 Berksfile 而不是初始化 Berkshelf 是解决此问题的正确方法吗?
    • 您实际上不会直接接触食谱,如果您刚刚开始使用社区食谱,您可能会使用source 'https://supermarket.chef.io/' \n cookbook 'whatever'berks install && berks upload 制作顶级 Berksfile 以获取 @987654333 @来自超市并将其上传到您的厨师服务器。随着您对 Chef 越来越熟悉,这可以通过将依赖项添加到您的应用程序或包装器说明书来处理,然后 berks 会自动加入。
    【解决方案2】:
    1. 所有食谱必须有一个metadata.rbthey're easy enough to create。但是,based on this bug report; metadata.json 也应该可以工作。另外,正如您在looking at the chef source 看到的那样;两者都应该工作。
    2. 不;这是因为该文件将包含名称、版本和依赖项等信息。它是必需的,可以是 .json.rb

    当您遇到没有metadata.jsonmetadata.rb 的食谱时,您可以选择:

    • 向维护者报告它缺少一个关键组件;并希望他们修复它。
    • 自己添加metadata.rb
    • 查找具有类似功能的说明书。

    您是否在尝试上传此食谱时遇到错误?它应该可以工作。

    【讨论】:

    • 我的流程如下: 1. 在cookbooks目录下运行命令:'knife cookbook site download jenkins'。 2.手动解压包jenkins-5.0.1.tar.gz 3.在cookbooks目录下运行命令:'knife cookbook upload jenkins'。这次没有返回关于缺少的 metadata.rb 文件的错误(尽管它不存在),但是返回了以下错误:错误:Cookbook jenkins 依赖于当前不存在的菜谱服务器。错误:缺少的食谱是:...
    • 很遗憾,由于 ::historical jazzhands:: 原因,这不正确。
    猜你喜欢
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 2015-09-17
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多