概述
我刚开始使用 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
Run Code Online (Sandbox Code Playgroud)
您有两个看起来几乎相同的选择。
1:让它成为自己的类。
class ssh {
package { 'openssh-server':
ensure => present,
require => Class['ssl'],
}
}
class ssl {
package { 'libssl': ensure => present, }
}
Run Code Online (Sandbox Code Playgroud)
2:虚拟资源
class vpackages {
@package { 'libssl': }
}
class ssh {
include vpackages
package { 'openssh-server':
ensure => present,
require => Package['libssl'],
}
realize Package['libssl']
}
Run Code Online (Sandbox Code Playgroud)
我发现将依赖项分解为它们自己的模块而不是使用虚拟资源更好。
如果您使用标准包管理来管理通过 Puppet 安装的包,那么您应该能够放弃libssl
Puppet 中的包依赖项,因为大多数系统上的包管理系统都会自动处理这些依赖项。
在 Debian/Ubuntu 以及 RedHat/CentOS/SuSE 系统上,包管理工具将查找依赖项,除非您竭尽全力阻止默认行为,否则当 Puppet 告诉系统安装时,将包含其他依赖包包裹(在您的情况下简单openssh-server
或apache
)