【问题标题】:Remove value from hash Puppet从哈希木偶中删除值
【发布时间】:2017-11-02 17:51:01
【问题描述】:

我在 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 => ssh-rsa, key => AAAAB3NzaC1yc2EAAAABJ}}

然后我调用 create resources 来创建适当的 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


    【解决方案1】:

    检查来自stdlibdelete 函数的文档,我们看到您的情况中的两个参数需要是从哈希中删除密钥的哈希和要从哈希中删除的密钥。

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

    【讨论】:

      【解决方案2】:

      自 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-17
        • 2016-01-06
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多