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

Puppet 读取多个哈希键并仅保留唯一值,puppet,Puppet,如果我有Hiera中的数据,如: 资源\u适配器\u实例: “Adp1”: 适配器计划目录:“/opt/weblogic/middleware” 适配器计划:“计划数据库.xml” “Adp2”: 适配器计划目录:“/opt/weblogic/middleware” adapter_plan:'ODB_plan_DB.xml' “Adp3”: 适配器计划目录:“/opt/weblogic/middleware” 适配器计划:“计划数据库.xml” 我需要将其转换为这样的数组,注意重复项会被删除

如果我有Hiera中的数据,如:

资源\u适配器\u实例:
“Adp1”:
适配器计划目录:“/opt/weblogic/middleware”
适配器计划:“计划数据库.xml”
“Adp2”:
适配器计划目录:“/opt/weblogic/middleware”
adapter_plan:'ODB_plan_DB.xml'
“Adp3”:
适配器计划目录:“/opt/weblogic/middleware”
适配器计划:“计划数据库.xml”
我需要将其转换为这样的数组,注意重复项会被删除:

[/opt/weblogic/middleware/Plan_DB.xml,/opt/weblogic/middleware/ODB_Plan_DB.xml]
我知道我必须使用木偶,但我真的很挣扎

我试过这个:

$resource\u adapter\u instances=hiera('resource\u adapter\u instances',{})
$resource_adapter_path=$resource_adapter_instances.map |$h |{$h['adapter_plan_dir']},{$h['adapter_plan']}.join('/').uniq
注意($resource\u adapter\u实例)

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

你的思路是对的。可能的解决办法如下:

$resource\u adapter\u instances=查找('resource\u adapter\u instances',{})
$resource\u适配器\u路径=
$resource_adapter_instances.map |$x|{
[$x[1]['adapter\u plan\u dir'],$x[1]['adapter\u plan']]。加入('/'))
}
.独一无二
注意($resource\u adapter\u路径)
还有几点需要注意:

  • hiera函数非常有用,因此我使用查找重写了它,您也应该这样做

  • Puppet的map函数可能会有点混乱,尤其是当您需要通过嵌套哈希进行迭代时,就像您的例子一样。在每次迭代中,Puppet以
    [key,value]
    的形式将每个键和值对作为数组传递。因此,$x[0]获取您的散列键(Adp1等),而$x[1]获取右侧的数据

  • Puppet的独特功能不是像Bash、Ruby等中那样的
    uniq
    ,而是被拼写为
    unique

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

如果您申请,您将获得:

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

hiera.values.map{h |[h[:adapter\u plan\u dir],h[:adapter\u plan]].join('/')}.uniq
我已经删除了Ruby标记,与Ruby无关。@DaveShaw,你需要清楚地说明你实际上在做什么,如果可能的话,修复语法错误和缩进,因为我们无法读取它。puppet parser vallidate your_file.pp.还有,您正在使用的puppet版本,因为它似乎是一个旧版本。谢谢@Alexarvey-我不确定所需的输出如何不清楚,但很高兴编辑它。上面写着“我想要的结果…”-我们用的是木偶,谢谢Alex。我一直在将我们的清单从hiera转换为我遇到的查找。我们有相当多的旧代码在网站上。谢谢你的指点。非常感谢,我;我和puppet合作了一段时间,但这是我第一次真正深入研究子键。我认为这方面需要一些培训。再次感谢!