如何在自定义目录安装升级RPM包?Chef yum_package报错求助
解决Chef yum_package安装自定义目录RPM报错问题及操作指南
问题分析
你的代码有两个核心问题导致了报错:
- 通配符解析错误:
%w("gpfs.*.*.rpm")会生成带双引号的字符串元素(比如"gpfs.*.*.rpm"),而且%w语法只是简单拆分空格分隔的字符串,不会解析文件通配符,所以Chef找不到名为"gpfs.*.*.rpm"的包。 - source参数使用错误:
yum_package的source需要指向具体的RPM文件完整路径,而你只指定了目录,Chef无法定位到具体的安装包。
修正后的代码
我们可以用Dir.glob来正确匹配目标目录下的所有gpfs相关RPM,然后遍历每个包并指定完整路径:
# 匹配/root/gpfs_driver/base目录下所有gpfs开头的rpm文件 Dir.glob("/root/gpfs_driver/base/gpfs.*.*.rpm").each do |pkg_path| # 从完整路径中提取包名(也可以直接用pkg_path作为package_name) pkg_name = File.basename(pkg_path, ".rpm") yum_package pkg_name do source pkg_path action :install end end
如果不需要单独提取包名,也可以简化成:
Dir.glob("/root/gpfs_driver/base/gpfs.*.*.rpm").each do |pkg_path| yum_package File.basename(pkg_path) do source pkg_path action :install end end
自定义目录RPM的安装与升级指南
1. 安装自定义目录的RPM
- 用
Dir.glob替代%w来处理文件通配符,确保能匹配到目标目录下的所有对应RPM - 必须给
source参数指定完整的RPM文件路径,不能只提供目录 - 如果需要处理依赖,
yum_package会自动通过yum仓库解决依赖(前提是仓库中存在对应的依赖包)
2. 升级自定义目录的RPM
如果需要把系统中已安装的包升级到自定义目录里的新版本,只需将action改为:upgrade:
Dir.glob("/root/gpfs_driver/base/gpfs.*.*.rpm").each do |pkg_path| yum_package File.basename(pkg_path) do source pkg_path action :upgrade end end
注意:
:upgrade会自动对比系统中已安装的包版本,只有当自定义目录中的包版本更高时才会执行升级操作。
3. 无依赖安装(可选)
如果不需要yum处理依赖,也可以直接使用rpm_package资源(它直接调用系统的rpm命令):
Dir.glob("/root/gpfs_driver/base/gpfs.*.*.rpm").each do |pkg_path| rpm_package File.basename(pkg_path) do source pkg_path action :install # 如果需要强制安装(覆盖现有文件),可以添加如下配置 # options "--force" end end
额外注意事项
- 确保Chef运行用户(通常是root)对
/root/gpfs_driver/base目录有读取权限 - 如果通配符匹配到多个同包不同版本的RPM,建议先按版本号排序(比如降序),避免安装旧版本:
# 按版本号降序排序,优先处理最新版本 sorted_pkgs = Dir.glob("/root/gpfs_driver/base/gpfs.*.*.rpm").sort_by { |f| Gem::Version.new(File.basename(f).split('.')[2]) }.reverse sorted_pkgs.each do |pkg_path| yum_package File.basename(pkg_path) do source pkg_path action :upgrade end end
内容的提问来源于stack exchange,提问作者bhai
相关产品推荐
相关产品推荐

