yum remove não é idempotente

yum remove não é idempotente

Em algumas VMs Centos, tenho alguns pacotes MySQL para remover (via yum) e depois instalar o MariaDB (via rpm), tudo em um script de shell. Eu uso o yum para remoção:

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

Agora, em algumas VMs, talvez o pacote do cliente não esteja instalado, então yum diz:

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"  

Eu sei que a falha de conexão é por causa do nosso FireWall e tal.

Minha pergunta é:
é possível dizer ao yum para ignorar pacotes ausentes?
Ou pelo menos simplesmente falhar com No Match for argument, sem conectar-se a espelhos e tal?

O título da pergunta refere-se ao fato de que yum remove -y mysql-community-clientseguido por yum remove -y mysql-community-clientfará com que ele se conecte a espelhos, enquanto eu quero dizer "pacote desinstalado" seguido de "pacote já desinstalado".

Reformulando o problema: O problema não é com o RPM (só mencionei isso para completar o meu problema), o problema é com o yum. yum remove Xremoverá o X, se estiver instalado. Se não estiver instalado, irá procurar nos espelhos que desejo evitar. Quero que você diga "X não instalado" e saia.

Responder1

Podemos discutir por muito tempo como o yum se comporta ou deveria se comportar, mas para resumir a história:

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

é o que você provavelmente deseja.

Responder2

Se bem entendi, você deseja impedir o acesso à rede, desabilitar plug-ins e desinstalar apenas os mysql-communitypacotes que estão instalados atualmente. Então que tal

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

e isso corresponderá apenas a qualquer pacote instalado correspondente ao glob "*mysql-community*". Embora, em geral, eu pessoalmente nunca use -yflag junto com remove.

Se você deseja apenas desinstalar seletivamente pacotes específicos, se instalados, então oresposta de Tomásé exatamente o que você precisa.

Responder3

Se você instalar um pacote usando rpmem vez de um repositório yum, o yum não saberá como determinar quando o rpm foi removido, porque não há nenhum repositório relevante ao qual se referir. Portanto, parte disso (MariaDB) não pode se tornar idempotente.

Se você quiser tornar seu script idempotente, uma abordagem melhor seria usar rpm -qo pacote fornecido para determinar se ele está instalado e usar esse resultado para decidir se deve executar o yum.

Se você usar rpmum pacote para instalar, yumnão notará imediatamente, mas avisará quando você pedir para atualizar seu sistema que o banco de dados RPM foi instalado fora do yum. Por este motivo, você deve usar yum installpara instalar os pacotes MariaDB do seu conjunto de RPMs.

informação relacionada