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-client
durch „gefolgt von“ yum remove -y mysql-community-client
eine 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 X
wird 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-community
aktuell 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 -y
zusammen 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 rpm
eines 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 -q
fü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 rpm
zum 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 yum
verwenden .yum install