【发布时间】:2019-07-19 14:32:53
【问题描述】:
我正在尝试以云中的 JMS 服务器为目标,puppet 模块 init.pp 需要将密钥添加到哈希中。
我正在读取一个 hiera 块,并且必须提取其中的一部分以形成一个新的哈希。 .each 不返回任何值,所以我使用的是 .map。 我得到的值正是我想要的,但是当我尝试 deep_merge 时,我发现 .map 输出为一个数组。
service.yaml
jms_subdeployment_instances:
'BPMJMSModuleUDDs:BPMJMSSubDM':
ensure: 'present'
target:
- 'BPMJMSServer_auto_1'
- "BPMJMSServer_auto_%{::ec2_tag_name}"
targettype:
- 'JMSServer'
- 'JMSServer'
init.pp
$jms_subdeployments = lookup('jms_subdeployment_instances', $default_params)
$jms_target_args = $jms_subdeployments.map |$subdep, $value| {
$jms_short_name = $subdep[0, 3]
$jms_subdeployment_inst = $array_domain_jmsserver_addresses.map |$index, $server| {
"${jms_short_name}JMSServer_auto_${server}"
if defined('$jms_subdeployment_inst') {
$jmsTargetArg = {
"${subdep}" => {
'target' => $jms_subdeployment_inst
}
}
}
}
$merge_subdeployment_targets = merge($jms_subdeployments, $jms_target_args)
```Output
New JMS targets are : [{BPMJMSModuleUDDs:BPMJMSSubDM => {target => [BPMJMSServer_auto_server101, BPMJMSServer_auto_server102]}}]
封闭的 [ ] 给我带来了麻烦。据我所知,在 puppet 中 .to_h 也不起作用
谢谢
22/07/2019 更新:
感谢您的回复,我不得不稍微调整一下,因为 puppet 失败并显示“服务器错误:评估错误:评估方法调用时出错,'values' 参数 'hsh' 需要一个哈希值,得到元组”
$array_domain_jmsserver_addresses =
any2array(hiera('pdb_domain_msserver_addresses'))
$array_domain_jmsserver_addresses.sort()
$jms_subdeployments = lookup('jms_subdeployment_instances', $default_params)
$hash_domain_jmsserver_addresses = Hash($array_domain_jmsserver_addresses)
if $hash_domain_jmsserver_addresses.length > 0 {
$jms_target_arg_tuples = $jms_subdeployments.keys.map |$subdep| {
$jms_short_name = $subdep[0, 3]
$jms_subdeployment_inst = regsubst(
$hash_domain_jmsserver_addresses.values, /^/, "${jms_short_name}JMSServer_auto_")
# the (key, value) tuple to which this element maps
[ $subdep, { 'target' => $jms_subdeployment_inst } ]
}
$jms_target_args = Hash($jms_target_arg_tuples)
} else {
$jms_target_args = {}
}
notify{"Normal array is : ${jms_subdeployments}": }
notify{"Second array is : ${jms_target_args}": }
$merge_subdeployment_targets = deep_merge($jms_subdeployments, $jms_target_args)
notify{"Merged array is : ${merge_subdeployment_targets}": }
正常是:{BPMJMSModuleUDDs:BPMJMSSubDM => {ensure => present, target => [BPMJMSServer_auto_1, BPMJMSServer_auto_server1], targettype => [JMSServer, JMSServer]},
第二个是:{BPMJMSModuleUDDs:BPMJMSSubDM => {target => [BPMJMSServer_auto_server2]}
合并为:{BPMJMSModuleUDDs:BPMJMSSubDM => {ensure => present, target => [BPMJMSServer_auto_server2], targettype => [JMSServer, JMSServer]}
想要的输出:
{BPMJMSModuleUDDs:BPMJMSSubDM => {确保 => 存在,目标 => [BPMJMSServer_auto_1, BPMJMSServer_auto_server1, BPMJMSServer_auto_server2], targettype => [JMSServer, JMSServer, JMSServer]}
【问题讨论】:
-
您的代码有不平衡的括号。我认为我已经明白你的意思了,但如果是这样,那么你的代码也有不一致的缩进。
-
如果我的答案中的(不同的)修订版不能解决问题,那么如何通过用文字替换所有
lookup()调用来更接近 minimal reproducible example。我在回答中提供的代码是对您的原始代码的改编,但如果它首先不太适合实际数据,那么我们没有足够的信息来让您到达您想要的位置。