在 Puppet 中声明数组元素之间的依赖关系
Declare dependency between array elements in Puppet
有没有什么方法可以用 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 doc quick link 不工作)。
有没有什么方法可以用 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 doc quick link 不工作)。