yum remove não é idempotente

1

Em algumas VMs do Centos, eu tenho alguns pacotes do 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 é:
Pode ser dito para ignorar os pacotes que faltam?
Ou pelo menos simplesmente falhar com "No Match for argument", sem se conectar a espelhos e tal?

O título da pergunta refere-se ao fato de que "yum remove -y mysql-community-client" seguido por "yum remove -y mysql-community-client" fará com que ele se conecte a espelhos, ao passo que "seguido de" pacote já desinstalado ".

Reformulando o problema: Problema não é com o RPM (eu mencionei apenas que para completar o meu problema), o problema é com o yum. "yum remove X" removerá o X, se estiver instalado. Se não estiver instalado, ele procurará nos espelhos que eu quero evitar. Eu quero que o yum diga "X not installed" e saia.

    
por Prem 04.11.2015 / 12:09

3 respostas

1

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

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

é o que você provavelmente quer.

    
por 04.11.2015 / 15:04
1

Se eu entendi corretamente, você quer impedir o acesso à rede, desativar plugins e desinstalar apenas os pacotes mysql-community que estão instalados atualmente. Então, que tal

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

e isso corresponderá somente a qualquer pacote instalado correspondido pelo glob "*mysql-community*" . Embora, em geral, eu pessoalmente nunca use -y flag juntamente com remove .

Se você deseja desinstalar seletivamente pacotes específicos, se instalados, a resposta do Thomas é exatamente o que você necessidade.

    
por 04.11.2015 / 21:09
0

Se você instalar um pacote usando rpm em vez de um repositório yum, o yum não saberá como determinar quando o rpm foi removido, porque não há repositório relevante para se referir. Então, parte disso (MariaDB) não pode ser feito idempotente.

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

Se você usar rpm para instalar um pacote, yum não notará imediatamente, mas avisará quando você solicitar a atualização do sistema de que o banco de dados RPM foi instalado fora do yum. Por esse motivo, você deve usar yum install para instalar os pacotes MariaDB do seu conjunto de RPMs.

    
por 04.11.2015 / 12:35