在Puppet中合并两个哈希
我有2个散列,需要“组合”它们以生成一个新的ssh\u授权\u密钥资源: 第一个散列包含所有ssh密钥在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', } } 第二个散列包含密钥和用户的
$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中的合并
函数。但目前还没有深度合并的方案,所以答案仍然是正确的。。。