我正试图将哈希列表传递到一个类中。需要的是将一个或多个对象传递到我的类中——每个对象都有一小组数据,用于使用哈希中的数据点生成模板脚本。
我已经成功地使用了Hiera阵列&哈希:
mymods::keyvaultcerts::array::certNames: ['cert1','cert2','cert3']
mymods::chocopackages::hash::packages:
dotnetfx : 4.8
urlrewrite : 2.1
azure-cli : 2.31
vcredist : 12.0`
上面的工作做得很好。我可以很容易地访问哈希数据
class mymods::chocopackages::hash (
Hash $packages
){
$packages.each | $packageName, $packageVersion | {
package{$packageName:
ensure => $packageVersion,
}
}
我现在想做的是在上面的基础上再接再厉。我需要向我的类传递一个对象列表。所以我尝试使用一个散列对象数组:
profile::octopus::worker::workerConfigurations:[
{
Port: 10933,
Pool: "General Worker Pool",
User: "Dummy1",
DisplaySuffix: "",
},
{
Port: 10934,
Pool: "General Dev Pool",
User: "Dummy2",
DisplaySuffix: "Dev",
},
{
Port: 10935,
Pool: "General QA Pool",
User: "Dummy3",
DisplaySuffix: "_QA",
}
]
然后,在我的课堂上,我试图迭代列表并访问数据,就像。。。
class profile::octopus::worker(
Array $workerConfigurations
){
$workerConfigurations.each | Integer $workerIndex, Hash $workerConfigurationData | {
$workerConfigurationData.each | $workerPort, $workerPool, $workerUser, $workerDisplaySuffix | {
notify{"$workerPort ${$workerPort}" :}
}
}
}
我所期待的是看到港口的通知(109331093410935(。然而,我在客户端收到一个错误:
Error while evaluating a Method Call, 'each' block expects between 1 and 2 arguments, got 4
我的问题是:这可能吗?如果没有,关于如何将一个或多个对象的列表传递到我的类中,有什么建议吗?
内置的each
函数接受一个接受一个或两个参数的lambda。这些参数的重要性取决于给定的是一个还是两个,以及each()
的第一个参数是数组还是散列。
在任何情况下,块都不能接受四个参数:
$workerConfigurationData.each | $workerPort, $workerPool, $workerUser, $workerDisplaySuffix | { notify{"$workerPort ${$workerPort}" :} }
也不清楚您希望each
在那里为您做什么。您似乎希望从散列中选择并使用其中一个映射,而不是迭代。您可以通过用所需密钥在散列中下标来实现这一点:
notify { "Port: ${workerConfigurationData['Port']}" :}
顺便说一句,这与希拉没有什么特别的关系。您可以在不涉及Hiera的情况下声明和使用散列(和数组(。