Назад | Перейти на главную страницу

Puppet: как соблюдать install_options of package (), если определенный пакет уже установлен

Если кто-то придумает более подходящее название для этого вопроса: пожалуйста, измените его соответствующим образом.

Окружающая среда:

Проблема:

Конкретный пакет уже установлен на узле, возьмем needrestart например:

# dpkg -l | grep needrestart
ii  needrestart                     1.2-8+deb8u1

Используя следующий код:

package{[
  'needrestart',
]:
  ensure          => installed, # latest won't work, either
  install_options => ['-t', 'jessie-backports']
}

Я ожидал этого needrestart переустанавливается / обновляется до версии вне jessie-backports. Однако этого не происходит, переустановки / обновления не происходит. В журналах (отладки) нет ничего стоящего по этому поводу.

Решение:

В случае, если это не предназначено: кто-нибудь знает умный способ обойти это?

Ваша проблема в том, что ваш install_options будет использоваться, только если ресурс пакета фактически установка ваши пакеты. У вас есть несколько вариантов:

  • Использовать ensure => latest и надеяться на обновление пакета (или запускать его самостоятельно) - вероятно, не то, что вы хотите.
  • Обновление до Puppet 4.x. Начиная с версии 4, Puppet имеет переустановить_on_refresh, что позволяет переустановить на notify событие, если провайдер поддерживает reinstallable. Хотя это работает в Debian, эта опция, вероятно, вам не подходит.
  • Обманывать Puppet, заставляя думать, что пакет удален - для этого потребуется патч марионетки в вашей локальной установке, а не рекомендуется.
  • Патч Puppet с возможностью переустановки: В этот отчет об ошибке несколько лет назад Аггелос Экономопулос поставлял патч для какой-то версии марионетки, которая выглядит довольно просто. Это должно вас начать. Однако я не рекомендую исправлять установки марионеточного агента.
  • Переустановите его самостоятельно: вероятно, единственный вариант, который у вас есть на данный момент: напишите что-нибудь в этом роде:

    exec { "apt-get reinstall $package $your_options":
        user   => 'root',
        onlyif => 'dpkg -s $package| grep 'Version $your_version'
    }
    

    В зависимости от различий пакетов с опциями и без, это может быть сколь угодно сложно. Если затронуты только несколько пакетов, им можно будет управлять.

  • Напишите своего провайдера и добавьте его в package, или установите что-то вроде package_reinstall: Он на удивление прост, им можно управлять и управлять версиями через модуль, и он работает без обновления Puppet. Я предлагаю начать с поставщик / пакет / apt.rb. В конце концов, это может быть вашим лучшим вариантом.

Вам нужно будет запустить действие установки для install_options вступить в силу. Возможный обходной путь - сначала ensure => absent, а затем после удаления пакета вы можете ensure => present или ensure => 1.2-8+deb8u1 и последующая установка выполнит install_options.

Я считаю ensure => installed только убедитесь, что он установлен, но он не будет обновляться, если будет более новая версия. Использовать latest сделать это. Он также будет обновляться только при наличии более новой версии. Если это предпочтительная версия, которая старше установленной в настоящее время версии, вам нужно будет найти способ ее обойти. Возможно exec это проверит, отличается ли текущая установленная версия от версии в этом другом репо, затем удалите, если это так, и пусть ресурс пакета установит правильную версию после.

я использую APT pinning довольно широко, и я считаю, что это (одно из) самых чистых решений, особенно в сочетании с unattended upgrades и / или обычный apt-get dist-upgrade.