Как перечислить пакеты, нуждающиеся в обновлении, в формате для yum update-to

Вопрос или проблема

Как я могу получить список пакетов с ожидающими обновлениями на 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

  1. Получение списка обновлений: Сначала вам нужно получить список всех доступных обновлений через yum. Для этого выполните команду:

    yum -q list updates

    Опция -q означает "тихий режим", что поможет избежать лишнего вывода и сосредоточиться на результатах.

  2. Форматирование вывода: Полученный вывод нужно обработать, чтобы привести его к необходимому формату. Для этого мы будем использовать awk и sed.

  3. Сбор информации в переменную: Вы можете собрать информацию в переменную с помощью следующего скрипта:

    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" " ": Заменяет переводы строк на пробелы, чтобы получить одну строку.
  4. Формирование команды для обновления: Теперь вы можете вывести полную команду 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. Стремясь избегать неясностей и недочетов, вы сможете гарантировать, что обновления на вашем сервере пройдут гладко и без неожиданных изменений.

Использование такого подхода упростит вам не только тестирование на тестовой среде, но и последующее применение обновлений в продакшене, обеспечивая, что все изменения будут предсказуемыми и воспроизводимыми.

Оцените материал
Добавить комментарий

Капча загружается...