厨师图书馆或定义?

时间:2014-02-12 10:51:21

标签: ruby chef

作为Chef的新手,我需要从现有的食谱中创建库或定义。

配方使用bash资源,ruby块资源(通知延迟时间的另一个ruby块资源),再次通知ruby块的模板资源等。

最好的方法是什么?图书馆或定义?

我已经读过,如果我使用定义,我将无法在定义中通知资源,这是否意味着我可以在不同的定义文件中通知资源?

我还读到,在图书馆中你无法直接使用这些资源。如果是这样,我如何在库中使用资源?

2 个答案:

答案 0 :(得分:70)

所以,这是“主要基于意见”,但无论如何我都会回答。这里有4种不同的选择:

  1. 定义
  2. LWRP
  3. HWRP
  4. “库”
  5. 定义只是包含一些参数化的一个或多个资源的包装器。但是,定义已添加到资源集合中。这意味着您无法“通知”或触发定义上的事件。它们仅用于包装和命名配方中的一系列可重复步骤。

    LWRP(轻量级资源和提供程序)是特定于Chef的DSL,它实际上在运行时编译为HWRP(重量级资源和提供程序)。 LWRP和HWRP都是Chef extensions 。除了包装一系列可重复的任务外,* WRP还将在Chef中创建一个顶级资源(如templatepackage),这些资源可用于您的食谱和其他食谱的配方。 / p>

    和LWRP和HWRP之间的区别实际上是Ruby。 HWRP使用完整的Ruby类。如果您不是Ruby开发人员,他们可能会有点吓人。尽管如此,在写作和LWRP之前,你应该试一试。 LWRP使用特定于Chef的DSL来创建资源。在一天结束时,他们编译为(大致)与重量级对应物相同的代码。我会在最后链接一些参考文献。您可以在任一实现中访问Chef资源,也可以访问run_context。

    最后,“图书馆”(注意引号)经常被误解和滥用。它们是Ruby代码,被评估为Ruby,因此它们几乎可以做任何事情。 HWRP实际上是库的一种形式。有时人们使用图书馆作为“帮助者”。他们将使用诸如best_ip_foraggregate_some_data之类的方法创建一个辅助模块,然后将这些库“混合”(Rubyism)到他们的食谱或资源中来干涸。其他时候,库可以用来“破解”厨师本身。 partial-search食谱就是一个很好的例子。 Facebook talked about how they limited the number of attributes sent back to the server去年在ChefConf也是如此。图书馆确实是一个未定义的领域,因为它们是王国的关键。

    所以,虽然我实际上没有回答你的问题(因为它是基于意见的),但我希望我已经向你提供了关于前进的最佳方向的足够信息。请记住,每个基础设施都是特殊的雪花,并且没有正确的答案;只有最佳答案。我建议与您的团队分享这些信息,并权衡每种方法的优缺点。您还可以尝试使用Chef邮件列表,人们会在其上给您很多意见。

    资源:

答案 1 :(得分:2)

现代厨师的术语将“ LWRP”重命名为“自定义资源”,并且作为“ LWRP”的“ P”的“提供者”已经渗入后台,并且用户现在只需执行操作即可(action_class是访问旧provider类的方法。

定义仍然存在,不鼓励使用,并且仍然存在无法修复的已知错误。没有理由使用它们。

自定义资源是每个人都应该使用的资源。更多的人应该将配方代码移到自定义资源中以实现可重用性。基本步骤很简单:

  1. 将代码移到资源文件中
  2. 用动作包装代码
  3. 为资源名称添加provides
  4. 将配方中的include_recipe调用更改为对自定义资源的调用。

这是简单情况下所需要的。完成此操作后,现在可以通过添加属性来扩展资源,或者可以将现有的节点属性转换为属性(可以将节点属性从配方模式下推回到对资源的​​调用中)。

对于Chef-15 / 16上的现代资源,请考虑将unified_mode true设置为从自定义资源中删除编译/收敛阶段,并简化对该资源的编写。

有关将简单配方转换为自定义资源的示例,请参见this answer