从哈希木偶中删除值



我在hiera中具有以下参数:

base::users:
  john@example.com:
    ensure: present
    user: john
    sudo: true
    type: ssh-rsa
    key: AAAAB3NzaC1yc2EAAAABJ

在木偶中,我得到以下哈希:

 {john@example.com => {ensure => present, user => john, sudo => true, type => ssh-rsa, key => AAAAB3NzaC1yc2EAAAABJ}}

然后,我正在调用创建资源以创建适当的授权_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'] }

但行不通。感谢任何帮助

stdlib检查delete函数的文档,我们看到在您的情况下,这两个参数必须是哈希删除密钥和从哈希中删除的密钥。/p>

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需要返回嵌套的哈希,这意味着您需要使用map而不是返回嵌套的哈希。

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

也需要返回哈希,并且需要将钥匙作为第二个参数。您将$v['sudo']作为第二个参数,而是该哈希中sudo键的值。我们以类似的方式通过:

来解决此问题。
$users_filtered = $users.map |$k, $v| { delete($v, 'sudo'}

请注意,该解决方案的两个版本在句法上不同,但产生相同的结果,并且在现代木偶DSL函数Invications中都可以接受。

也值得注意的是,您可以通过在您的示例中使用整个哈希上使用delete来完全消除对迭代器的需求。

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

自puppet 4.0.0以来

['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

相关内容

  • 没有找到相关文章

最新更新