读取多个哈希键并仅保留唯一值

Read multiple hash keys and keep only unique values

如果我在 Hiera 中有这样的数据:

resource_adapter_instances:
  'Adp1':
    adapter_plan_dir: "/opt/weblogic/middleware"
    adapter_plan:     'Plan_DB.xml'
  'Adp2':
    adapter_plan_dir: "/opt/weblogic/middleware"
    adapter_plan:     'ODB_Plan_DB.xml'
  'Adp3':
    adapter_plan_dir: "/opt/weblogic/middleware"
    adapter_plan:     'Plan_DB.xml'

我需要将其转换成这样的数组,注意删除重复项:

[/opt/weblogic/middleware/Plan_DB.xml, /opt/weblogic/middleware/ODB_Plan_DB.xml]

我知道我必须使用 Puppet 的 map 但我真的很难用它。

我试过这个:

$resource_adapter_instances = hiera('resource_adapter_instances', {})
$resource_adapter_paths = $resource_adapter_instances.map |$h|{$h['adapter_plan_dir']},{$h['adapter_plan']}.join('/').uniq
notice($resource_adapter_instances)

但这不起作用,并发出语法错误。我该怎么做?

你走在正确的轨道上。可能的解决方案如下:

$resource_adapter_instances = lookup('resource_adapter_instances', {})
$resource_adapter_paths =
  $resource_adapter_instances.map |$x| {
    [$x[1]['adapter_plan_dir'], $x[1]['adapter_plan']].join('/')
  }
  .unique
notice($resource_adapter_paths)

一些补充说明:

  • hiera 函数是 deprecated 所以我使用 lookup 重写了,你也应该这样做。

  • Puppet 的 map 函数可能有点令人困惑 - 特别是当您需要通过嵌套哈希对其进行迭代时,就像您的情况一样。在每次迭代中,Puppet 将每个键值对作为 [key, value] 形式的数组传递。因此,$x[0] 获取您的哈希键(Adp1 等),$x[1] 获取右侧的数据。

  • Puppet的独特功能并不是Bash、Ruby等uniq,而是拼写为unique

  • 请注意,我已经重写了它,没有大量的长行。它更容易阅读。

如果你 puppet 申请你会得到:

Notice: Scope(Class[main]): [/opt/weblogic/middleware/Plan_DB.xml,
  /opt/weblogic/middleware/ODB_Plan_DB.xml]