Назад | Перейти на главную страницу

Почему Puppet может потребовать каждый пакет только один раз?

При определении зависимостей в классе каждый Package можно глобально определить только один раз. У меня есть иерархия конфигурации, и некоторые пакеты должны быть установлены на всех машинах (это относится к конфигурации по умолчанию), но другие должны быть установлены только на некоторых категориях машин. Как я должен проверять, находится ли этот пакет уже на машине, когда угроза Puppet представляет собой повторяющееся объявление?

  Duplicate declaration: Package[wget] is already declared 

я должен использовать такую ​​функцию?

  if defined( Package[$package] ) {
    debug("$package already installed")
  } else {
    package { $package: ensure => $ensure }
  }

Я ожидал, что инструмент настройки решит эту проблему по умолчанию ... Я что-то упускаю?

Вы можете использовать sure_resource () из модуль stdlib:

$packages = $::osfamily ? {
    'Debian' => [ 'fcgiwrap', ],
    'RedHat' => [ 'spawn-fcgi', 'git' ],
}
ensure_resource('package', $packages, {'ensure' => 'present'})

Так, скажем, если git уже установлен каким-то другим классом, это будет пропущено. Вам не следует заботиться об определении пакета только один раз в конфигурации марионетки.

Если у вас есть повторяющиеся пакеты, это один из способов борьбы с этим. Другой способ - в первую очередь избежать проблемы с помощью виртуальных ресурсов:

Объявление виртуального ресурса

class packages {
  @package {
    ['cryptsetup-bin',
     'cryptsetup',
     'cifs-utils',
     'e2fsprogs',
     'libmysql-ruby',
     'parted',
     'pigz',
      'sshfs' ]:
        ensure => present,
    }
}

Реализация виртуального ресурса (можно реализовать ресурсы несколько раз):

include packages
realize Package['pigz']

Другой подход - выделить дублированный код в другой класс, то есть в класс wget.

Марионетка Док: http://docs.puppetlabs.com/guides/virtual_resources.html