如何在Chef 11.10/OpsWorks中强制使用Windows cookbook 3.4.4?
我太懂你这个糟心的情况了——在Chef 11.10/Berkshelf 3.2.0的OpsWorks环境里,Windows cookbook 3.4.5及以上版本直接搞崩构建,明明在Berksfile里指定了3.4.4,结果部署时还是硬拉了4.1.1版本。下面是几个能彻底解决这个问题的实操步骤:
1. 强制锁定版本并提交Berksfile.lock
首先把Berksfile里的Windows cookbook版本锁死,然后生成并提交Berksfile.lock文件:
# 编辑你的Berksfile,添加或修改这一行 cookbook 'windows', '= 3.4.4'
接着在本地运行命令生成锁文件:
berks install
把生成的Berksfile.lock一起提交到你的Cookbook仓库里——OpsWorks部署时会优先读取这个锁文件的版本,彻底避免依赖解析时自动拉取最新版的坑。
2. 确认OpsWorks的Berkshelf配置
登录AWS OpsWorks控制台,找到对应的层,检查Custom Chef Cookbooks的设置:
- 一定要确保「Use Berkshelf」选项是开启状态
- 核对你的Cookbook仓库地址、分支/版本是否正确
要是没开Berkshelf,OpsWorks会直接从Chef Supermarket拉取默认的最新Windows cookbook,这就是为什么4.1.1会偷偷跑出来的原因。
3. 清理OpsWorks实例缓存
有时候实例的缓存目录里会残留旧的cookbook版本,部署时会优先加载缓存里的文件。手动清理一下:
sudo rm -rf /var/lib/aws/opsworks/cache.stage2/
清理完重新触发部署,OpsWorks就会重新拉取并安装你指定的3.4.4版本了。
4. 检查并覆盖依赖链中的冲突
如果前面的步骤都没用,大概率是你的其他Cookbook依赖了更高版本的Windows cookbook。运行下面的命令查看完整依赖树:
berks dependencies
找到哪个Cookbook要求了更高版本的Windows,然后在Berksfile里强制覆盖这个依赖:
cookbook 'windows', '= 3.4.4', override: true
override: true参数会让Berkshelf直接忽略其他Cookbook的版本要求,硬用你指定的3.4.4版本。
顺便提一句:你遇到的NoMethodError本质是Windows cookbook 3.4.5+用了Chef 12及以上版本的API,而你的环境是Chef 11.10,完全不兼容,所以必须锁死3.4.4这个兼容Chef 11的版本。
内容的提问来源于stack exchange,提问作者alyx

