有没有什么方法可以用 Puppet 的语言声明数组中的包应该按照它们在数组中给出的顺序安装?
我想自动安装 CUDA,这需要 nvidia-driver-latest-dkms
、cuda
和 cuda-drivers
(在以 RHEL7 为例)按此顺序安装。我不想硬编码包数组,因为我需要支持不同的发行版,这需要不同的包。因此,一个包含通过 Hiera 提供的包的数组似乎是个好主意。
我的第一个解决方案是 ensure_packages($packages_parameter_filled_via_hiera)
,它最近停止工作(可能是由于 NVIDIA 包的更改)。问题似乎是此代码以随机顺序安装包,如果已经安装了任何其他包,则您无法安装 nvidia-driver-latest-dkms
(任何更多)。
我的下一个方法,
$packages.each | $package | {
ensure_packages($package)
}
有同样的问题
$packages.each | $package | {
package { "cuda-${package}":
name => $package
}
}
我正在寻找的是等同于循环实例之间的 ->
或 ~>
运算符的东西,或者一些“悬挂指针”构造这将使我能够访问之前的 $package
,这样我就可以在包资源中编写 require => Package[$magic_previous_instance]
。也就是说,我想创建等同于
package { 'cuda-epel-release':
name => 'epel-release'
}
-> package { 'cuda-nvidia-driver-latest-dkms':
name => 'nvidia-driver-latest-dkms'
}
-> package { 'cuda-cuda':
name => 'cuda'
}
-> package { 'cuda-cuda-drivers':
name => 'cuda-drivers'
}
(实际上有效,但完全适用于 RHEL 7)动态来自 Hiera 数据。
最佳答案
是的,这实际上可以通过“包装器”定义的资源类型实现:
define custom::install(Hash $pkg_hash) {
# iterates through the packages in the hash using their keys, and creates a package default where each requires the previous package
# index > 0 ensures the first package does not attempt to require a nonexistent previous package
keys($pkg_hash).each |Integer $index, String $pkg| { if $index > 0 { Package[keys($pkg_hash)[$index - 1]] -> Package[$pkg] } }
create_resources(package, $pkg_hash)
}
为了表扬应有的功劳,Henrik Lindberg 最初向我指出了这个方向,所以这不完全是我的创作。已定义资源类型的输入 Hash $pkg_hash
是一个包 hash
类型,类似于 create_resources
函数第二个参数的输入参数结构。例如:
$pkg_hash = {
'cuda-epel-release' => { ensure => installed },
'cuda-nvidia-driver-latest-dkms' => { ensure => installed }
}
或 Hiera 数据 YAML 格式:
pkg_hash:
'cuda-epel-release':
ensure: installed
'cuda-nvidia-driver-latest-dkms':
ensure: installed
然后是预期的custom::install($pkg_hash)
。
注意DRT中的create_resources
可以正常替换:
$pkg_hash.each |String $package, Hash $attributes| {
package { $package: *=> $attributes }
}
如documentation底部所述(Puppet 文档快速链接无效)。
关于puppet - 在 Puppet 中声明数组元素之间的依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70942825/