Puppet — это декларативный язык, который гарантирует, что какой-либо ресурс (в данном случае пакет) находится в требуемом состоянии. На каждой поддерживаемой платформе могут быть разные менеджеры пакетов, соответствующие различным соглашениям. В конце концов, некоторый код может выполняться при изменении состояния пакета, например:
<!-- language: puppet -->
package { "apache2":
ensure => installed,
notify => Exec['apache-updated']
}
exec { 'apache-updated'
command => "/usr/bin/execute_some_script",
refreshonly => true,
}
Согласно документации существует несколько специальных значений для атрибута ensure
:
installed
absent
- конкретная версия, включая версию исправления, например.
3.4.12-2
или 1:9.10.3.dfsg.P4-12.3+deb9u5
- и т.п.
Вы можете получить текущий список установленных пакетов из CLI, используя:
puppet resource package
Мотивация, стоящая за этим, в основном производительность. Проверка версии пакета выполняется относительно быстро, а выполнение пользовательского скрипта продлит puppet agent
время выполнения.
Лучший способ принимать решения на основе версии пакета — создать пользовательский факт в каком-нибудь модуле lib/facter/apache_version.rb
:
<!-- language: ruby -->
Facter.add(:apache_version) do
setcode do
if Facter::Util::Resolution.which('apache2')
Facter::Util::Resolution.exec('apache2 -v | head -n 1 | awk '{ print $3}' | cut -d "/" -f 2')
end
end
end
Таким образом, особенности управления версиями должны обрабатываться для всех поддерживаемых ОС. Затем вы можете написать в своем коде:
<!-- language: puppet -->
case $::apache_version {
undef: {
# during first run the version will be undefined, as the package is hasn't been installed yet
}
/^2/: {
# TODO
}
default: {
# TODO
}
}
Если вам нужно сравнить версию, используйте функцию stdlib versioncmp
:
if versioncmp($::apache_version, '2.0.0') < 0 {
fail("foobar requires Apache 2.0 or greater, found: \'${::apache_version}\'")
}
person
Tombart
schedule
21.11.2016