首页 > 解决方案 > 如何在安装期间将参数动态传递给 RPM

问题描述

我们需要在 RPM 安装过程中动态传递一个变量并在规范文件中捕获它以触发 %post 中的脚本

以下是命令 RPM 安装命令 sudo rpm -Uvh --force abc.noarch.rpm --define '_ip 10.1.2.4' --define 'version 3'

**abc.spec**

Name:       abc
Version:    1
Release:    1.0
Summary:    Test

%{!?_ip: %define _ip 0.0.0.0 }

%{!?_version: %define _version 0 }

%post 

echo "ip:::: %{_ip}"
echo "VESION:::: %{_version}"

因此,当我使用上述命令运行 RPM 时,我得到以下输出。

[root@test 解决方案]$ sudo rpm -Uvh --force abc.noarch.rpm --define '_ip 10.1.2.4' --define 'version 3' Preparing... ########### ###################### [100%]

更新/安装...

1:abc ################################# [50%]

ip:::: 0.0.0.0

VESION:::: 0

尽管我在 CLI 命令中传递了不同的值,但我仍然看到我传递的参数没有在规范文件中捕获。

需要有关如何捕获即时通过 CLI 的值的输入。

标签: dynamicrpmrpmbuildrpm-spec

解决方案


该选项--define定义宏。使用 rpmbuild 从 SRC.RPM 构建 RPM 时会评估宏。二进制(无论是 arch 还是 noarch)包的每个宏都已经展开。甚至 %bindir 等。

RPM 生态系统被设计为非交互式的。当可以使用 debconf 提出问题时,这与 DEB 生态系统有很大不同。

您无法解决它。您甚至无法通过直接读取 STDIN 来询问,因为 rpm 在执行小脚本之前关闭此描述符。

最佳实践是使用配置文件。例如/etc/abc/ip.conf。和:

  1. 指示用户手动(或使用 Ansible)更改该文件并存储其正确数据

  2. 或者不要/etc/abc/ip.conf在主abc包中分发,而是需要abc-config. 然后创建一个或多个配置包,如下所示:

Package: abc-testing-config
Provides: abc-config
...
%files
/etc/abc/ip.conf

然后您指示用户安装abc abc-test-config. 或者它可以是abc abc-EMEA-config等等......


推荐阅读