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 軟體包。

相關內容