Только что начал использовать Puppet и использовал следующий массив с 'гарантировать', чтобы была установлена определенная версия Apache (а не последняя) и ее 'удерживаемая' (что означает, что она не будет обновлена на стандартной apt-get dist-upgrade
до последней версии.
При использовании приведенного ниже кода Puppet принимает во внимание только первое значение в массиве обеспечения. Поэтому, когда приведенный ниже код выполняется, он устанавливает правильную версию Apache, но пакет не настроен на удержание (проверяется запуском dpkg --get-selection
).
Если значения в массиве меняются местами, то пакет удерживается, но устанавливается последняя версия.
package { 'apache2':
ensure => [ "2.0.64", held ],
}
Цените любые указатели на это!
Спасибо.
Насколько я могу судить, читая исходный код, "удерживаемая" функция в корне ошибочна. Обеспечение (см. ensurable.do
, строка 50) не может принимать массив параметров. Таким образом, пакет не может быть одновременно установлен в одной версии. и отмечен с помощью dpkg. Я предполагаю, что поведение парсера по умолчанию таково, что если он получает массив, который не поддерживается, используется первое значение. Это объяснило бы ваш результат.
На мой взгляд, версия и / или поддерживаемые функции должны быть повторно реализованы как новая переменная, например:
package { 'apache2'
ensure => installed,
version => '2.0.64',
hold => true,
}
Предлагаю вам отправить отчет об ошибке. А пока вы могли:
package { 'apache2':
ensure => '2.0.64',
}
exec { 'hold-apache2-version':
command => 'dpkg ...',
require => Package['apache2'],
}
Я придумал обходной путь. Соберитесь, это мерзко.
if $::puppetversion == '2.7.11' {
$ensure_puppet = 'held'
} else {
$ensure_puppet = '2.7.11-1puppetlabs1'
}
package { ['puppet', 'puppet-common']:
ensure => $ensure_puppet
}
Он использует встроенный факт $::puppetversion
делать опрос версии. Таким образом, состояние пакета будет «удерживаться», если установленная версия не отличается от того, что мы хотим. Это должно позволить мне обновлять марионеточную инфраструктуру по своему желанию, не беспокоясь о том, что автоматические обновления сделают это за меня.
Это не отвечает на точный вопрос о блокировке версий Apache, но можно тривиально написать собственный факт, чтобы запросить у Apache его версию.
Сначала я пробовал использовать метод удержания dpkg вручную. Я использовал тип пакета для проверки версий, а затем запустил сценарий выполнения, чтобы убедиться, что он хранится отдельно. Это похоже на подход, который я использую с блокировкой версий yum.
define apt::hold() {
exec { "hold-${name}":
command => "/bin/echo '${name} hold' | /usr/bin/dpkg --set-selections",
unless => "/usr/bin/dpkg --get-selections ${name} | /bin/grep hold",
require => Package[$name]
}
}
package { ['puppet', 'puppet-common']:
ensure => '2.7.11-1puppetlabs1'
}
apt::hold { ['puppet', 'puppet-common']: }
Теперь это работает, но создает множество раздражающих уведомлений в журналах и отчетах. Тип пакета не может согласовать то, что пакет может удерживаться одновременно с определенной версией. Таким образом, он сообщит мне, что состояние пакета изменилось с «удерживается» на «2.7.11-1puppetlabs1».
[sanitized.server.name.net] out: info: Retrieving plugin
[sanitized.server.name.net] out: info: Loading facts in /var/lib/puppet/lib/facter/operatingsystemmajor.rb
[sanitized.server.name.net] out: info: Loading facts in /var/lib/puppet/lib/facter/datacenter.rb
[sanitized.server.name.net] out: info: Caching catalog for sanitized.server.name.net
[sanitized.server.name.net] out: info: Applying configuration version '1333727048'
[sanitized.server.name.net] out: notice: /Stage[main]/Puppet/Package[facter]/ensure: ensure changed 'held' to '1.6.6-1puppetlabs1'
[sanitized.server.name.net] out: notice: /Stage[main]/Puppet::Client/Package[puppet-common]/ensure: ensure changed 'held' to '2.7.11-1puppetlabs1'
[sanitized.server.name.net] out: notice: /Stage[main]/Puppet::Client/Package[puppet]/ensure: ensure changed 'held' to '2.7.11-1puppetlabs1'
[sanitized.server.name.net] out: notice: Finished catalog run in 6.25 seconds
Мне не нравятся мои отчеты о плачущем волке все время. Это также вызывает проблемы, если я хочу сделать что-то вроде:
package { ['puppet', 'puppet-common']:
ensure => '2.7.11-1puppetlabs1',
notify => Service['puppet']
}
Чтобы перезапустить службу после обновления. Я заканчиваю тем, что служба отбрасывается каждый раз, когда запускается марионетка.
Я согласен со всеми остальными, хотя это «удерживается», вероятно, должно быть отдельным атрибутом типа пакета.
я использую этот марионеточный модуль управлять apt в моих системах. Он предоставляет определение "preferences_snippet", которое можно использовать для привязки пакетов к определенным версиям или выпускам (см. README).