Puppet - 在迭代哈希时,如果 hiera 中不存在,则在清单中设置默认值

2024-04-30

我正在迭代 hiera 哈希中的许多条目,并希望通过在清单中设置默认值(例如ensure, groups, managehome等),并且如果 hiera 中存在重复的键/值对,则覆盖默认值。

到目前为止,我尝试过的所有方法都无法获得默认值。我知道我需要声明资源,但不确定。

我尝试在查找和其他方法中设置“default_values_hash”,但似乎没有任何内容将默认值传递到迭代和 --debug 输出中

这是我的清单和 hiera 数据的(伪)示例。真诚感谢任何指导。谢谢。

class test (
  Hash $testhash = lookup('test::hash', "merge" => 'hash'}),
){

  $testhash.each |$key, $value| {
    user { $key :
      ensure     => $value['ensure'],
      name       => $value['name'],
      password   => $value['password'],
      groups     => $value['groups'],
      managehome => $value['managehome'],
    }
  }
}
include class test

在希拉:

test::hash:

'fred':
  name:         fred
  password:     somepassword
  groups:       wheel
  managehome:   true

'mary':
  name:         mary
  password:     otherpassword

'john':
  name:         john
  password:     anotherpassword

'harry':

在清单中设置资源默认值(大写User)不会传递到迭代中,但如果我将所有数据保留在清单中(数据太多,无法执行此操作),则会传递到迭代中。


The lookup函数使您能够为哈希本身建立默认值,但不能真正为哈希内的键和值建立默认值。此外,使用lookup在 Puppet 中作为类参数值的函数将被自动参数绑定取代。换句话说,你的lookup在此上下文中,函数不执行任何操作,因为 Puppet 更喜欢自动参数绑定,而您正在使用这些参数(这对于lookup与您正在使用的 Hiera 5 结合使用)。我个人觉得这种行为很烦人,但事实就是如此。编辑:别介意具体的推理;该参数被称为$testhash并不是$hash。如果该参数来自模块数据,那么lookup仍然会被忽略,因为 Puppet 只允许模块数据的自动参数绑定。

我很惊讶资源默认值在这里不适合您。我必须相信这要么是无意的,要么是当你走那条路时对他们实施了错误。

无论如何,这里有一个有保证的方法。首先,我们实现每个表达式的默认属性:https://puppet.com/docs/puppet/5.3/lang_resources_advanced.html#per-expression-default-attributes https://puppet.com/docs/puppet/5.3/lang_resources_advanced.html#per-expression-default-attributes

class test (
  Hash $testhash = lookup('test::hash', "merge" => 'hash'}),
){

  $testhash.each |String $key, Hash $value| {
    user { 
      default:
        ensure     => present,
        name       => 'username',
        password   => 'userpassword',
        groups     => ['usergroups'],
        managehome => false,
      ;
      $key:
        ensure     => $value['ensure'],
        name       => $value['name'],
        password   => $value['password'],
        groups     => $value['groups'],
        managehome => $value['managehome'],
      ;
    }
  }
}

但这里仍然存在一个问题,即您正在为所有迭代的第二个块中的属性建立值。如果这些键值对未定义,Puppet 将出错,而不是默认为另一个值。我们需要指示 Puppet 仅在您首先为属性定义了值的情况下才为属性建立值。值得庆幸的是,我们可以用*属性:https://puppet.com/docs/puppet/5.3/lang_resources_advanced.html#setting-attributes-from-a-hash https://puppet.com/docs/puppet/5.3/lang_resources_advanced.html#setting-attributes-from-a-hash

class test (
  Hash $testhash = lookup('test::hash', "merge" => 'hash'}),
){

  $testhash.each |String $key, Hash $value| {
    user { 
      default:
        ensure     => present,
        name       => 'username',
        password   => 'userpassword',
        groups     => ['usergroups'],
        managehome => false,
      ;
      $key:
        * => $value,
      ;
    }
  }
}

这里的一项建议是让你的 lambda 迭代器变量$key, $value命名更透明一些。另一个注意事项是警告*属性要起作用,您的哈希键必须与 Puppet 属性名称匹配。

更新的问题:在哈希有一个带有 a 的键的情况下nilvalue,您可以在 lambda 迭代器参数中设置一个空哈希作为键值的默认值。空哈希将替换undef(木偶nil) 为了$value在那次迭代期间。这将确保没有属性和值包含在*操作员并以所有默认值为准。

