我有 CentOS、5.8、5.7、6.1、6.3、4.7 Ubuntu、Debian 等服务器。我希望所有服务器上都安装 nrpe。我面临的问题是,当我编写 puppet 代码来确保 packe nrpe 时,它在 Centos 6+ 上运行良好,但当它在 centos 5.8 上运行时,那里的软件包名称是 nrpe-nagio,而不是 nrpe。我尝试以这种方式执行此操作,但无法执行所需的检查。
package { "nrpe":
ensure => "installed",
name => $operatingsystem ? {
Ubuntu => "nagios-nrpe-server",
CentOS => "nrpe",
{
/^5/: {
package { "nagios-nrpe":
ensure => "installed", }
}
}
Debian => "nagios-nrpe-server",
}
}
我怎样才能对我所需要的进行嵌套检查?
谢谢
答案1
内联、嵌套的 case 语句是一种不好的做法,Puppet 不鼓励使用这种方法(请参阅Puppet Lint 文档)。
更好的方法是这样的(我猜测是$::lsbdistrelease
因为我手头没有 RH 系统 - 你应该运行facter
来确定给你主要版本的正确事实)。
$nrpe_package = $::osfamily ? {
'Debian' => 'nagios-nrpe-server'
'RedHat' => $::lsbdistrelease ? {
'5' => 'nagios-nrpe',
default => 'nrpe',
}
default => 'nrpe',
}
package { 'nrpe':
ensure => installed,
name => $nrpe_package,
}
解释(适当之处请链接到 Puppet Lint):
- 在包定义之外设置变量
- 包括两个 case 语句的默认值
- 在顶级命名空间中添加前缀
::
- 对于不包含变量的字符串,请使用单引号
- 适当使用分层/嵌套案例
答案2
您可以使用 facter 和一些 if/else 条件来告诉 Puppet 您想要将哪个类应用于每个版本的 CentOS。
例子 :http://docs.puppetlabs.com/learning/variables.html#case
(只需使用您的操作系统版本,而不是所提供示例中的操作系统)。