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