在人偶清单中的人偶Hiera哈希上进行迭代

时间:2019-07-19 11:40:36

标签: puppet puppet-enterprise

更新1

我已经稍微更改了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即将到期折旧 ?

如果有人可以告诉我我要去哪里错,那太好了。

1 个答案:

答案 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会很有趣。