厨师包装食谱最佳实践

2023-11-21

在学习厨师的过程中,我看到了包装食谱的相互冲突的模式。例如。

一些食谱使用default.rb,而另一些则使用customize.rb进行覆盖。

attributes/default.rb

attributes/customize.rb 

哪个是最佳实践?

此外,一些包装食谱在recipes/default.rb 文件中具有如下参数:

normal['foo']['bar'] = 42

而其他人则有

default['foo']['bar'] = 42

还有一些有

node.set['foo']['bar'] = 42

此外,一些食谱使用符号和其他字符串

['foo']['bar']
[:foo][:bar]

我应该使用哪种风格?

Update

看起来厨师已经发布了官方风格指南,它至少解决了部分问题(例如符号与字符串)。https://docs.chef.io/ruby.html#


我还没有看到任何关于如何覆盖包装食谱中的属性的正式最佳实践,我认为必须选择一种风格,只要您的所有食谱在您的组织内保持一致,您就应该很好。以下是我个人的看法。


属性文件

我们最初遵循类似的分隔属性文件的风格attributes/customize.rb您描述的格式。但是,我们发现将所有属性保留在中要简单得多attributes/default.rb,特别是因为我们的属性代码少于 50 行。

覆盖优先级

我们总是使用最低属性优先级当覆盖我们的包装器说明书中的属性时。我们坚持default只要有可能,因为优先顺序决定了你的食谱default胜过包装好的食谱default.

属性访问方式

您看到的大多数食谱都使用字符串访问格式。

default['foo']['bar'] = 42

事实上有一个美食评论家规则特别不鼓励使用符号访问。 Foodcritic 还鼓励使用访问属性的一致风格。如果您正在决定一种样式,请记住社区几乎已经决定了字符串访问格式。

然而,还有另一种方法。 Chef 中的属性不是Hash,他们实际上是一个Mash. Mash恰好支持将属性作为方法访问,因此:

default.foo.bar = 42

我们更喜欢这种语法,因为它更紧凑。

不过,请务必小心,因为特贾伊·卡登指出, Chef 实现了这个method_missing,因此如果属性名称与当前(或将来)的属性名称相同,您可能会遇到问题node对象方法。我们用我们的组织名称作为所有食谱的序言,因此不太可能发生冲突,但是当我们覆盖社区食谱时,我们可能会遇到问题。值得庆幸的是,测试应该可以发现任何此类错误。

注意事项

重写包装器说明书中的属性不会以令人惊讶的方式工作,特别是在涉及字符串插值时。这在中得到了很好的解释这篇博文。主要要点是食谱是否将属性定义为:

default['version'] = '1.0'
default['url'] = "http://example.com/#{node['version']}.zip"

在你的包装食谱中你重写version:

default['version'] = '2.0'

The default['url']仍会决心http://example.com/1.0.zip, not http://example.com/2.0.zip正如你所期望的那样。发生这种情况是因为 url 属性被插值before你的覆盖发生了。这篇博文更深入地讨论并提供了一个潜在的解决方案。

Wrap Up

归根结底,Chef 中有多种做事的方法,而且社区仍在成熟。有一些关于编写可重复使用的食谱等的最佳实践,但这些实践仍在不断发展。

您能做的最好的事情就是尝试各种风格,找出最适合您和您的团队的风格。一旦你决定了一种风格,我建议整理一份风格指南(我用过这个 Angular 风格指南作为灵感)。您还可以通过以下方式强制执行您的风格指南定制美食评论家规则。我们通过这种方法取得了成功。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

