场景:有3个rpms A,B和C.
当我们安装rpm A时,我们也安装了rpm B和C.所以第一次安装工作正常 . 当我们安装更新版本的rpm A时,我们想要删除rpm B和C,它们是由之前的rpm安装的一个 .
要求:在安装新的rpm A之前,检查是否安装了B和C.如果是,请卸载B和C.因为新的rpm A可以安装新的rpm B和C.
我们尝试了什么:
A的spec文件%pre section:
%pre pre rpm -qa | grep B;然后rpm -e B; fi如果rpm -qa | grep C;然后rpm -e C;科幻
我们正在使用傀儡 . 当我们运行puppet agent -t --debug时,在安装rpm A之前它会被挂在下面的线上!
调试:执行'/ usr / bin / yum -d 0 -e 0 -y install A'
知道为什么我们无法卸载这些rpm吗?
编辑:让我解释一下正确的场景:
它是一个遗留代码,我们正在解决升级期间发生的问题!
在木偶中我们已经提到如果我们安装rpm A,确保存在rpm B和C.
脚步 :
1.我们将rpm A,B和C上传到我们的puppet服务器 .
2.在我们的puppet客户端中运行 puppet agent –t
.
3.它安装所有的rpm
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也被删除了 .
Deletion of folder filesofBAndC is creating issue . 因此,如果我们在安装rpm A之前卸载rpm B和C,则puppet将在安装rpm A期间再次安装这些rpms,并且将使用所需文件再次创建 /m/n/current/filesofBAndC
.
由于某些依赖性,我们不应该修改文件夹结构(如 /m/n/filesofBAndC
) .
1 回答
因为这不是你应该这样做的方式,而且yum是事务性的,并且数据库可能在安装期间被锁定 .
这样做的方法是在
A
软件包的.spec
文件的Requires:
行列出B和C RPM,以便yum在您要求安装A
软件包时自动为您处理 .此外,如果您有特定的版本要求,您也可以在
Requires
行中包含这些要求,yum
将为您检查(并强制执行这些) .您还可以添加
Conflicts
条目,告诉yum
这两个软件包不能同时安装,Obsoletes
条目告诉yum
该软件包替换了另一个软件包,因此可以将其删除 .做正确的事情,
yum
只为你处理这一切 .