yum remove 不是幂等的

yum remove 不是幂等的

在一些 Centos VM 上,我需要删除一些 MySQL 软件包(通过 yum),然后安装 MariaDB(通过 rpm),所有这些都在 shell 脚本中。我使用 yum 进行删除:

yum remove -y mysql-community-client  
yum remove -y mysql-community-release  
yum remove -y mysql-community-libs  
yum remove -y mysql-community-common  

现在,在某些虚拟机上,可能未安装客户端软件包,因此 yum 会显示:

No Match for argument: mysql-community-client  
Determining fastest mirrors  
Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os&infra=stock error was  
14: PYCURL ERROR 7 - "couldn't connect to host"  

我知道连接失败是因为我们的防火墙之类的。

我的问题是:
可以告诉 yum 忽略丢失的包吗?
或者至少只是简单地失败No Match for argument,而不连接到镜像等?

问题标题指的是这样一个事实,yum remove -y mysql-community-client后面跟着yum remove -y mysql-community-client将使其连接到镜像,而我希望它说“程序包已卸载”,然后是“程序包已卸载”。

重新表述问题:问题不在于 RPM(我只是为了问题的完整性才提到这一点),问题在于 yum。yum remove X如果安装了 X,将会删除它。如果没有安装,它会在我想避免的镜像中搜索。我想让 yum 说“X 未安装”并退出。

答案1

我们可以长时间讨论 yum 如何表现或应该表现,但长话短说:

yum --cacheonly remove -y mysql-community-client

可能是你想要的。

答案2

如果我理解正确的话,您想要阻止网络访问、禁用插件并仅卸载mysql-community当前安装的那些软件包。那么怎么样

yum --disablerepo="*" --noplugins remove "*mysql-community*" -y

并且只会匹配与 glob 匹配的任何已安装的软件包"*mysql-community*"。虽然一般来说我个人不会将-yflag 与 一起使用remove

如果您只想选择性地卸载已安装的特定软件包,那么托马斯的回答正是您所需要的。

答案3

如果您使用而不是从 yum 存储库安装软件包rpm,则 yum 将不知道如何确定 rpm 何时被删除,因为没有相关的存储库可供参考。所以其中一部分(MariaDB)不能成为幂等的。

如果您想让脚本幂等,更好的方法是使用rpm -q给定的包来确定它是否已安装,并使用该结果来决定是否运行 yum。

如果您用于rpm安装软件包,yum不会立即注意到,但当您要求它更新系统时会警告您 RPM 数据库安装在 yum 之外。因此,您应该yum install从 RPM 集中安装 MariaDB 软件包。

相关内容