yum remove ist nicht idempotent

yum remove ist nicht idempotent

Auf einigen Centos-VMs muss ich einige MySQL-Pakete entfernen (über yum) und dann MariaDB installieren (über rpm), alles in einem Shell-Skript. Ich verwende yum zum Entfernen:

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

Nun ist auf einigen VMs möglicherweise das Client-Paket nicht installiert, daher sagt 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"  

Ich weiß, dass der Verbindungsfehler an unserer Firewall und dergleichen liegt.

Meine Frage ist:
Kann man Yum anweisen, fehlende Pakete zu ignorieren?
Oder zumindest einfach mit abzubrechen No Match for argument, ohne eine Verbindung zu Spiegeln und dergleichen herzustellen?

Der Fragentitel bezieht sich auf die Tatsache, dass yum remove -y mysql-community-clientdurch „gefolgt von“ yum remove -y mysql-community-clienteine Verbindung zu Spiegeln hergestellt wird, während ich möchte, dass dort „Paket deinstalliert“ gefolgt von „Paket bereits deinstalliert“ steht.

Umformulierung des Problems: Das Problem liegt nicht bei RPM (ich habe das nur der Vollständigkeit halber erwähnt), das Problem liegt bei yum. yum remove Xwird X entfernen, wenn es installiert ist. Wenn es nicht installiert ist, wird es in den Spiegeln suchen, was ich vermeiden möchte. Ich möchte, dass yum „X nicht installiert“ sagt und beendet wird.

Antwort1

Wir können lange darüber diskutieren, wie sich Yum verhält oder verhalten sollte, aber um es kurz zu machen:

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

ist, was Sie wahrscheinlich wollen.

Antwort2

Wenn ich das richtig verstanden habe, möchten Sie den Netzwerkzugriff verhindern, Plugins deaktivieren und nur die mysql-communityaktuell installierten Pakete deinstallieren. Wie wäre es also mit

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

und das wird nur mit jedem installierten Paket übereinstimmen, das mit dem Glob übereinstimmt "*mysql-community*". Obwohl ich persönlich Flag im Allgemeinen nie -yzusammen mit verwenden würde remove.

Wenn Sie nur bestimmte Pakete, falls installiert, selektiv deinstallieren möchten, dannAntwort von Thomasist genau das, was Sie brauchen.

Antwort3

Wenn Sie ein Paket mithilfe rpmeines Yum-Repositorys und nicht von dort installieren, kann Yum nicht feststellen, wann das RPM entfernt wurde, da kein relevantes Repository vorhanden ist, auf das verwiesen werden kann. Ein Teil davon (MariaDB) kann daher nicht idempotent gemacht werden.

Wenn Sie Ihr Skript idempotent machen möchten, wäre es ein besserer Ansatz, rpm -qfür das angegebene Paket zu verwenden, um zu bestimmen, ob es installiert ist, und dieses Ergebnis zu verwenden, um zu entscheiden, ob yum ausgeführt werden soll.

Wenn Sie rpmzum Installieren eines Pakets verwenden, wird dies nicht sofort bemerkt, aber Sie werden gewarnt, wenn Sie es zum Aktualisieren Ihres Systems auffordern, dass die RPM-Datenbank außerhalb von yum installiert wurde. Aus diesem Grund sollten Sie zum Installieren der MariaDB-Pakete aus Ihrem RPM-Satz yumverwenden .yum install

verwandte Informationen