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

标签 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 文档快速链接无效)。

关于puppet - 在 Puppet 中声明数组元素之间的依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70942825/

相关文章:

list 中的 Puppet Hiera 查找不起作用

puppet "Error 400 on SERVER : Could not find class"

hadoop - 如何 ?使用 ambari 自动安装 hdp 以进行夜间构建 (CI)

ruby - 为什么 bundler 使用多个 gem 位置?

node.js - Vagrant、Puppet 和 nodejs 模块 : throwing error on npm module installation

puppet 应用错误 : Could not find default node or by name with 'uys0115' on node uys0115

automation - 如何从互联网上的 Puppet Master 管理内部网络中的 Puppet 代理节点?

puppet: "applying configuration version ",它指的是什么?

linux - Debian 6 (Squeeze) 上的 Puppet 已过时

mysql - 如何使用 Puppet 更新 MySQL 表?