Решение в Puppet на основе версии установленного пакета

Я хотел бы сделать что-то подобное в файле Puppet .erb:

<% if (version_of_apache_package_installed =~ /1.5.82/) then -%>
do one thing
<% else -%>
do a different thing 
<% end -%>

Как поместить строку версии какого-либо установленного пакета в переменную version_of_apache_package_installed, чтобы я мог заставить работать вышеописанное?


person rlandster    schedule 11.02.2013    source источник


Ответы (2)


Вы управляете этим ресурсом пакета apache в puppet? Если это так, вы можете указать версию для установки, поэтому вы просто читаете ту же переменную версии в ресурсе пакета и в этом блоке if/else.

В одном из ваших файлов инициализации...

$package_version = '1.0'

в узлах...

package { 'your_package':
  ensure => $package_version,
}

Это правильный способ думать в марионетке: «сделайте эту машину такой, какой я ожидаю», а не «мне нужно справиться с тем, чем эта машина является».

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

person Kyle Campos    schedule 12.02.2013

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