概述
我刚刚开始使用 Puppet,但还未能发现一些问题。
问题
由于规范化,当我将两个类添加到具有相同依赖关系的包的节点时,它会失败。
简单来说,有重复的资源——在本例中是包libssl
。
注意:软件包被保留以防止安装最新的软件包。
问题
解决这个问题的最佳实践方法是什么?
class ssh {
package { 'openssh-server':
ensure => installed,
require => Package['libssl'],
}
package { 'libssl': ensure => installed, }
}
class apache {
package { 'apache':
ensure => installed,
require => Package['libssl'],
}
package { 'libssl': ensure => installed, }
}
node server {
include apache
include openssl-server
答案1
您有两个选择,它们看起来几乎一样。
1:使其成为自己的类。
class ssh {
package { 'openssh-server':
ensure => present,
require => Class['ssl'],
}
}
class ssl {
package { 'libssl': ensure => present, }
}
2:虚拟资源
class vpackages {
@package { 'libssl': }
}
class ssh {
include vpackages
package { 'openssh-server':
ensure => present,
require => Package['libssl'],
}
realize Package['libssl']
}
我发现将依赖关系分解到它们自己的模块中比使用虚拟资源更好。
答案2
如果您使用标准包管理来管理通过 Puppet 安装的包,那么您应该能够省略libssl
Puppet 中的包依赖关系,因为这将通过大多数系统上的包管理系统自动处理。
在 Debian/Ubuntu 以及 RedHat/CentOS/SuSE 系统上,包管理工具会查找依赖项,除非您特意停止默认行为,否则当 Puppet 告诉系统安装包时,将包含额外的依赖包(在您的情况下只需openssh-server
或apache
)
答案3
它有点丑陋,但有一个 defined() 函数可以返回 true/false。这样,您可以多次定义资源,但只能在第一次评估时“实现”它们。(使用 puppet 运行阶段!)
例如,
if defined(Package['libssl']) == false {
package { 'libssl':
ensure => installed,
}
}