[英]Remove value from hash Puppet
我在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}}
然后我調用創建資源來創建適當的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'] }
但它不起作用。 感謝任何幫助
從stdlib
檢查delete
函數的文檔,我們看到你的情況下的兩個參數需要是從哈希中刪除鍵的哈希值和從哈希中刪除的鍵。
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'}
請注意,解決方案的兩個版本在語法上是不同的,但產生相同的結果,並且在現代Puppet DSL函數調用中都是可接受的。
值得注意的是,您可以完全通過對示例中的整個哈希使用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'}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.