厨师库或定义?
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 中创建一个***资源(如 template
或 package
),该资源也可用于您的食谱和其他食谱的食谱。
LWRP 和 HWRP 之间的区别实际上是 Ruby。 HWRP 使用成熟的 Ruby 类。如果您不是 Ruby 开发人员,他们可能会有点吓人。尽管如此,您应该在编写和 LWRP 之前尝试一下。 LWRP 使用 Chef 特定的 DSL 来创建资源。归根结底,它们编译为(大致)与重量级对应物相同的代码。我会在最后链接一些参考资料。您可以访问任一实现中的 Chef 资源以及 run_context。
最后,“库”(注意引号)经常被误解和滥用。它们是 Ruby 代码,被评估为 Ruby,所以它们几乎可以做任何事情。 HWRP 实际上是一种库形式。有时人们将库用作“助手”。他们将使用best_ip_for
或aggregate_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
【讨论】:
以上是关于厨师库或定义?的主要内容,如果未能解决你的问题,请参考以下文章
Opsworks 自定义厨师食谱上的 Codeigniter ci_sessions