You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Chef中获取RedHat已安装RPM版本以配置目录权限?

如何在Chef Recipe中不使用rpm命令获取已安装RPM版本并定位配置路径

我们需要获取已安装RPM的版本,以便通过Chef Recipe对软件内特定子文件夹和文件设置合适的用户权限及修改内容。

外部供应商提供的软件包含带版本号的子文件夹,例如:

v22.2.0.11

当供应商发布新版本时,我们会在本地Yum仓库添加对应版本的RPM,现有Chef Recipe使用标准package资源更新软件。但Cookbook无法提前知晓新版本信息,且RPM更新时,若旧版本目录(如v22.2.0.11)存在新增内容(如日志文件)则不会被删除,导致出现多个版本目录,示例如下:

ls -rlt
total 0
drwxr-x---. 2 user_adm esmgroup 6 Apr 12 13:53 v22.2.0.11
drwxr-x---. 2 user_adm esmgroup 6 Apr 12 13:53 v23.4.101.345
-rw-r-----. 1 user_adm esmgroup 0 Apr 12 13:54 server.jar
-rw-r-----. 1 user_adm esmgroup 0 Apr 12 13:54 server_start.sh

注:上述文件为示例虚构内容。

执行rpm -qa可看到类似如下内容:

my-software-23.4.101.345-1.noarch (or equivalent)

原本可通过cut命令提取版本号,例如rpm -qa | grep <rpm name> | cut -d'-' -f3,但内部自动化代码校验流程禁止使用rpm命令,因此需通过Chef实现该功能。

当前被限制的代码如下:

execute 'Create Version File' do
    command "rpm -qa | grep #{rpm_name} | cut -d'-' -f3 > /tmp/ver_data"
    creates '/tmp/ver_data'
end
installed_version = if !node['server']['use_latest_rpm'] && !node['server']['version'].nil?
                       node['server']['version'].split('-').first
                     else
                       `cat '/tmp/ver_data' | tr -d '\\n'`
                     end

# add the "v" part for folder name info
ver_dir = "v#{installed_version}"

config_dir = "#{server_base_dir}/#{ver_dir}/conf"
config_xml = "#{config_dir}/config.xml"

需要解决的问题:在无法使用rpm -q命令的情况下,识别未来新增RPM对应的config_dir和config_xml路径。

内容的提问来源于stack exchange,提问作者Geoff Harrison

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 23:42:25