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
$ 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 ...