读取多个哈希键并仅保留唯一值
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]
如果我在 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]