如何继承和覆盖Chef Cookbook的某些部分

55次阅读
没有评论

问题描述

在Chef超市中有3200多个Cookbook可用,通常已经有一个涵盖我需要解决的需求的Cookbook。然而,几乎每次都需要对现有Cookbook中的模板、变量或资源进行一些更改。那么,如何在不分叉其代码的情况下,覆盖和/或改进现有的Cookbook呢?并且保留将来获取版本更新的能力。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1:使用包装(Wrapper)和扩展(Extend)的模式

在使用Chef Cookbook时,一种常见的模式是“包装和扩展”。总体思路是创建一个依赖于社区Cookbook的Cookbook,通常命名为mycompany_originalthing,然后在其中创建配方(recipes)来调用include_recipe 'originalthing::whatever',但在其中添加更多的内容,或者使用edit_resource等方法来更改资源。尽量避免使用edit_resource,因为它会导致脆弱的代码,但在需要时可以使用。你还可以使用包装Cookbook来设置属性、子类化或包装自定义资源等。
对于需要在社区Cookbook中调整模板的特定情况,操作如下:

include_recipe 'original::whatever'
edit_resource!(:template, '/path/to/something') do
  source 'mytemplate.erb'
  cookbook 'mycompany_original'
end

关于edit_resource等方法的更多细节可以在此链接找到:https://coderanger.net/rewind/

方案2:根据Cookbook的结构进行扩展

如果Cookbook基于自定义资源而不是配方,情况会更加复杂,具体操作取决于你要扩展的Cookbook的编写方式。

常见问题及建议

  1. 关于”包装和扩展”模式:这是一个常用的模式,通常在调整社区Cookbook变得过于困难,或者更容易从头开始重新编写时,才会不再适用。
  2. 关于edit_resource:很棒!我之前甚至不知道他们已经将原来有问题的rewind功能改成了Chef的一部分。
  3. 关于链接中的用户名:非常抱歉,但您的用户名也包含在您提到的链接中……这让我想知道您是否与该链接有关。如果是这样,您是否熟悉与此相关的适当“披露”政策(也应包含在您的答案中)?
  4. 关于作者的身份:在Chef世界中,我的博客大致相当于官方文档。如果您想确认的话,可以查看我在Stack Overflow上的历史记录。
  5. 关于链接的情况:(在这种情况下,我没有链接到官方文档,因为它们在这个API的语法方面存在错误)
  6. 关于链接中的披露:您的链接是可以接受的(而且“我”实际上已经知道这一点),但我仍然认为您应该按照我之前的建议添加一些内容(例如,将“friends at”更改为“friends in my blog at”)。

如果你在扩展和优化现有Cookbook时遇到了困难,可以考虑上述方法来保持对版本更新的灵活性,并避免分叉代码的复杂性。根据情况选择合适的方法,以实现对Cookbook的定制和改进。

正文完