如何解决Chef Client 14.6.47下7zip安装失败的NameError问题
问题分析与修复方案
错误根源
触发NameError: undefined local variable or method 'source'的原因主要两点:
- 你引用的节点属性
node[:packages][:ziputil]未在Chef节点/环境中定义,导致source属性值为空,引发资源解析错误 - Chef的
windows_zipfile资源不支持直接使用远程URL作为source参数,必须先将压缩包下载到本地文件系统,再指向本地路径进行解压
修复步骤
1. 配置节点属性(或直接硬编码URL)
如果要保留节点属性的方式,需在Chef节点配置或环境文件中添加该属性:
# 节点属性文件或环境文件中添加 default['packages']['ziputil'] = 'http://downloads.sourceforge.net/sevenzip/7za920.zip'
如果不需要动态配置,也可以直接在配方中写死URL。
2. 新增下载+解压的完整流程
使用remote_file先将远程压缩包下载到本地临时目录,再用windows_zipfile解压:
# 创建临时目录(如果不存在) directory 'C:/temp' do action :create recursive true end # 定义本地zip文件路径 local_zip = 'C:/temp/7za920.zip' # 下载远程压缩包到本地 remote_file local_zip do source node['packages']['ziputil'] # 或替换为硬编码URL:'http://downloads.sourceforge.net/sevenzip/7za920.zip' action :create not_if { ::File.exists?('c:/dirname/7za.exe') } end # 解压本地zip文件到目标目录 windows_zipfile 'c:/dirname/' do source local_zip action :unzip not_if { ::File.exists?('c:/dirname/7za.exe') } end
3. 额外验证项
- 确认目标Windows节点能访问SourceForge的下载地址,无防火墙/代理拦截
- 检查目标解压目录
c:/dirname/的权限,确保Chef Client运行账号有写入权限
内容的提问来源于stack exchange,提问作者Santosh Garole
相关产品推荐
相关产品推荐

