将Chef 11.x的Recipes与Data Bags复制至新实例
我之前处理过好几次类似的Chef跨实例迁移场景,给你分享几个最靠谱的方案,按复杂度和可靠性排序:
方案一:用Knife工具批量导出/导入(推荐)
这是最标准的官方做法,操作高效且不容易出错,前提是你能同时访问新旧两个Chef实例的API。
步骤1:从旧实例导出内容
首先配置好旧Chef实例的knife客户端(确保knife configure已完成,能正常连接旧服务器):
- 导出所有Recipes所在的Cookbooks:
这个命令会把所有Cookbook下载到当前目录的knife cookbook download --all --directory ./old_cookbooksold_cookbooks文件夹,包含所有版本的Recipes、模板和资源文件。 - 导出所有Data Bags:
所有Data Bag的内容会被保存到knife data bag download --all ./old_databagsold_databags目录下,每个Data Bag对应一个子文件夹,里面是各个Item的JSON文件。
步骤2:导入到新实例
接下来切换到新Chef实例的knife配置(可以修改~/.chef/knife.rb或者指定--config参数):
- 上传所有Cookbooks:
注意:如果新实例已有同名Cookbook,可加knife cookbook upload --all --cookbook-path ./old_cookbooks--force参数覆盖,但建议先确认版本差异再操作。 - 导入所有Data Bags:
先创建对应的Data Bag容器(新实例无对应容器时需要执行):
然后逐个上传Data Bag Item:for bag in $(ls ./old_databags); do knife data bag create $bag; donefor bag in $(ls ./old_databags); do for item in $(ls ./old_databags/$bag); do knife data bag from file $bag ./old_databags/$bag/$item done done
方案二:手动备份文件+重新上传(适合环境受限场景)
如果因为网络或权限问题没法用knife跨实例操作,可以直接从旧Chef服务器的文件系统备份:
- Recipes/Cookbooks:旧Chef 11.x的Cookbooks默认存储在
/var/chef/cookbooks目录(默认安装路径),直接打包该目录:
把压缩包传到新服务器后解压,再用tar -czf cookbooks_backup.tar.gz /var/chef/cookbooksknife cookbook upload上传到新实例。 - Data Bags:旧Chef的Data Bag数据存储在
/var/chef/data_bags目录,同样打包复制到新服务器,然后用knife data bag from file命令逐个导入。
必须注意的关键细节
- 加密Data Bags:如果你的Data Bags有加密(依赖
encrypted_data_bag_secret),一定要把旧实例的秘钥文件(默认路径/etc/chef/encrypted_data_bag_secret)复制到新实例的相同路径,否则导入后无法解密内容。 - Cookbook依赖检查:导出后记得检查每个Cookbook的
metadata.rb文件,确认依赖的其他Cookbook是否也一起导出,避免新实例出现依赖缺失问题。 - 权限设置:新实例中用来上传内容的Chef客户端(比如admin用户)必须拥有
create和updateCookbook、Data Bag的权限,否则会报错。 - 版本兼容性:Chef 11.x的Cookbook大多能兼容新版本Chef服务器,但如果新实例是Chef 13+,可能需要检查一些过时的资源语法(比如
ruby_block的旧写法),提前做兼容性调整。
内容的提问来源于stack exchange,提问作者OldBloke
相关产品推荐
相关产品推荐

