在 Puppet 中声明数组元素之间的依赖关系

Declare dependency between array elements in Puppet

有没有什么方法可以用 Puppet 的语言声明数组中的包应该按照它们在数组中给出的顺序安装?

我想自动安装CUDA,需要安装nvidia-driver-latest-dkmscudacuda-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 不工作)。