我已经稍微更改了Hiera数据的结构,并尝试了不同的清单样式。
我正在尝试遍历木偶清单中的以下希拉哈希:
windows-10.yaml:
---
message: "This node is using Windows 10 data"
#profile::hiera_test::backups_enabled: false
profile::hiera_test::firewall:
rule1:
groupName: 'Cortana'
profileNames: ['Private','Public']
action: 'Deny'
rule2:
groupName: 'Microsoft Photos'
profileNames: 'Public'
action: 'Deny'
尽管我已经更新了数据结构,并且puppet lookup...
返回了看似有效的数据,但我对该结构并不完全有信心。
我尝试了清单的多个排列。最新的内容如下(基于Matt Schuchard给出的this答案):
hiera_test.pp:
class profile::hiera_test (
Hash $data = lookup('profile::hiera_test::firewall', "merge" => 'hash'),
){
$data.each | String $key, Hash $value = {}|{
notify {
default:
name => "Demo_${key}",
message => 'Item DEFAULT',
;
$key:
* => $value,
}
}
}
以及上面的错误/输出:
PS C:\Users\LocalAdmin> puppet agent -t
Notice: Local environment: 'production' doesn't match server specified node environment 'development', switching agent to 'development'.
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Retrieving locales
Info: Loading facts
Error: Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: no parameter named 'groupName' (file: /etc/puppetlabs/code/environments/development/site-modules/profile/manifests/hiera_test.pp, line: 31) on Notify[rule1] (file: /etc/puppetlabs/code/environments/development/site-modules/profile/manifests/hiera_test.pp, line: 31) on node winnode1.domain.com
Warning: Not using cache on failed catalog
Error: Could not retrieve catalog; skipping run
理想情况下,我希望它在类声明中起作用(为什么?,因为这与我的Puppet学习有关,但很高兴继续学习。我也正在使用Puppet Enterprise(2019.0.2))
互联网上也有几个类似的问题,但是它们要么已经过时(Hiera <5),要么示例不完整,包括this,要么我不知道如何将它们转换为我需要的东西。显然create_resources
即将到期折旧
?
如果有人可以告诉我我要去哪里错,那太好了。
答案 0 :(得分:0)
我有一个可行的解决方案,但希望有人可以用更好的方法来解决问题。
对于问题中的示例,行* => $value
用Hiera哈希中的键替换了*
。这些键用作notify
资源的参数,并且根据错误,groupName
没有这样的参数notify
。我要么必须更改Hiera数据中的键以匹配notify
的参数(这没有多大意义),要么要学习如何将Hiera数据键用作参数...
无论如何,Hiera数据与问题中的数据相同,但类如下:
class profile::hiera_test (
Hash $data = lookup('profile::hiera_test::firewall', "merge" => 'hash'),
){
$data.each | String $key, Hash $value = {}|{
notify {
default:
name => "Demo_${key}",
message => 'Item DEFAULT',
;
$key:
name => "Demo_${key}",
message => "Output: GroupName: ${value['groupName']}, Profile Names: ${value['profileNames']}, Action: ${value['action']}",
}
}
}
如您所见,我已将*
资源的有效参数替换为notify
。
输出:
Notice: Output: GroupName: Cortana, Profile Names: [Private, Public], Action: Deny
Notice: Output: GroupName: Microsoft Photos, Profile Names: Public, Action: Deny
现在将Notify
替换为实际的exec
资源。毫无疑问,将profileNames
数组转换为PowerShell会很有趣。