Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hash 从哈希傀儡中删除值_Hash_Puppet_Hiera - Fatal编程技术网

Hash 从哈希傀儡中删除值

Hash 从哈希傀儡中删除值,hash,puppet,hiera,Hash,Puppet,Hiera,我在希拉有以下参数: base::users: john@example.com: ensure: present user: john sudo: true type: ssh-rsa key: AAAAB3NzaC1yc2EAAAABJ 在puppet中,我得到以下哈希值: {john@example.com => {ensure => present, user => john, sudo => true, type

我在希拉有以下参数:

base::users:
  john@example.com:
    ensure: present
    user: john
    sudo: true
    type: ssh-rsa
    key: AAAAB3NzaC1yc2EAAAABJ
在puppet中,我得到以下哈希值:

 {john@example.com => {ensure => present, user => john, sudo => true, type => ssh-rsa, key => AAAAB3NzaC1yc2EAAAABJ}}
然后我调用create resources来创建适当的授权密钥文件:

create_resources('ssh_authorized_key', $users)
但它不起作用,因为我添加了新参数“sudo”,在调用create_resources之前,我想从散列中删除这个键并在另一个资源中操作

我已尝试下一步将其删除:

$users_filtered = $users.each |$k, $v| { $v.delete['sudo'] }
我得到了下一个错误:

Error while evaluating a Function Call, delete(): Wrong number of arguments given 1 for 2.
据我所知,puppet试图从stdlib模块中使用“删除”功能。 但我也尝试过:

$users_filtered = $users.each |$k, $v| { delete($users, $v['sudo'] }

但它不起作用。感谢您提供的任何帮助

查看
stdlib
中的
delete
函数的文档,我们发现您案例中的两个参数需要是从散列中删除密钥的散列和从散列中删除的密钥

这一行的问题是,您将
delete
视为带有键
sudo
的散列
delete
是一个函数,而不是散列
$v
是此处
每个
lambda迭代器中的哈希值。你可以用它来解决这个问题

$users_filtered = $users.each |$k, $v| { $v.delete('sudo') }
delete
视为一个函数。此外,如果要将
$users\u filtered
传递到
create\u resources
函数中,则需要将每个键作为标题,将其作为嵌套哈希。因此,lambda需要返回嵌套散列,这意味着您需要使用
map
来返回嵌套散列

$users_filtered = $users.map |$k, $v| { $v.delete('sudo') }

然后我们还有另一个尝试:

$users_filtered = $users.each |$k, $v| { delete($users, $v['sudo'] }
它还需要返回一个散列,并且需要有一个键作为第二个参数。您将
$v['sudo']
作为第二个参数,它是该散列中
sudo
键的值。我们通过以下类似方式解决此问题:

$users_filtered = $users.map |$k, $v| { delete($v, 'sudo'}
请注意,解决方案的两个版本在语法上不同,但产生相同的结果,并且在现代Puppet DSL函数调用中都是可以接受的

还值得注意的是,通过对示例中的整个哈希使用
delete
,可以完全消除对迭代器的需要

$users_filtered = delete($users, 'sudo')
从Puppet 4.0.0开始,减号(-)运算符从数组中删除值,并从散列中删除键:

$users_filtered = delete($users, 'sudo')
['a', 'b', 'c', 'b'] - 'b'
# would return ['a', 'c']

{'a'=>1,'b'=>2,'c'=>3} - ['b','c'])
# would return {'a' => '1'}