2013-08-29 200 views
0

我在我的服務器上通過puppet配置syslog-ng。配置文件在版本2.x,3.1和3.3之間非常不同。在我的主機上,根據操作系統(centos5,centos6,debian 7,ubuntu),可用的syslog-ng版本會有所不同。預測軟件包版本

我有2個想法syslog-ng的的配置適應的正確版本:

  • 自定義的事實:它很容易編寫自定義的事實,以測試syslog-ng的安裝版本。但是,如果syslog-ng尚未安裝,這個事實將毫無用處。
  • 清單中的條件:我發現在清單中定義一個「case」有點難看,它將決定操作系統提供的syslog-ng的版本。

對我來說,最簡單的方法是在安裝前測試哪個版本的軟件包可以通過操作系統使用。 一個因素可以做到這一點,但我想這會有點困難。

有沒有一種傀儡方式來解決我的問題?

回答

1

確實有傀儡方式來解決這個問題!

您可以結合$::osfamily$::operatingsystemrelease做這樣的事情在你的清單:

case $::osfamily { 
    'CentOS': { 
    case $::operatingsystemrelease { 
     /^6/: { include syslog-ng::centos6 } 
     /^5/: { include syslog-ng::centos5 } 
     default: { notice("This operating system release for CentOs '${::operatingsystemrelease}' is not supported.") 
    } 
    } 
    default: { notice "Unsupported osfamily ${::osfamily}" } 
} 
+0

擁有每個案例的子類似乎乾淨。雖然你必須事先知道哪些發行版本的軟件包的版本,並且我希望避免這些知識。 – skizo

1

我不知道我理解你所有的問題。無論如何,人們可以使用傀儡package類型來確保特定版本,並使用$lsbdistdescription來獲取操作系統名稱。例如:

package { 'syslog-ng' : 
    ensure => $::lsbdistdescription { 
    '/CentOS 7/': => "3.2", 
    '/CentOS 6/': => "3.1", 
    '/(Debian|Ubuntu)/' => "2.x", 
    default => "latest", 
    }, 
} 

注:在上面的一個具有獲取OS的確切名稱,即從CentOS 7 or CentOS 6 or Ubuntu每個OS。您可以通過在OS上執行facter --puppet | grep lsbdistdescription來完成此操作。我沒有多種機器,所以我無法確切地檢查它。

然後配置文件可以只是一個來源於模板。該模板將根據操作系統而有所不同。

file { 'file.cfg' : 
    ensure => "present", 
    content => template("modulename/file.erb"), 
    require => Package["syslog-ng"], 
} 

希望它有幫助。