在Puppet中结合两个哈希

时间:2016-05-26 20:38:15

标签: puppet

我有2个哈希值,需要"结合"他们要创建一个新的ssh_authorized_key资源:

第一个哈希包含所有ssh密钥

$site_meta['Facebook'];

第二个哈希包含"部署"密钥和用户

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

我想"合并"这个哈希所以我可以使用create_resources

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

我该如何创建newhash?木偶没有迭代,这使得这种方式变得困难

哈希的数据最终来自工头智能类/变量

修改 这是关于工头1.11.1,在ubuntu 14.04中使用puppet 3.8.7

1 个答案:

答案 0 :(得分:4)

我不知道用于合并内置于木偶语言中的哈希的函数,但您可以始终使用custom parser function代替 - 这将允许您根据自己的喜好组合两个或更多个哈希值,使用纯红宝石 - 它真的不像听起来那么可怕。

幸运的是,puppetlabs/stdlib模块中已存在其中一个。不幸的是,这个特定情况所需的功能是自述文件中的not documented。称为deep_merge,它将合并嵌套的哈希值,您可以在函数本身的source中找到文档。

我不使用工头,所以如果您需要安装puppetlabs / stdlib模块,或者使用默认安装可以访问它,我就不清楚了。它是大量伪造模块的常见依赖,因此您可能已经拥有它。如果没有,foreman docs解释如何安装和添加一个木偶模块到节点(我假设你只是用引用的saz/ntp替换puppetlabs/stdlib

然后,您可以deep_merge查看您心中的内容,例如......

$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"]}}