从哈希Puppet中删除值

问题描述 投票:3回答:2

我在hiera中有以下参数:

base::users:
  [email protected]:
    ensure: present
    user: john
    sudo: true
    type: ssh-rsa
    key: AAAAB3NzaC1yc2EAAAABJ

在木偶我得到以下哈希:

 {[email protected] => {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模块中的“删除”功能。但我也尝试过:

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

但它不起作用。感谢任何帮助

hash puppet hiera
2个回答
9
投票

delete检查stdlib函数的文档,我们看到你的情况下的两个参数需要是从哈希中删除键的哈希值和从哈希中删除的键。

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

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

这一行的问题在于你将delete视为具有密钥sudo的哈希。 delete是一个函数而不是哈希。 $veach 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'}

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

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

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

1
投票

从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

© www.soinside.com 2019 - 2024. All rights reserved.