0

我正在通过我的服务器上的 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 的版本。

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

有木偶的方法来解决我的问题吗?

4

2 回答 2

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}" }
}
于 2013-08-29T16:15:17.790 回答
1

我不确定我是否理解您的所有问题。在任何情况下,都可以使用 puppetpackage类型来确保特定版本并用于$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"],
}

希望能帮助到你。

于 2013-08-29T16:35:11.240 回答