从哈希 Puppet 中删除值

Remove value from 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 => ssh-rsa, key => AAAAB3NzaC1yc2EAAAABJ}}

然后我调用创建资源来创建适当的 authorized_keys 文件:

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 模块中的 'delete' 函数。 但我也试过:

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

但是没有用。感谢任何帮助

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

https://github.com/puppetlabs/puppetlabs-stdlib#delete

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

这一行的问题在于您将 delete 视为具有键 sudo 的散列。 delete 是一个函数而不是哈希。 $v 是您在此处的 each lambda 迭代器中的哈希值。你可以用

解决这个问题
$users_filtered = $users.each |$k, $v| { $v.delete('sudo') }

delete 视为函数。另外,如果你想将 $users_filtered 传递给 create_resources 函数,那么它需要是一个嵌套的散列,每个键作为标题。因此,您的 lambda 需要 return 嵌套哈希,这意味着您需要使用 map 而不是 return 嵌套哈希。

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

https://docs.puppet.com/puppet/4.10/function.html#map

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

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

还需要 returning 散列并且需要有一个键作为第二个参数。您将 $v['sudo'] 作为第二个参数,而不是该散列中 sudo 键的值。我们以类似的方式通过以下方式修复此问题:

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

请注意,该解决方案的两个版本在语法上不同,但产生相同的结果,并且在现代 Puppet DSL 函数调用中都是可接受的。

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

$users_filtered = delete($users, 'sudo')

Since Puppet 4.0.0, the minus (-) operator deletes values from arrays and deletes keys from a hash:

['a', 'b', 'c', 'b'] - 'b'
# would return ['a', 'c']

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

https://github.com/puppetlabs/puppetlabs-stdlib#delete