厨师库或定义?

Posted

技术标签:

【中文标题】厨师库或定义?【英文标题】:Chef libraries or definitions? 【发布时间】:2014-03-10 15:37:05 【问题描述】:

对于 Chef 来说相对较新,我需要根据现有食谱创建库或定义。

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

最好的方法是什么?库还是定义?

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

我还读到,在库中您不能直接使用资源。如果这是真的,我该如何使用我图书馆中的资源?

【问题讨论】:

创建 LWRP。 docs.opscode.com/chef/lwrps_custom.html 看起来从 12.5 开始不推荐使用定义。此页面上有一个大警告框-> docs.chef.io/definitions.html 【参考方案1】:

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

    定义 LWRP HWRP “库”

定义只是一个或多个资源的包装器,带有一些参数化。但是,定义不会添加到资源集合中。这意味着您不能“通知”或触发定义上的事件。它们仅用于包装和命名配方中的一系列可重复步骤。

LWRP(轻量级资源和提供者)是 Chef 特定的 DSL,它在运行时实际编译成 HWRP(重量级资源和提供者)。 LWRP 和 HWRP 都是 Chef 扩展。除了包装一系列可重复的任务之外,*WRP 还将在 Chef 中创建一个***资源(如 templatepackage),该资源也可用于您的食谱和其他食谱的食谱。

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

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

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

资源:

LWRPs HWRPs Libraries

【讨论】:

+1 很好的描述。这些概念对于新厨师用户来说非常混乱。 嗨,Seth,这解释了很多。我想知道为什么厨师文档没有这样彻底。作为厨师和红宝石的新手,我发现 LWRP 很难理解。如果我有 15 名声望,我会投票支持你的答案。非常感谢。【参考方案2】:

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

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

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

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

这就是简单案例所需要的全部内容。完成后,现在可以通过添加属性来扩展资源,或者可以将现有节点属性转换为属性(可以将节点属性推回到配方模式中对资源的调用中)。

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

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

【讨论】:

以上是关于厨师库或定义?的主要内容,如果未能解决你的问题,请参考以下文章

markdown 将自定义厨师食谱从V4迁移到V5

Opsworks 自定义厨师食谱上的 Codeigniter ci_sessions

Xamarin iOS Binding 项目似乎不包含库或接口定义

自定义 .Net 库或现有库来处理序列格式?

Laravel 引入自定义类库或第三方类库

OpsWorks - 自定义食谱中包含的内容