预测包版本

时间:2013-08-29 06:34:51

标签: puppet

我正在通过我的服务器上的puppet配置syslog-ng。版本2.x,3.1和3.3之间的配置文件非常不同。在我的主机上,根据操作系统(centos5,centos6,debian 7,ubuntu),可用的syslog-ng版本会有所不同。

我有2个想法让syslog-ng的配置适应正确的版本:

  • 自定义事实:编写自定义事实以测试已安装的syslog-ng版本很容易。但是,如果尚未安装syslog-ng,这个事实将毫无用处。
  • 清单中的条件:我发现在清单中定义一个“案例”有点难看,它会决定操作系统提供的syslog-ng的版本。

对我来说,最简单的方法是在安装之前通过操作系统测试哪个版本的软件包可用。 一个因素可以做到这一点,但我想这会有点困难。

有没有一种解决我问题的方法?

2 个答案:

答案 0 :(得分: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}" }
}

答案 1 :(得分:1)

我不确定我是否理解你的所有问题。在任何情况下,都可以使用puppet package类型来确保特定版本并使用$lsbdistdescription来获取操作系统名称。例如:

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

注意:在上面,必须得到操作系统的确切名称,即每个操作系统的CentOS 7 or CentOS 6 or Ubuntu。您可以通过在操作系统上执行facter --puppet | grep lsbdistdescription来实现。我没有各种各样的机器,所以我无法确切地检查。

然后配置文件可以只是一个来自模板的文件。模板将根据操作系统而有所不同。

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

希望它有所帮助。