Кукольный - использование обеспечения с пакетом "версия" и "проведено"
Обзор:
Только что начал использовать Puppet и использовал следующий массив с "обеспечить", чтобы была установлена конкретная версия Apache (а не последняя версия) и она "удерживалась" (что означает, что она не будет обновлена по стандарту apt-get dist-upgrade
до последней версии.
Проблема:
При использовании приведенного ниже кода Puppet учитывает только первое значение в массиве обеспечения. Поэтому, когда приведенный ниже код выполняется, он устанавливает правильную версию Apache, но пакет не настроен на удержание (проверяется запуском dpkg --get-selection
).
Если значения в массиве меняются местами, то пакет удерживается, но устанавливается последняя версия.
Код:
package { 'apache2':
ensure => [ "2.0.64", held ],
}
Цените любые указатели на этом!
Благодарю.
3 ответа
Насколько я могу судить, читая исходный код, функция "удерживаемости" в корне ошибочна. Обеспечение (см. 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).