厨师包装食谱最佳实践 的相关文章

  • 如何查看节点安装的软件包版本?

    我正在调整 Apache 食谱以与 2 4 Apache 一起使用 Opscode Cookbook 目前失败 因为它正在生成带有 LockFile 关键字的 conf 文件 该关键字被排除在 Apache 2 4 关键字列表之外 我想制定
  • 使用 Berkshelf 解决递归 git Cookbook 依赖关系

    TL 博士版本 Berkshelf 是否能够解决基于 Git 的说明书中的递归依赖关系 如果可以 如何解决 我尝试使用 Berkshelf 管理我的 Chef 食谱依赖项 这些食谱都存储在内部 Git 存储库中 依赖关系如下 env doc
  • 如何在厨师中运行具有依赖项的食谱?

    我已经配置了工作站这一步开始使用 操作系统 redhat 6 5 我已经启动了一个节点 我这样修改了一本食谱 myCookbook metadata rb name myCookbook maintainer YOUR COMPANY NA
  • 如何确定目录中的任何文件是否已更改

    Chef 有没有办法确定它是否更改了给定目录中的任何文件 如果conf d 目录中的任何设置被更新 我想重新启动服务器进程 我确信可以在每次厨师客户端运行时将 md5sum 列表写入文件 并将当前迭代与之前的迭代进行比较 但这是解决常见场景
  • 我应该使用 include_recipe 还是将配方添加到 run_list 中?

    试图找出大型项目的最佳方法 何时适合使用以下方法在菜谱中添加菜谱include recipe而不是将食谱添加到run list 有没有好的经验法则 在我看来 任何配方都应该能够在空机器上独立运行 因此 如果某个配方 A 依赖于在其之前运行的
  • 如何检查 Chef 的版本是否满足食谱中的宝石要求?

    Chef Version 包含 Chef gem 的版本号 我想检查它是否满足 gem 要求 gt 10 14在食谱里面 Use Gem Requirement and Gem Version Gem Requirement new gt
  • 如何找到 Chef 菜谱中可用的磁盘?

    当 Chef 配方正在执行时 我想确定是否有足够的可用磁盘空间来执行操作 如何最好地做到这一点 Ohai http docs opscode com ohai html每次运行时都会检测节点的某些属性 这些属性被捕获为自动属性 http d
  • 厨师服务器 WebUI 不工作

    我已经下载并安装了chef server core 12 xDPKG 封装已开启ubuntu 13 x chef server ctl reconfigure运行成功 但是当我尝试 URL 时http chef example com我收到
  • 仍然可以在节点 run_list 中指定确切的食谱版本吗?

    我的笔记中有这样的内容 run list recipe email protected cdn cgi l email protection 可以明确指定在节点 run list 中使用的说明书版本 但我无法让它工作 也找不到任何文档来说明
  • Chef 客户和验证者

    我试图理解 Chef 客户端和验证器的概念 以及它们与引导过程的关系 根据本文 http docs opscode com server manage clients html 厨师 客户将使用 etc chef validation pe
  • 如何使用 ChefSpec 测试我的 LWRP?

    我创建了自定义 LWRP 但是当我运行ChefSpec https github com sethvargo chefspec单元测试 它不知道我的 LWRP 操作 这是我的resource actions install uninstal
  • 在 Chef 中使用属性

    刚刚开始使用chef最近 我发现属性存储在一个名为的大型整体哈希中node可在您的食谱和模板中使用 似乎有多种定义属性的方法 直接在食谱本身中 在属性文件下 例如attributes default rb 在传递给的 JSON 对象中che
  • docker 中的 systemctl 错误“无法连接到总线:没有这样的文件或目录”

    我在用Ubuntu 16 04图像与docker在本地测试我的食谱 在做的同时kitchen converge 我收到以下错误 我想通了systemctl无法正常工作 有人可以帮我解决这个问题吗OR还有其他方法可以实现同样的目的吗 2017
  • 在vagrant box上创建虚拟主机

    我正在尝试设置一个基于 Chef 提供的 vagrant 的开发环境 我使用 Apache 使用 Chef 创建了一个环境 并且可以通过端口转发从我的主机访问 Web 服务器 我想让我的流浪盒包含多个虚拟主机 并且通过共享文件夹 我将定义不
  • gitlab-ctl 重新配置:无法确定节点名称

    我确实在 Ubuntu 16 04 4 LTS 上设置了一个新的 GitLab 实例 安装包进展顺利 GitLab 似乎已启动并运行 然后我开始配置实例并设置 SMTP etc gitlab gitlab rb 后来我跑了sudo gitl
  • 如何在 Chef LWRP 定义中实现动态属性默认值

    我希望能够用 3 个参数来定义一个轻量级资源 其中两个是基本 基本参数 第三个是这两个参数的组合 我还想提供自定义第三个参数的可能性 例如 如何修改以下代码以实现上述行为full name属性 资源定义 actions install at
  • 无法在 AWS Opsworks 上使用 Chef 12 找到 Chef 社区食谱

    问题 在 AWS OpsWorks 上运行自定义说明书时setup failed状态针对实例显示 并且故障日志中显示以下内容 2016 03 26T22 53 48 00 00 INFO Started chef zero at chefz
  • Chef 节点 - 检查菜谱是否会在其上运行,并查看内部角色

    我想知道特定的配方是否会在不同配方内部的节点上运行 我可以使用 node recipe recipe name 方法 但是我的一些食谱是由角色和食谱管理的 似乎没有查看角色运行列表 有没有一种简单的方法可以确定我的 recipie redi
  • 如何使用 Chef 在本地移动/复制文件

    我还没有遇到过可以在本地复制 移动文件的 Chef 资源 比如我要下载码头涨潮 http dist codehaus org jetty jetty hightide 7 4 5 jetty hightide 7 4 5 v20110725
  • Chef 服务器安装问题

    我一直在尝试使用本指南在我的 CentOS 6 5 机器上安装 Chef 服务器 chef server core 12 1 0 1 el6 x86 64 rpm http docs chef io server install serve

