【问题标题】:How to update cookbooks to the latest versions safely?如何安全地将食谱更新到最新版本?
【发布时间】:2017-06-16 13:04:09
【问题描述】:

我目前正在使用 Chef 通过 Chef supermarket Jenkins cookbook 部署 Jenkins 实例。我对 _master_war.rb 配方文件做了很多修改。

新版本的 Jenkins 食谱现已推出。我的问题是;如何在不覆盖/丢失我对当前版本的食谱所做的所有修改的情况下更新到最新版本的食谱?

我查看了 cookbook versionsknife cookbook documentation 上的 Chef 文档,但我仍然不太清楚安全更新食谱的正确方法。

感谢您的指导。

【问题讨论】:

    标签: chef-infra


    【解决方案1】:

    安全更新的最佳方法是永远不要直接修改社区食谱并使用包装食谱。

    此包装器将 depends 在其 metadata.rb 中的特定版本的社区食谱上(有关此 here 的更多详细信息):

    depends "jenkins", "~> 2.3"
    

    您将在包装说明书属性文件中调整社区说明书的属性。
    它们将在社区食谱之后加载(有关详细信息,请参阅attributes precedence),您必须特别注意派生属性(如果您愿意,请参阅https://coderanger.net/chef-tips/#5 了解解决方法),如果社区食谱有:

    default['jenkins']['version'] = "2.0.1"
    default['jenkins']['download_url'] = "https://some.site/artifacts/jenkins-#{node['jenkins']['version']}"
    

    如果您只想覆盖版本,那么您必须在包装说明书中重做这两个属性,第二行的download_url 将不再被评估。

    然后它将社区食谱包含在其配方中,并利用edit_resource recipe DSL method 修改社区食谱行为:

    include_recipe 'jenkins::default'
    
    edit_resource(:template, '/etc/jenkins/config.cnf') do
      source 'aliases.erb'
      cookbook 'aliases'
    end
    

    【讨论】:

    • 感谢您的详尽回复。除了创建包装说明书并在包装说明书的属性文件中修改社区说明书的属性之外,还有其他值得注意的更新说明书的方法吗?例如,将所有与原始食谱不同的食谱代码移动到其自己的食谱文件中,这样它们就不会被最新版本的食谱覆盖?
    • 只有当您对社区食谱尚未处理的文件/服务(大量资源)采取行动时才有可能,为同一文件重新定义模板通常最终会破坏幂等性或意外结果(因此上面介绍的 edit_resource 方法)。当然包装器可以毫无问题地添加其他资源(添加主配置包含的额外配置通常是一种)
    • 主要思想是,您可以然后更新您的包装器说明书,增加社区版本取决于行并对其进行测试,一旦确定,您就可以通过环境约束或策略文件传播包装器(我应该在答案中包含这个)
    • 您是否发现自己经常更新到最新版本的公共超市食谱?与收益相比,我正在尝试判断花时间创建新的食谱包装是否值得花费时间和精力。
    • 非常感谢您提供的所有信息。我已经开始按照建议为 Chef Supermarket Jenkins 食谱创建自己的包装食谱。准备更多stackoverflow问题! :D
    猜你喜欢
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 2016-03-06
    • 2013-07-12
    • 2014-05-01
    • 1970-01-01
    相关资源
    最近更新 更多