Вопрос или проблема
Как я могу получить список пакетов с ожидающими обновлениями на CentOS7, разделенный пробелами, в формате, необходимом для передачи в качестве аргумента команде yum update-to
?
Я хочу обновить все пакеты на моем производственном сервере с CentOS7. Перед обновлением на производственном сервере я хочу обновить их на тестовом сервере и убедиться, что изменения не нарушают работу приложений нашего сервера. После проверки мы запланируем тикет на изменение для производства и запустим ту же команду yum update-to
(в отличие от потенциально недетерминированной и неидемпотентной команды yum update
) на производственном сервере позже.
Итак, я пытаюсь [a] определить все пакеты, для которых доступны обновления на моем сервере, и [b] подготовить команду, использующую yum update-to
, которая будет перечислять именно пакеты и их версии для обновления.
Вот пример необходимого синтаксиса команды yum update-to
:
yum update-to dbus-1.10.24-13.el7_6 dbus-libs-1.10.24-13.el7_6 java-1.8.0-openjdk-1.8.0.242.b08-1.el7 java-1.8.0-openjdk-headless-1.8.0.242.b08-1.el7 tzdata-java-2019c-1.el7 unzip-6.0-21.el7
Проблема в том, что yum update --assumeno
и yum list updates
выводят список пакетов в совершенно другом формате, чем тот, который ожидает yum update-to
.
Вот пример вывода вышеупомянутых команд, относящийся к пакетам из примера выше:
[root@cent7 ~]# yum update --assumeno | grep -E 'dbus|java|unzip'
---> Пакет dbus.x86_64 1:1.6.12-17.el7 будет обновлен
---> Пакет dbus.x86_64 1:1.10.24-13.el7_6 будет обновлением
---> Пакет dbus-libs.x86_64 1:1.6.12-17.el7 будет обновлен
---> Пакет dbus-libs.x86_64 1:1.10.24-13.el7_6 будет обновлением
---> Пакет java-1.8.0-openjdk.x86_64 1:1.8.0.181-3.b13.el7_5 будет обновлен
---> Пакет java-1.8.0-openjdk.x86_64 1:1.8.0.242.b08-1.el7 будет обновлением
--> Обработка зависимости: gtk2(x86-64) для пакета: 1:java-1.8.0-openjdk-1.8.0.242.b08-1.el7.x86_64
---> Пакет java-1.8.0-openjdk-headless.x86_64 1:1.8.0.181-3.b13.el7_5 будет обновлен
---> Пакет java-1.8.0-openjdk-headless.x86_64 1:1.8.0.242.b08-1.el7 будет обновлением
--> Обработка зависимости: pcsc-lite-libs(x86-64) для пакета: 1:java-1.8.0-openjdk-headless-1.8.0.242.b08-1.el7.x86_64
--> Обработка зависимости: cups-libs(x86-64) для пакета: 1:java-1.8.0-openjdk-headless-1.8.0.242.b08-1.el7.x86_64
---> Пакет tzdata-java.noarch 0:2017b-1.el7 будет обновлен
---> Пакет tzdata-java.noarch 0:2019c-1.el7 будет обновлением
---> Пакет unzip.x86_64 0:6.0-16.el7 будет обновлен
---> Пакет unzip.x86_64 0:6.0-21.el7 будет обновлением
dbus x86_64 1:1.10.24-13.el7_6 base 245 k
dbus-libs x86_64 1:1.10.24-13.el7_6 base 169 k
java-1.8.0-openjdk x86_64 1:1.8.0.242.b08-1.el7 base 293 k
java-1.8.0-openjdk-headless
tzdata-java noarch 2019c-1.el7 base 187 k
unzip x86_64 6.0-21.el7 base 171 k
[root@cent7 ~]#
[root@cent7 ~]# yum list updates | grep -E 'dbus|java|unzip'
dbus.x86_64 1:1.10.24-13.el7_6 base
dbus-libs.x86_64 1:1.10.24-13.el7_6 base
java-1.8.0-openjdk.x86_64 1:1.8.0.242.b08-1.el7 base
java-1.8.0-openjdk-headless.x86_64 1:1.8.0.242.b08-1.el7 base
tzdata-java.noarch 2019c-1.el7 base
unzip.x86_64 6.0-21.el7 base
[root@cent7 ~]#
Как мне преобразовать вывод пакетов и их версий из yum update --assumeno
или yum list updates
в формат, принимаемый yum update-to
?
Это решение с sed
и awk
работает:
[root@cent7 ~]# pkgs=`yum -q list updates 2>&1 | tail -n+2 | awk '{print $1 "|" $2}' | sed 's/\.[^.]*|\(.*\:\)*/-/' | tr "\n" " "`
[root@cent7 ~]# echo "yum update-to $pkgs"
yum update-to dbus-1.10.24-13.el7_6 dbus-libs-1.10.24-13.el7_6 java-1.8.0-openjdk-1.8.0.242.b08-1.el7 java-1.8.0-openjdk-headless-1.8.0.242.b08-1.el7 tzdata-java-2019c-1.el7 unzip-6.0-21.el7
[root@cent7 ~]#
Но я надеюсь, что кто-то сможет найти лучшее решение, которое будет менее хакерским. Идеально было бы решить вопрос так, чтобы yum
выводил формат более удобный для пакетной обработки.
очень полезно, спасибо
очень полезно, спасибо
Ответ или решение
Для получения списка пакетов, которые нуждаются в обновлении на сервере CentOS 7, необходимо использовать комбинацию команд с утилитами yum
, awk
, sed
и tr
. Это позволит сформировать строку, соответствующую формату, который принимает команда yum update-to
. Давайте разберем этот процесс подробнее.
Полный процесс получения списка пакетов для yum update-to
-
Получение списка обновлений: Сначала вам нужно получить список всех доступных обновлений через
yum
. Для этого выполните команду:yum -q list updates
Опция
-q
означает "тихий режим", что поможет избежать лишнего вывода и сосредоточиться на результатах. -
Форматирование вывода: Полученный вывод нужно обработать, чтобы привести его к необходимому формату. Для этого мы будем использовать
awk
иsed
. -
Сбор информации в переменную: Вы можете собрать информацию в переменную с помощью следующего скрипта:
pkgs=$(yum -q list updates 2>&1 | tail -n +2 | awk '{print $1 "|" $2}' | sed 's/\.[^.]*|\(.*\:\)*/-/' | tr "\n" " ")
Каждый элемент в этом процессе выполняет свою задачу:
tail -n +2
: Пропускает заголовок вывода.awk '{print $1 "|" $2}'
: Извлекает имя пакета и его доступную версию.sed 's/\.[^.]*|\(.*\:\)*/-/'
: Убирает ненужные части строки и формирует окончательный формат видаpackage-name-version
.tr "\n" " "
: Заменяет переводы строк на пробелы, чтобы получить одну строку.
-
Формирование команды для обновления: Теперь вы можете вывести полную команду
yum update-to
с собранным списком пакетов:echo "yum update-to $pkgs"
Итоговый пример
После выполнения вышеуказанного кода, вы получите готовую к запуску команду yum update-to
. Например, вывод может выглядеть следующим образом:
yum update-to dbus-1.10.24-13.el7_6 dbus-libs-1.10.24-13.el7_6 java-1.8.0-openjdk-1.8.0.242.b08-1.el7 java-1.8.0-openjdk-headless-1.8.0.242.b08-1.el7 tzdata-java-2019c-1.el7 unzip-6.0-21.el7
Заключение
Таким образом, данный подход позволяет удобно и быстро получить список пакетов, которые необходимо обновить, в формате, необходимом для безопасного применения команды yum update-to
. Стремясь избегать неясностей и недочетов, вы сможете гарантировать, что обновления на вашем сервере пройдут гладко и без неожиданных изменений.
Использование такого подхода упростит вам не только тестирование на тестовой среде, но и последующее применение обновлений в продакшене, обеспечивая, что все изменения будут предсказуемыми и воспроизводимыми.