Если кто-то придумает более подходящее название для этого вопроса: пожалуйста, измените его соответствующим образом.
Окружающая среда:
Проблема:
Конкретный пакет уже установлен на узле, возьмем 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
и надеяться на обновление пакета (или запускать его самостоятельно) - вероятно, не то, что вы хотите.notify
событие, если провайдер поддерживает reinstallable
. Хотя это работает в Debian, эта опция, вероятно, вам не подходит.Переустановите его самостоятельно: вероятно, единственный вариант, который у вас есть на данный момент: напишите что-нибудь в этом роде:
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
.