我需要找到已安装的 RPM 版本,以便我可以通过 Chef 配方对已安装软件中的特定子文件夹和文件应用适当的用户权限和修改。
我们拥有的由外部供应商提供的软件有一个包含软件版本的子文件夹。例如:
v22.2.0.11
当供应商发布新版本的软件时,我们更新本地 Yum 存储库以添加新的、合适版本的 RPM,然后我们拥有的 Chef 配方将使用标准 Chef“包”资源来更新已安装的软件.
cookbook 不知道这个新版本,也没有办法在运行更新之前告诉它版本。
但是,如果在安装该 RPM 后添加了内容(例如日志文件),则 RPM 更新不会删除 v22.2.0.11 目录。所以我们最终得到 2 个“v”子目录。例如:
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”命令的使用。我明白为什么,所以我需要一种 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 的 config_dir 和 config_xml,但我无法使用“rpm -q”命令。
经过一些工作和“开箱即用”的思考,我成功地通过添加一个引用 rpm-q 命令的模板来解决这个问题,然后在我的菜谱中调用它。