Как я могу высушить этот класс кукол? - PullRequest
1 голос
/ 01 февраля 2012

У меня есть этот код, который немного отличается в зависимости от того, является ли узел машиной Debian:

class nginx::package {

  case $operatingsystem {
    'debian': {
      apt::preference { 'nginx':
        package => 'nginx nginx-common',
        priority => '600',
        release => 'a=squeeze-backports',
      }

      package { 'nginx':
        ensure => present,
        require => Apt::Preference['nginx'],
      }
    }
    default: {
      package { 'nginx':
        ensure => present,
      }
    }
  }

}

Похоже, должен быть способ уменьшить дублирование, но ничегодля меня очевидно.Мысли?

Ответы [ 2 ]

1 голос
/ 01 февраля 2012

Вы имеете в виду, как у вас есть пакет, указанный в два раза? Основной ответ заключается в том, что require на одном конце отношения совпадает с before на другом конце отношения. Это позволяет вам перенести спецификацию отношений на элемент, который должен находиться внутри условного выражения:

class nginx::package {
  case $operatingsystem {
    'debian': {
      apt::preference { 'nginx':
        package => 'nginx nginx-common',
        priority => '600',
        release => 'a=squeeze-backports',
        before => Package['nginx'];
      }
    }
    default: {} # nothing
  }
  package { 'nginx':
    ensure => present,
  }
}

Для получения дополнительной информации прочитайте документацию мета-параметра .

Другая альтернатива в более новых версиях puppet - использовать цепочка , например:

class nginx::package {
  case $operatingsystem {
    'debian': {
      apt::preference { 'nginx': ...}
      Apt::Preference['nginx'] -> Package['nginx']
    }
    default: {}
  }
  package { 'nginx': ... }
}

И, наконец, есть синтаксис Package['nginx'] { require => Apt::Preference['nginx'] }, который вы можете вызвать, чтобы добавить требование к Пакету, но я считаю, что это требует, чтобы вы делали это в унаследованном классе, что усложнит ситуацию в вашем примере, и теперь, когда есть доступная цепочка ресурсов более полезна для других вещей, чем до / после / подписка / уведомление об изменениях ресурсов.

class nginx::package::aptpreference inherits nginx::package {
  Package['nginx'] { require => Apt::Preference['nginx'] }
}
class nginx::package {
  case $operatingsystem {
    'debian': {
      apt::preference { 'nginx': ...}
      include nginx::package::aptpreference
    }
    default: {}
  }
  package {...}
}
0 голосов
/ 21 марта 2012

Вы можете использовать селектор для этого.

Я оставлю секцию apt :: preference нетронутой, потому что мне не нравятся операторы if и мне нравятся вместо них выражения case. Однако удалите упаковку, в которой он обрабатывается

Переместите пакет наружу и используйте селектор для обработки требуемого заказа.

package { foo:
  ensure => present,
  require => $::operatingsystem ? { 
    default => undef,
    debian => Apt::Preference[foo],
  },
}
...