2012-01-31 55 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], 
    }, 
}