场景:有3个rpms A,B和C.
当我们安装rpm A时,我们正在安装rpm B和C.所以第一次安装工作正常。当我们在升级过程中安装较新版本的rpm A时,我们要删除rpm B和C由先前的rpm A安装。
要求:在安装新的rpm A之前,请检查是否安装了B和C.如果是,请卸载B和C.因此新的rpm A可以安装新的rpm B和C.
我们尝试了什么:
A&#39的规范文件前部分:
%的预
如果rpm -qa | grep B;然后
rpm -e B;
科幻
如果rpm -qa | grep C;然后
rpm -e C;
网络
我们正在使用傀儡。当我们运行puppet agent -t --debug时,在安装rpm A之前,它会被挂在下面的线上!
调试:执行' / usr / bin / yum -d 0 -e 0 -y安装A'
知道为什么我们无法卸载这些rpms吗?
编辑: 让我解释一下正确的情况:
它是一个遗留代码,我们正在修复升级期间发生的问题!
在木偶中,我们已经提到如果我们安装rpm A,请确保存在rpm B和C.
步骤:
1.我们将rpm A,B和C上传到我们的木偶服务器
2.在我们的木偶客户端中运行puppet agent –t
3.它安装所有的rpms
4. Rpm A的.spec文件:在%pre
部分他们正在rm –rf /m/n/current
部分,在%install
部分他们正在mkdir /m/n
并在此文件夹中提取rpm A的内容。<登记/>
5. Rpm B的.spec文件:在%install
部分,他们正在mkdir /m/n/current/filesofBAndC
并从此文件夹中的rpm B中提取文件
6. Rpm C的.spec文件:在%install
部分,他们正在执行mkdir /m/n/current/filesofBAnd
C并从此文件夹中的rpm C中提取文件
7.在下面的场景中一切正常
•首次安装
•卸载rpm A并安装较新版本的A(除了全新安装)
•升级A(B和C版本有变化)
8.问题是如果我们在没有任何版本更改的情况下安装较新版本的A(有足够的先前版本的A)而没有在rpm B和C中进行任何版本更改,它将仅安装rpm A(因为rpm B和C中没有版本更改) 。在rpm A安装期间,我们删除了文件夹/ m / n / current,这意味着我们的/ m / n / current / filesofBAndC也被删除了。
删除文件夹filesofBAndC正在创建问题。因此,如果我们在安装rpm A之前卸载rpm B和C,puppet将在安装rpm A期间再次安装这些rpms,并且将使用所需文件再次创建/m/n/current/filesofBAndC
。
由于某些依赖性,我们不应修改文件夹结构(如/m/n/filesofBAndC
)。
答案 0 :(得分:5)
因为这不是你应该如何做到这一点而且yum是事务性的,并且数据库可能在安装期间被锁定。
执行此操作的方法是在Requires:
包的A
文件的.spec
行列出B和C RPM,以便yum处理此当您要求它安装A
包时,会自动。
此外,如果您有特定的版本要求,也可以在Requires
行中包含这些要求,yum
将为您检查(并强制执行这些要求)。
您还可以添加Conflicts
条目,告诉yum
这两个软件包无法同时安装,Obsoletes
条目告诉yum
此软件包替换其他包,因此可以将其删除。
正确地完成所有这些并且yum
只为你处理这一切。