【问题标题】:How do I share code across Chef cookbooks in a chef-repo?如何在 Chef-repo 中的 Chef 食谱之间共享代码?
【发布时间】:2013-06-24 09:13:06
【问题描述】:

我想在厨师存储库中分享一些跨食谱的方法。我知道在食谱级别上,我可以将代码放入库目录中的模块中(请参阅related question)。我正在寻找的是类似的东西,但可以在我的 Chef 存储库中的所有食谱中找到。

我能想到几个解决方案:

  • 创建一个gem,将gem 安装为chef run 的一部分。这似乎有点矫枉过正。
  • 将文件放在某个文件夹中,然后将该文件夹添加到配方文件中的$LOAD_PATH。我有一种感觉不适用于实际部署,因为主厨服务器对存储库一无所知。
  • 将文件放在某个文件夹中,并将其符号链接到每个说明书的库目录中。

最后一个选项似乎是最可行的。有没有更好/更惯用的方式来做我想做的事?

【问题讨论】:

  • 当你说“方法”时,你指的是纯 Ruby 代码,还是使用 Chef 的 DSL 的代码可以放在食谱中?如果它是纯 Ruby,那么 gem 可能是最好的出路,除非你只有几行代码,否则我几乎不认为它是矫枉过正的。如果是 Chef 代码,请使用 LWRP 创建一个库说明书,并将其包含在您的顶级应用程序说明书中。第二种方法可能适用于纯 Ruby 库,但我还没有尝试确定。
  • 主要是纯Ruby代码。可能有十几种实用方法。我对 Chef 的依赖管理不是很熟悉,但我想知道它是否可以创建一个仅在其库文件夹中包含共享代码的食谱。
  • 我刚刚尝试过,但它似乎不起作用,至少不是马上。我仍然认为宝石路径可能是最好的。 :)
  • 另外,根据您的用例,您可以创建 LWRP 或定义作为方法的接口。这样,当您将此 lib 食谱作为另一个依赖项包含在内时,您将拥有可在食谱中使用的这些资源。

标签: ruby chef-infra


【解决方案1】:

您可以使用其他食谱中的库定义函数,但您必须在提供的食谱上告诉厨师您的食谱depends。

因此,例如,如果在食谱 A 中,您有一个提供某些功能 flibraries/default.rb,那么只要 B 的 metadata.rb 文件包含以下行,您就可以从食谱 B 中访问它:

depends "A"

有关更多详细信息,请参阅 metadatalibraries 上的 Chef 文档。

【讨论】:

  • 听起来很有希望!我明天试试看。
  • 没有放弃这个!只是还没来得及尝试。
  • 终于有机会实现了。效果很好!
  • 你能详细说明一下吗?我认为在配方中仍然需要一些软的 Chef::Resource.send(:include, xxx) 语句才能工作?
【解决方案2】:

有 3 个不同的选项允许以厨师资源 (1. LWRP、2. HWRP) 或方法 (3. "”)。我建议您首先考虑 LWRP。我发现this answer 很好地解释了上述技术之间的差异。

【讨论】:

    猜你喜欢
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多