我在hiera中有以下参数:
base::users:
john@example.com:
ensure: present
user: john
sudo: true
type: ssh-rsa
key: AAAAB3NzaC1yc2EAAAABJ
Run Code Online (Sandbox Code Playgroud)
在木偶我得到以下哈希:
{john@example.com => {ensure => present, user => john, sudo => true, type => ssh-rsa, key => AAAAB3NzaC1yc2EAAAABJ}}
Run Code Online (Sandbox Code Playgroud)
然后我调用创建资源来创建适当的authorized_keys文件:
create_resources('ssh_authorized_key', $users)
Run Code Online (Sandbox Code Playgroud)
但它不起作用,因为我添加了新参数'sudo',在调用create_resources之前,我想从散列中删除此键并在另一个资源中操作.
我已经尝试了下一步删除它:
$users_filtered = $users.each |$k, $v| { $v.delete['sudo'] }
Run Code Online (Sandbox Code Playgroud)
我收到了下一个错误:
Error while evaluating a Function Call, delete(): Wrong number of arguments given 1 for 2.
Run Code Online (Sandbox Code Playgroud)
据我所知,puppet尝试使用stdlib模块中的"删除"功能.但我也尝试过:
$users_filtered = $users.each |$k, $v| { delete($users, $v['sudo'] }
Run Code Online (Sandbox Code Playgroud)
但它不起作用.感谢任何帮助
检查delete函数的文档stdlib,我们看到你的情况下的两个参数需要是从哈希中删除密钥的哈希和从哈希中删除的密钥.
https://github.com/puppetlabs/puppetlabs-stdlib#delete
$users_filtered = $users.each |$k, $v| { $v.delete['sudo'] }
Run Code Online (Sandbox Code Playgroud)
这一行的问题在于您将delete密钥视为哈希sudo.delete是一个函数而不是哈希.$v这是eachlambda迭代器中的哈希值.你可以解决这个问题
$users_filtered = $users.each |$k, $v| { $v.delete('sudo') }
Run Code Online (Sandbox Code Playgroud)
delete作为一种功能对待.此外,如果要传递$users_filtered给create_resources函数,则需要将其作为嵌套哈希,并将每个键作为标题.因此,您的lambda需要返回嵌套哈希,这意味着您需要使用它map来返回嵌套哈希.
$users_filtered = $users.map |$k, $v| { $v.delete('sudo') }
Run Code Online (Sandbox Code Playgroud)
https://docs.puppet.com/puppet/4.10/function.html#map
然后我们有另一个尝试:
$users_filtered = $users.each |$k, $v| { delete($users, $v['sudo'] }
Run Code Online (Sandbox Code Playgroud)
它还需要返回一个哈希值,并需要一个键作为第二个参数.您将$v['sudo']作为第二个参数给出,而不是该sudo哈希中键的值.我们通过以下类似方式修复此问题:
$users_filtered = $users.map |$k, $v| { delete($v, 'sudo'}
Run Code Online (Sandbox Code Playgroud)
请注意,解决方案的两个版本在语法上是不同的,但产生相同的结果,并且在现代Puppet DSL函数调用中都是可接受的.
值得注意的是,通过使用delete示例中的整个哈希,您可以完全消除对迭代器的需求.
$users_filtered = delete($users, 'sudo')
Run Code Online (Sandbox Code Playgroud)