На некоторых виртуальных машинах Centos мне нужно удалить несколько пакетов MySQL (через yum), а затем установить MariaDB (через rpm), все в скрипте оболочки. Я использую 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 --cacheonly remove -y mysql-community-client
это то, что вам, вероятно, нужно.
решение2
Если я правильно понял, вы хотите запретить сетевой доступ, отключить плагины и удалить только те mysql-community
пакеты, которые установлены в данный момент. Так что насчет
yum --disablerepo="*" --noplugins remove "*mysql-community*" -y
и это будет соответствовать только любому установленному пакету, соответствующему glob "*mysql-community*"
. Хотя в целом я лично никогда не использую -y
flag вместе с remove
.
Если вы хотите выборочно удалить только определенные пакеты, если они установлены, тоответ от Томасаименно то, что вам нужно.
решение3
Если вы устанавливаете пакет, используя, rpm
а не из репозитория yum, yum не будет знать, как определить, когда был удален rpm, поскольку нет соответствующего репозитория, на который можно было бы сослаться. Поэтому часть этого (MariaDB) не может быть сделана идемпотентной.
Если вы хотите сделать свой скрипт идемпотентным, лучшим подходом будет использование rpm -q
for для указанного пакета, чтобы определить, установлен ли он, и использовать этот результат для принятия решения о том, следует ли запускать yum.
Если вы используете rpm
для установки пакета, yum
не заметит сразу, но предупредит вас, когда вы попросите его обновить вашу систему, что база данных RPM была установлена вне yum. По этой причине вам следует использовать yum install
для установки пакетов MariaDB из вашего набора RPM.