簡體   English   中英

從哈希Puppet中刪除值

[英]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'}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM