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

时间:2019-03-29 10:40:51

标签: puppet

如果我在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)

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

1 个答案:

答案 0 :(得分:3)

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

$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,所以我使用查找重写了,你也应该这样做。

  • Puppet的map函数可能会有些混乱-尤其是在您需要通过嵌套的Hash进行迭代的情况下(如您的情况)。在每次迭代中,Puppet都将每个键和值对作为数组以[key, value]的形式传递。因此,$ x [0]获取哈希键(Adp1等),$ x [1]获取右侧的数据。

  • Puppet的唯一功能不是像Bash,Ruby等那样的uniq,而是实际上被拼写为unique

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

如果你申请up,你会得到:

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