2013-08-29 166 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"], 
} 

希望它有帮助。