2012-01-31 2 views
1

У меня этот код, делает немного другое действие в зависимости от того, или нет, узел является машина 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, 
     } 
    } 
    } 

} 

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

ответ

1

Вы имеете в виду, как у вас есть пакет, указанный дважды? Основной ответ заключается в том, что 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 metaparameter docs для получения дополнительной информации.

Другая альтернатива с более новыми версиями кукольный является использование chaining как:

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

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

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

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

package { foo: 
    ensure => present, 
    require => $::operatingsystem ? { 
    default => undef, 
    debian => Apt::Preference[foo], 
    }, 
} 
Смежные вопросы