class test (
  Hash $testhash = lookup('test::hash', "merge" => 'hash'}),
){

  $testhash.each |String $key, Hash $value = {}| {
    user { 
      default:
        ensure     => present,
        name       => 'username',
        password   => 'userpassword',
        groups     => ['usergroups'],
        managehome => false,
      ;
      $key:
        * => $value,
      ;
    }
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Puppet - 在迭代哈希时,如果 hiera 中不存在,则在清单中设置默认值 的相关文章

  • 如何用Vagrant处理Mysql、网站源等数据?

    如何使用 Vagrant 处理 Mysql 网站源等数据 作为一名程序员 我喜欢能够轻松设置开发环境 因此 我创建了一个流浪盒子并为其配置了木偶 但我问自己 盒子中的数据怎么样 如果我需要销毁盒子并重新创建它会怎样 我的所有数据都将被删除
  • 返回总和的 Lisp 函数

    我正在尝试编写一个奇怪的函数 所以请耐心等待 这个函数应该有一个列表L作为参数并有一个sum多变的 如果L不是列表 它应该返回nil 否则 它应该迭代列表的每个元素并执行以下操作 如果元素是数字且小于零 则应从总和中减去 1 如果元素是数字
  • 将此递归函数转换为迭代函数

    如何将这个递归函数转换为迭代函数 include
  • 是否有任何众所周知的迭代枚举值的范例?

    我有一些 C 代码 其中声明了以下枚举 enum Some Some Alpha 0 Some Beta Some Gamma Some Total int array Some Total Alpha Beta 和 Gamma 的值是连续
  • 我可以在 MSBuild 文件中执行循环吗?

    目前 我让他遵循以下代码MSBuild项目文件 这真的很简单 定义4变量并为每个变量调用一次我的 MSBuild 任务 求代码
  • 给定 Map 的不同 Collection 视图上的迭代顺序是否保证一致?

    对于给定类型Map 是否可以保证迭代返回的 Collection 视图keySet values and entries方法以相同的顺序迭代 背景 我想知道是否要转型 public static void doSomethingForEac
  • R:传递函数参数以覆盖内部函数的默认值

    在 R 中 我想做这样的事情 我有一个函数 f1 它有一个带有默认值的参数 k 3 f1 function x k 3 u x 2 k u 然后我定义了第二个函数 f2 来调用 f1 f2 function z s s f1 z 允许 f2
  • 从交替的一侧循环列表

    给定一个列表 a 0 1 2 3 4 5 6 7 8 9 我怎样才能得到 b 0 9 1 8 2 7 3 6 4 5 也就是说 产生一个新列表 其中每个连续元素交替地从原始列表的两侧取出 gt gt gt a i 2 if i 2 else
  • 获得矩阵和给定数组中每个点的点积的最快方法

    我有一个由 N 个点组成的 Nx3 数组 每个点都有 X Y 和 Z 坐标 我需要旋转每个点 所以我有 3x3 的旋转矩阵 为此 我需要获得旋转矩阵和每个点的点积 问题是点数组非常庞大 1 000 000x3 因此需要花费大量时间来计算旋转
  • 列表或元组的成对遍历

    a 5 66 7 8 9 是否可以进行迭代而不是这样写 a 1 a 0 a 2 a 1 a 3 a 2 a 4 a 3 谢谢你 用起来没问题range 然而 编程 如数学 是建立在抽象之上的 连续对 x0 x1 x1 x2 xn 2 xn
  • 如何在 R 中迭代生成组合? [复制]

    这个问题在这里已经有答案了 所以我目前正在使用以下代码来生成我的组合 组合 x y 但问题是函数存储了所有可能的组合 我不想存储它们 我只想通过循环或其他方式生成它们 这对我的程序来说会更有效率 有没有办法通过 for 循环生成组合而不是全
  • Ruby 数组each_slice_with_index?

    如果我有arr 1 2 3 4 我知道我可以做以下事情 gt arr each slice 2 a b puts a b 1 2 3 4 和 gt arr each with index x i puts i x 0 1 1 2 2 3 3
  • 使用 const shared_ptr<> 的基于范围的 for 循环

    我有一个容器shared ptr lt gt 例如Avector
  • 同时迭代两个数组

    我是斯威夫特的新手 我一直在做Java编程 我有一个需要用 Swift 编写的场景 以下代码是 Java 代码 我需要在 Swift 中为以下场景编写代码 With String array strArr1 String strArr1 S
  • 嵌套列表的非递归遍历——在Python中构建类似的嵌套列表

    我需要遍历一个嵌套列表 处理每个非列表项str 并返回保持结构的类似列表 使用递归 这会相当容易 但我需要以这种迭代的方式进行 下面是我的尝试while loop def myiter e a e initial list c final
  • 使用 Vagrant,为什么 puppet 配置比自定义打包盒更好?

    我正在创建一个虚拟机来模仿我们的生产 Web 服务器 以便我可以与新开发人员共享它 让他们尽快上手 我已经阅读过 Vagrant 文档 但是我不明白使用通用基础盒并使用 Puppet 配置所有内容与打包已安装和配置所有内容的自定义盒相比有何
  • 在Python中从列表中获取n个项目组的惯用方法? [复制]

    这个问题在这里已经有答案了 给定一个列表 A 1 2 3 4 5 6 是否有任何惯用的 Pythonic 方式来迭代它 就好像它是 B 1 2 3 4 5 6 除了索引之外 这感觉像是 C 的遗留物 for a1 a2 in A i A i
  • 迭代 div 内的输入

    我试图通过 jQuery 迭代放置在特定 div 上的所有输入 但没有响应 我无法使用警报查看输入的值 我究竟做错了什么
  • 在 ec2 上托管 Rails

    我想将 Rails 部署到亚马逊 ec2 上 我看过 poolparty 和 ec2onrails 但似乎都不再维护了 人们用什么来做到这一点 都是自制的木偶和卡皮斯特拉诺 还是有一个项目可以让我继续下去 我可以推荐两个项目 如果您有一个
  • 迭代列表的奇怪速度差异

    我创建了两个重复两个不同值的长列表 在第一个列表中 值交替出现 在第二个列表中 一个值出现在另一个值之前 a1 object object 10 6 a2 a1 2 a1 1 2 然后我迭代它们 不对它们执行任何操作 for in a1 p

随机推荐

  • Three.js 光线投射器可以与组相交吗?

    我想知道我的光线投射器是否正在查看我已加载的 OBJ 由于从 Cinema4D 导出的方式 我相信 OBJ 是一个具有 3 个子级的 THREE Group 而不是 THREE Object 我可以更改我的 raycaster 代码行来查找
  • 发送同一条短信两次

    我正在尝试制作一个短信Android应用程序 但我收到了一个我以前从未见过的错误 即使在谷歌中我也没有找到类似的东西 所以 如果你能帮助我 我会很高兴 由于某种原因 程序同时发送两条消息 同一条短信 但这只是发生在生产中 当我使用模拟器时
  • Android Studio 无法下载并附加某些库的源代码

    就我而言 是这样的源代码是这样的 https i stack imgur com Xuo0X png 然后 我单击 下载源 但看到此错误 error https i stack imgur com 26R68 png java util N
  • 当 max-height 固定时 CSS 自动列计数

    我希望实现一个布局 其中一个元素 在我的例子中是一个 ul 当高度达到一定限制时扩展到 2 或更多 列 例如 如果高度仅够容纳 3 个项目 而我有 5 个项目 则第 4 和第 5 个项目将转到第二列 该列仅在需要时创建 我尝试通过设置来做到
  • VS Code Python autopep8 不支持 2 个空格悬挂缩进

    我正在尝试让 autopep8 正常工作 以 2 个空格而不是 4 个空格正确缩进 Python 代码 我正在使用带有 Python 扩展的 VS Code 该扩展使用 autopep8 进行格式化 我发现here https stacko
  • 如何在 Laravel 中基于迁移文件制作模型

    我已经创建了一个迁移 我想根据迁移文件制作一个模型 这可能吗 如果是这样 该怎么办 这是不可能的 到目前为止 您最多可以通过运行以下命令同时创建迁移和模型 php artisan make model ModelName m
  • Python 3D 插值加速

    我有以下用于插入 3D 体积数据的代码 Y X Z np shape volume xs np arange 0 X ys np arange 0 Y zs np arange 0 Z points list zip np ravel re
  • PHP 警告:在 php 7.3 中使用 password_hash() 时使用未定义的常量 PASSWORD_ARGON2ID

    我最近通过 Plesk 的 Web GUI 安装了 PHP 7 3 6 用于 Web 应用程序的开发副本 因为我打算将生产环境从 php 7 0 更新到 7 3 我决定借此机会将密码哈希从 PBKDF2 升级到 Argon2ID 因为 PH
  • Swift 3 / Xcode 8 升级 - 工作副本错误导致 100 个 DerivedData 文件丢失

    我刚刚升级到 XCode 和 Swift 的最新 Beta 版本 但使用转换器后 我的应用程序项目现在有超过 200 个构建时黄色错误 所有错误均指出 projectDirectoy DerivedData XXXXXXXXX XXXX X
  • 在 Android 中像画廊图像一样用手指展开图像视图缩放

    我想像画廊图像一样缩放图像 我们可以通过手指展开和缩小来放大和缩小图像 怎么做 任何机构都可以帮忙吗 感谢和问候 您本质上要求的是图像的多点触控缩放 对吗 如果是这样 这应该是您正在寻找的答案 如何获得图像的缩放功能 https stack
  • 更改 ggsurvplot 的 x 轴标签

    library survival library survminer 我正在使用 survminer 包来绘制未经调整的 Kaplan Meier 图 我正在计算比较不同暴露的死亡率 我有一个非常具体的问题 有没有办法改变ggsurvplo
  • 使用 HTML / CSS / JavaScript 隐藏 YouTube 视频控件(标题、稍后观看、分享)

    我正在我的网站中嵌入 Youtube 每日动态视频 我不希望 Youtube 视频控件在我的网站上可见 请查看附件 我想删除顶部的控件 以红色突出显示 并且还想删除底部的控件 以红色突出显示 以前可以在 YouTube 视频中使用 show
  • 如何将 SVG 元素下载为 SVG 文件

    在过去的几个月里 我一直在编写处理椭球地球的代码 最近我已经完成了它 我的教授现在希望我将我制作的图表的图片作为 SVG 文件发送给他 我知道在Python中你可以在你的项目中放入几行代码来让它下载图像 但我不确定它是如何工作的JavaSc
  • Rails 3.2.2 mysql2 适配器错误

    我在让 mysql2 适配器与最新版本的 Rails 一起工作时遇到了麻烦 我刚刚生成了一个新项目 将以下内容添加到我的 gemfile 中 gem mysql2 lt 0 3 7 然后当然跑了 bundle install 我还修改了我的
  • 如何防止 iOS 独立 Web 应用程序锁定设备?

    我的原型设计服务创建独立的 不可安装的 iOS Web 应用程序 有时他们会在使用时锁定设备 主页按钮停止工作 应用程序继续工作 以下内容在设备的控制台中重复显示 通过附加到 xcode 检索 Apr 25 14 34 57 SpringB
  • Delphi 2009之前如何处理UTF-8和ANSI转换?

    在 Delphi 2009 中 我们有 RichEdit1 Lines LoadFromFile OpenDialog1 FileName TEncoding UTF8 RichEdit1 Lines SaveToFile OpenDial
  • C 可变参数函数:如何指定给 va_arg 的类型

    在像 printf 这样的函数中 我们使用stdarg h处理可变参数 void print int args va list ap va start ap args int i 0 for i 0 i
  • 使用 php 使用 Google Drive 进行断点续传

    我正在尝试使用以下文档在 php 中使用 Google Drive 进行可恢复上传 https developers google com drive v3 web manage uploads resumable https develo
  • Cordova 错误:您的 ios 平台没有 Api.js

    我正在尝试构建一个 cordova ios 应用程序 但运气不佳并且出现奇怪的错误 将此版本的 Cordova 与旧版本的 cordova ios 一起使用是 已弃用 升级到 电子邮件受保护 cdn cgi l email protecti
  • Puppet - 在迭代哈希时,如果 hiera 中不存在,则在清单中设置默认值

    我正在迭代 hiera 哈希中的许多条目 并希望通过在清单中设置默认值 例如ensure groups managehome等 并且如果 hiera 中存在重复的键 值对 则覆盖默认值 到目前为止 我尝试过的所有方法都无法获得默认值 我知道