如果我在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)
但这不起作用,并发出语法错误。我该怎么做?
答案 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]