如何使用Chef从Web地址下载远程zip压缩包并完成解压
Chef Recipe 下载并解压远程文件最优实现方案
首先不推荐自行调用PowerShell实现,Chef原生内置的资源已经覆盖该场景,自带幂等性、异常处理、完整性校验能力,无需额外编写脚本逻辑。
环境依赖说明
- Chef Client 15及以上版本:
archive_file为原生内置资源,无需额外安装第三方cookbook即可直接使用 - Chef Client 15以下版本:只需在metadata.rb中添加
seven_zip社区cookbook依赖即可使用对应解压能力
推荐实现方案
方案1:单资源完成下载+解压(适合不需要保留原zip包的场景)
仅用archive_file一个资源即可同时完成远程文件下载、本地解压的全流程:
archive_file 'openhardwaremonitor-v0.9.6.zip' do source 'https://openhardwaremonitor.org/files/openhardwaremonitor-v0.9.6.zip' destination 'C:\Program Files\OpenHardwareMonitor' # 替换为你的实际解压目标路径 overwrite true # 可选,指定是否覆盖目标路径下的已有文件 action :extract end
方案2:分步实现(适合需要保留原zip包、需提前校验文件完整性的场景)
拆分为remote_file下载文件、archive_file解压两个步骤,可灵活添加校验逻辑:
# 第一步:下载zip包到本地指定路径 remote_file 'C:\temp\openhardwaremonitor-v0.9.6.zip' do source 'https://openhardwaremonitor.org/files/openhardwaremonitor-v0.9.6.zip' # checksum '替换为zip包的SHA256校验值' # 可选,添加后仅当文件校验不匹配时才会重新下载,防止文件被篡改 action :create end # 第二步:解压本地zip包到目标路径 archive_file 'C:\temp\openhardwaremonitor-v0.9.6.zip' do destination 'C:\Program Files\OpenHardwareMonitor' overwrite true action :extract only_if { ::File.exist?('C:\temp\openhardwaremonitor-v0.9.6.zip') } end
原生资源对比自定义PowerShell的优势
- 天然支持幂等性:重复执行时如果目标文件已存在且符合要求,不会重复执行下载、解压操作,无需自行编写判断逻辑
- 无需处理命令执行权限、返回值捕获、异常兼容等问题,Chef底层已做好Windows系统适配
- 支持文件校验、权限配置等扩展能力,代码可读性和可维护性远高于自定义脚本
- 跨平台兼容性更强,后续如果有跨系统需求仅需调整路径参数即可,无需重写核心逻辑
内容的提问来源于stack exchange,提问作者james chen
相关产品推荐
相关产品推荐

