问题描述
我们需要在RPM安装过程中动态传递一个变量并将其捕获到spec文件中,以触发%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 solution] $ sudo rpm -Uvh --force abc.noarch.rpm --define'_ip 10.1.2.4'--define'version 3' 正在准备... ############################### [100%]
更新/安装...
1:abc ############################### [50%]
ip :::: 0.0.0.0
VESION :::: 0
尽管我在CLI命令中传递了一个不同的值,但我仍然看到在规范文件中未捕获传递的参数。
需要输入有关如何捕获通过CLI的值的信息。
解决方法
选项--define
定义宏。使用rpmbuild从SRC.RPM构建RPM时会评估宏。二进制文件(arch或noarch无关紧要)包中的每个宏都已扩展。甚至是%bindir等。
RPM生态系统被设计为非交互式的。当可以使用debconf提出问题时,这与DEB生态系统有很大的区别。
您无法解决它。即使直接读取STDIN也无法询问,因为在执行scriptlet之前rpm关闭此描述符。
最佳做法是使用配置文件。例如。 /etc/abc/ip.conf
。并且:
-
指示用户手动(或使用Ansible)更改该文件并存储其正确数据
-
,或者不要在主
/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
等。