Как убедиться, что устаревшие пакеты Docker удалены перед установкой новых пакетов? - PullRequest
0 голосов
/ 30 октября 2018

У нас есть несколько старых серверов с устаревшим пакетом Docker, установленным из репозитория дистрибутива. Либо из ручной установки

$ yum install docker

или более старые манифесты

package { 'docker': 
    ensure => present,
}

Мы хотим перейти на официальный репозиторий Docker и пакеты через «поддерживаемый» модуль puppetlabs-docker .

include docker

Однако устаревшие пакеты Docker не удаляются и не управляются этим новым модулем иным образом!

[vagrant@localhost ~]$ sudo -i puppet apply -e 'include docker'
Notice: Compiled catalog for localhost.localdomain in environment production in 0.42 seconds
Notice: /Stage[main]/Docker::Repos/Yumrepo[docker]/ensure: created
Error: Execution of '/bin/yum -d 0 -e 0 -y install docker-ce' returned 1: Error: docker-ce conflicts with 2:docker-1.13.1-75.git8633870.el7.centos.x86_64
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest
Error: /Stage[main]/Docker::Install/Package[docker]/ensure: change from 'purged' to 'present' failed: Execution of '/bin/yum -d 0 -e 0 -y install docker-ce' returned 1: Error: docker-ce conflicts with 2:docker-1.13.1-75.git8633870.el7.centos.x86_64
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

Как мы можем убедиться, что устаревший пакет удален до установки нового пакета?

1 Ответ

0 голосов
/ 30 октября 2018

Вы хотите начать с проверки отсутствия устаревшего пакета.

package { 'docker':
    ensure => absent,
}

Но вы не можете использовать Package['docker'], потому что новый модуль puppetlabs-docker уже объявляет об этом. Вы должны сделать что-то вроде этого:

package { 'legacy-docker':
    ensure => absent,
    name => 'docker',
}

Существует ряд устаревших обязательных пакетов , которые также необходимо удалить.

package { [
    'docker-client',
    'docker-client-latest',
    'docker-common',
    'docker-latest',
    'docker-latest-logrotate',
    'docker-logrotate',
    'docker-selinux',
    'docker-engine-selinux',
    'docker-engine',
]:
    ensure => absent,
}

Итак, все вместе, этот порядок, кажется, работает неявно.

package { 'legacy-docker':
    ensure => absent,
    name => 'docker',
}

package { [
    'docker-client',
    'docker-client-latest',
    'docker-common',
    'docker-latest',
    'docker-latest-logrotate',
    'docker-logrotate',
    'docker-selinux',
    'docker-engine-selinux',
    'docker-engine',
]:
    ensure => absent,
}

include docker

На самом деле, это, кажется, вызывает проблемы при последующих запусках манифеста ... общие зависимости второго уровня удалены!

Error: Execution of '/bin/rpm -e container-selinux-2.68-1.el7.noarch' returned 1: error: Failed dependencies:
        container-selinux >= 2.9 is needed by (installed) docker-ce-18.06.1.ce-3.el7.x86_64
Error: /Stage[main]/Profile::Docker/Package[docker-selinux]/ensure: change from '2:2.68-1.el7' to 'absent' failed: Execution of '/bin/rpm -e container-selinux-2.68-1.el7.noarch' returned 1: error: Failed dependencies:
        container-selinux >= 2.9 is needed by (installed) docker-ce-18.06.1.ce-3.el7.x86_64
Error: Execution of '/bin/rpm -e container-selinux-2.68-1.el7.noarch' returned 1: error: Failed dependencies:
        container-selinux >= 2.9 is needed by (installed) docker-ce-18.06.1.ce-3.el7.x86_64
Error: /Stage[main]/Profile::Docker/Package[docker-engine-selinux]/ensure: change from '2:2.68-1.el7' to 'absent' failed: Execution of '/bin/rpm -e container-selinux-2.68-1.el7.noarch' returned 1: error: Failed dependencies:
        container-selinux >= 2.9 is needed by (installed) docker-ce-18.06.1.ce-3.el7.x86_64

Что ж, ресурс пакета не имеет свойства refreshonly, поэтому нам нужно прибегнуть к ресурсу exec. Тьфу.

package { 'legacy-docker':
    ensure => absent,
    name => 'docker',
    notify => Exec['autoremove'],
}

exec { 'autoremove':
    command => '/usr/bin/yum -y autoremove',
    refreshonly => true,
}

include docker

Это ... разумно? Единственное, что может быть упорядочением, вы можете изучить явное упорядочение ресурсов, используя ->.

...