随机推荐

  • Python:如何修改/编辑打印到屏幕的字符串并将其读回?

    我想在 Windows 中将字符串打印到命令行 终端 然后编辑 更改该字符串并将其读回 有人知道该怎么做吗 谢谢 print Hell Hello lt Edit it on the screen s raw input print s H
  • 在IE11中,如何使用console.log?

    尝试使用console log 但总是打印undefined 尝试使用类似的解决方案Console log IE9 问题它也不起作用 In this IE11文档 有如下句子 Last but not least forget about
  • 比较数组是否相等,忽略元素的顺序

    我有一个包含 4 个数组列的表 结果如下 ids signed ids new ids new ids signed 1 2 3 2 1 3 4 5 6 6 5 4 无论如何都要比较ids and signed ids通过忽略元素的顺序 使
  • 重新附加实体图并检测集合更改

    我首先使用实体 框架代码 并通过 WCF REST HTTP 接口公开 Northwind 数据库 我没有公开 OrderDetails 表 订单项 因为创建订单然后通过另一个服务单独添加每个所需的 OrderDetail 是没有意义的 在
  • 在 Rails 中使用带有 has_many 的委托?

    我们有 2 个模型和一个连接模型 app models message rb Class Message lt ActiveRecord Base has many image messages has many images throug
  • 如何对实体的自定义属性进行建模?

    假设我们有一个应用程序应该能够存储所有类型的产品 每个产品至少有一个ID and a Name但所有其他属性都可以由用户自己定义 例如 他可以创建一个产品组Ipods其中将包含属性capacity and 一代 例如 他可以创建一个产品组T
  • strstr 的优化版本(搜索具有恒定长度)

    我的 C 程序有很多 strstr 函数调用 标准库 strstr 已经很快 但在我的例子中 搜索字符串的长度始终为 5 个字符 我用一个特殊版本替换了它以获得一些速度 int strstr5 const char cs const cha
  • C# - 让 Process.Start 等待进程启动

    在继续使用方法之前 我需要确保进程正在运行 声明是 Process Start popup exe 您可以执行 WAIT 命令或对此值设置延迟吗 你的意思是等到完成吗 然后使用Process WaitForExit var process
  • Linq 表达式中的条件运算符导致 NHibernate 异常

    我正在尝试在 ASP NET MVC 2 应用程序中实现搜索功能 我根据用户输入的条件创建一个表达式 public ViewResult FindCustomer string forename string familyname Date
  • 奇怪的for循环问题

    我不确定这是否是一个错误 所以我想也许你们可能想看一下 问题出在这段代码上 for i 0 1 05 do print i end 输出应该是 0 05 1 snip 95 1 相反 输出是 0 05 1 snip 95 while 循环也
  • Laravel 5.5 具有不同列名的单独表的唯一验证规则

    所以我有用户和公司 一名用户属于一家公司 我想验证用户注册 以便business name他们用来注册的字段在companies表 目标是不允许用户创建重复的公司 这是我的注册功能 public function register Requ
  • 更改活动输入选择器的背景颜色

    任何原因为什么当我运行这段代码时 input type submit active background color green 当我单击所需的按钮时 它只会闪烁绿色一瞬间 然后返回到原始颜色 怎样才能让它永远保持绿色呢 input typ
  • 非常量引用绑定到临时的 Visual Studio bug?

    我在编译一些可移植代码时遇到了这个问题gcc 基本上这个奇怪的代码在 Visual Studio 中编译 这真的让我大吃一惊 class Zebra int x Zebra goo Zebra z return z void foo Zeb
  • Min-width, max-width css 使用最小宽度

    好吧 所以我希望做的是创建一个 DIV 它将根据其中的内容自动调整大小 但它应该使用尽可能小的宽度 我不知道如何做到这一点 所以 如果我有一个包含 3 个字符的 DIV 标签 其宽度无疑低于 200px 那么我想要的就是 div 为 200
  • pthread_mutex_lock.c:62: __pthread_mutex_lock: 断言 `mutex->__data.__owner == 0' 失败

    我收到了那个错误 pthread mutex lock c 62 pthread mutex lock 断言 mutex gt data owner 0 失败 我找不到任何原因 但是我不确定以下代码 声明 std mutex lock st
  • 如何使用 jquery 隐藏父元素?

    假设以下 HTML li class fooli a class foo href anchor a li li class fooli a class foo href anchor a li 和以下 Javascript 使用 jque
  • ASP.NET 的 JSON 最大长度问题

    我正在创建一个 asp net 2 0 Web 服务 它提供 json 作为输出 并且有一个非常大的 无法分解的数据集 超出了最大长度限制 我在互联网上搜索过 net 3 5 4 上有解决方案 但 2 0 上没有 谁能告诉我如何增加 JSO
  • Android Gradle Jacoco:用于集成测试的离线工具

    我们正在构建一个 Android 应用程序 并使用 Appium 进行测试 现在我想看看我们的 Appium 测试的测试覆盖率 我认为这是可能的 因为Jacoco支持离线检测 http www eclemma org jacoco trun
  • 如何在 Visual Studio Code 中以 noprofile 启动 Powershell 脚本

    如何在 Visual Studio Code 中以 noprofile 启动 Powershell 脚本 我可以使用 noprofile with 命令运行 Powershell IsePowerShell Ise NoProfile 但是
  • 厨师包装食谱最佳实践

    在学习厨师的过程中 我看到了包装食谱的相互冲突的模式 例如 一些食谱使用default rb 而另一些则使用customize rb进行覆盖 attributes default rb attributes customize rb 哪个是