Chef infra 厨师:烹饪书罐';不要依赖其他烹饪书的旧版本 背景

Chef infra 厨师:烹饪书罐';不要依赖其他烹饪书的旧版本 背景,chef-infra,versioning,cookbook,Chef Infra,Versioning,Cookbook,注意:对于整个问题,请记住我要使用环境烹饪书的0.0.3 注2:我们以前从未遇到过这个问题。这是最近发生的,我们不知道是什么原因造成的 1. 环境烹饪书和环境烹饪书机器 要构建域,我们有两本食谱: 一个用于资源调配机器:环境烹饪书机器 一个用于域配置:environment cookbook 当我检查Chef服务器时: $ knife cookbook list -a | grep environment environment-cookbook 0.0.3 0.0.4 0.0.5 0.0.

注意:对于整个问题,请记住我要使用
环境烹饪书的
0.0.3

注2:我们以前从未遇到过这个问题。这是最近发生的,我们不知道是什么原因造成的

1. <代码>环境烹饪书
环境烹饪书机器
要构建域,我们有两本食谱:

  • 一个用于资源调配机器:
    环境烹饪书机器
  • 一个用于域配置:
    environment cookbook
当我检查Chef服务器时:

$ knife cookbook list -a | grep environment
environment-cookbook 0.0.3 0.0.4 0.0.5 0.0.6 0.0.7
查看
公司环境手册0.0.3
元数据.json
,我发现它依赖于
目录库0.13.6

"dependencies": {
  "dir-library": "= 0.13.6"
}
environment cookbook 0.0.4
及更高版本取决于
dir库0.13.7

"dependencies": {
  "dir-library": "=0.13.7"
}
2. <代码>包装器域和
包装器域计算机
由于每个域都可以依赖于特定版本的
环境cookbook
,因此我们分别为每个域使用包装器cookbook

  • 包装域计算机
  • wrapper域
检查这两个包装器的
metadata.json
,会显示对
environment cookbook 0.0.3
的依赖性(这是我想要的版本):

包装器域机器
还显示了对
环境cookbook机器0.0.3
的依赖性

那些包装器烹饪书的
Berksfile.lock
如下所示:

GRAPH 
environment-cookbook (0.0.3)
    dir-library (= 0.13.6)
environment-cookbook-machines (0.0.3)  # Only here for wrapper-cookbook-machines
    dir-library (= 0.13.6)
3.依赖关系图 当我在我的
包装器域机器上运行
berks-wiz
时,我会得到以下依赖关系图:

所以一切看起来都很好。

问题 当我在Hudson上通过CI作业运行域构建时,我在日志文件的开头看到以下内容:

INFO: Using dir-library (0.13.6)
INFO: Using environment-cookbook (0.0.3)
INFO: Using environment-cookbook-machines (0.0.3)
INFO: Installing environment-cookbook (0.0.3) from chef-server-url
INFO: Using dir-library (0.13.6)
再进一步说:

INFO: Run List is [recipe[wrapper-domain-machines::up-machines]]
INFO: Run List expands to [wrapper-domain-machines::up-machines]
INFO: Loading cookbooks [wrapper-domain-machines@0.0.2, dir-library@0.13.6, environment-cookbook-machines@0.0.3]
到目前为止还不错。它正在使用
0.0.3版的
环境食谱
0.13.6版的
dir库

稍后在构建过程中:

INFO: Run List is [recipe[environment-cookbook::prepare_machine]]
INFO: Run List expands to [environment-cookbook::prepare_machine]
INFO: Starting Chef Run for domain.company.com
INFO: Running start handlers
INFO: Start handlers complete.
resolving cookbooks for run list: ["environment-cookbook::prepare_machine"][0m
INFO: Loading cookbooks [environment-cookbook@0.0.7, dir-library@0.13.7]
停下来,什么?

信息:加载烹饪书[环境]-cookbook@0.0.7,目录-library@0.13.7]

到目前为止我们尝试了什么
  • 删除缓存的食谱

    • .berkself/cookbooks
    • 重新运行构建(从chef服务器自动下载)
    • 仍然拾取
      0.0.8
  • 检查其他烹饪书中的
    环境烹饪书的依赖关系:NONE

  • 0.0.3
    0.0.7
    删除并重新安装所有版本的
    environment cookbook
    :运气不好

  • 在重新运行之前清理chef客户端和节点:也没有运气

  • 问题
    • 为什么它要更改为最新版本的
      环境烹饪书(0.0.7)
      ,从而选择它的依赖项
      目录库(0.13.7)

    • 如何对此进行故障排除

    • 今后如何避免这种情况

    对我们来说,这真是一场精彩的演出


    问我任何进一步的澄清,我会更新这篇文章。

    我怀疑这和我们遇到的厨师问题是一样的。它归结为运行时版本控制,而不是编译时版本控制

    经验教训:运行时无约束的食谱版本在大规模运行chef时是危险的

    背景 您正在使用Berkshellf管理您的cookbook依赖项,这非常好,可以确保将正确的版本加载到chef服务器中。微妙的问题是,每本食谱都有自己的依赖关系树。在运行时,当您将多个Cookbook添加到节点的运行列表时,chef server必须计算新的依赖关系树。这个问题可能是随机出现的,因为它取决于你在跑步列表上的食谱组合。食谱越多,冲突的可能性就越大

    我们试图通过显式地设置cookbook元数据文件的依赖项来解决这个问题。我们发现,Chef会默默地无法解析某些烹饪书的依赖关系树,并默认返回到一个旧版本,它将计算依赖关系。非常令人费解

    当我们开始在运行列表上显式设置cookbook的版本时,我们更接近这个问题。我们开始收到chef无法解析依赖项的错误消息。特别奇怪的是,这个问题对我们的生产厨师服务器的影响最大。我们最终确定,这是因为在制作过程中,我们加载了所有历史版本的烹饪书。清除旧食谱有帮助,但并没有解决我们的问题

    在我们发现这些问题之前,这位厨师已经工作了近两年。正是时间和规模暴露了我们系统中的致命缺陷。在运行时,您需要修复烹饪书的版本,以匹配您之前测试过的配置

    分析 来自Java背景的我将问题等同于如何在tomcat服务器上运行多个应用程序

    Maven是一个构建工具,它管理每个应用程序依赖项,并创建一个用于上传到tomcat的包。在Chef中,正是Berkshelf实现了此功能

    最大的区别在于运行时。Tomcat为属于每个应用程序的JAR创建一个单独的类路径。这在运行时为应用程序提供了强大的隔离,允许它们安全地运行同一本食谱的不同版本。这是Chef所面临的不可能解决的问题,在运行时Chef客户端只运行一组食谱

    解决 虽然我不喜欢策略文件,但我把它们作为厨师喜欢的选项来展示

    策略文件 虽然大多数用户都没有注意到问题的解决,但chef开发了一个新功能,名为policy fi
    INFO: Run List is [recipe[environment-cookbook::prepare_machine]]
    INFO: Run List expands to [environment-cookbook::prepare_machine]
    INFO: Starting Chef Run for domain.company.com
    INFO: Running start handlers
    INFO: Start handlers complete.
    resolving cookbooks for run list: ["environment-cookbook::prepare_machine"][0m
    INFO: Loading cookbooks [environment-cookbook@0.0.7, dir-library@0.13.7]
    
    berks upload 
    berks apply my_app_cookbook_version1
    
    knife bootstrap --environment my_app_cookbook_version1 ...