在Puppet中合并两个哈希

在Puppet中合并两个哈希,puppet,Puppet,我有2个散列,需要“组合”它们以生成一个新的ssh\u授权\u密钥资源: 第一个散列包含所有ssh密钥 $ssh_keys = { 'user1@192.168.14.47' => { type => 'ssh-rsa', key => 'Key1', }, 'user2@192.168.18.10' => { type => 'ssh-rsa', key => 'Key2', } } 第二个散列包含密钥和用户的

我有2个散列,需要“组合”它们以生成一个新的ssh\u授权\u密钥资源:

第一个散列包含所有ssh密钥

$ssh_keys = {
 'user1@192.168.14.47' => {
    type => 'ssh-rsa',
    key  => 'Key1',
 },
 'user2@192.168.18.10' => {
    type => 'ssh-rsa',
    key  => 'Key2',
  }
}
第二个散列包含密钥和用户的“部署”

$deploys = {
    'user1@192.168.14.47' => { user => ["user3","user4"]},
    'user2@192.168.18.10' => { user => ["user3"]}
}
我想“合并”这个散列,这样我就可以使用create\u资源了

$newhash ={
    'user1@192.168.14.47' => {
    type => 'ssh-rsa',
    key  => 'Key1',
    user => ["user3","user4"]
 },
 'user2@192.168.18.10' => {
    type => 'ssh-rsa',
    key  => 'Key2',
    user => ["user3"]
  }
}

create_resources('ssh_authorized_key',$newhash)
如何创建新哈希?木偶没有迭代,这使得这种方法很难实现

散列数据最终来自foreman智能类/变量

编辑:
这是在foreman 1.11.1和Ubuntu14.04中的puppet 3.8.7上的,我不知道有一个函数可以将散列合并到puppet语言中,但是你可以用一个来代替,它可以让你用纯ruby任意组合两个或更多的散列,这真的不像听起来那么可怕

幸运的是,其中一个已经存在于模块中。不幸的是,这个特殊情况下需要的函数在自述文件中。名为
deep\u merge
,它将合并嵌套的哈希,您可以在函数本身的目录中找到文档

我不使用foreman,所以我不清楚您是否需要安装puppetlabs/stdlib模块,或者是否可以通过默认安装进行访问。这是大量forge模块的常见依赖项,因此您可能已经拥有了它。如果没有,则说明如何安装puppet模块并将其添加到节点(我认为您只需将
saz/ntp
替换为
puppetlabs/stdlib
,如有引用)

然后,您可以将
deep\u合并到您心中的内容中,如

$ssh_keys = {
 'user1@192.168.14.47' => {
    type => 'ssh-rsa',
    key  => 'Key1',
 },
 'user2@192.168.18.10' => {
    type => 'ssh-rsa',
    key  => 'Key2',
  }
}

$deploys = {
    'user1@192.168.14.47' => { user => ["user3","user4"]},
    'user2@192.168.18.10' => { user => ["user3"]}
}

$merged = deep_merge($ssh_keys, $deploys)

notify { $merged: }
。。。这导致

Notice: { \
  "user1@192.168.14.47"=>{"type"=>"ssh-rsa","key"=>"Key1", "user"=>["user3", "user4"]}, \
  "user2@192.168.18.10"=>{"type"=>"ssh-rsa", "key"=>"Key2","user"=>["user3"]}}

有几种方法可以做到这一点,但这取决于您使用的木偶版本。您使用的是什么版本?使用hiera并定义您想要的哈希合并类型。从Puppet 4.0.0开始,您可以使用
+
运算符合并哈希,这相当于stdlib中的
合并
函数。但目前还没有深度合并的方案,所以答案仍然是正确的。。。