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

4
有没有办法在Puppet的语言中声明,按照数组中给出的顺序安装软件包?
我想自动安装CUDA,需要按照特定的顺序安装、和(以RHEL7为例)。 我不想硬编码软件包数组,因为我需要支持不同的发行版,它们需要不同的软件包。 因此,通过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数据中获取。

1个回答

2

是的,这实际上可以通过定义“包装器”资源类型来实现:

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 }
}

根据文档底部的描述(Puppet文档快速链接不起作用),如下所示:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接