评估来自 hiera 的人偶清单中的哈希值

Assess hashes value in puppet manifest from hiera

我在调用我的人偶清单中的哈希值时遇到困难,我的代码如下,

hiera .yaml 文件:

---
users:
  app1:
    ensure: 'present'
    home: '/home/app1'
    password: '!!'
    password_max_age: '99999'
    password_min_age: '0'
  app2:
    ensure: 'present'
    home: '/home/app2'
    password: '!!'
    password_max_age: '99999'
    password_min_age: '0'

我的人偶清单:

class profile::sec::sec_model {
hiera_hash('users').each |String $user, Hash $user_hash| {
    $user_hash.each |String $attr, String $value| {
        user { "$user":
            "${attr}" => "${value}"
       }
    }
}
}

我的目标是创建用户 app1 和 app2,如果使用下面的普通清单,我可以创建它,如下例所示,

user { 'app1':
        ensure            => "present",
        home              => "/home/app1",
        password          => '!!',
        password_max_age  => '99999',
        password_min_age  => '0',
        shell             => '/bin/bash',
    }
}

但是,当使用 hiera 时,我从测试人偶客户端服务器收到如下错误,

Error: Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: Syntax error at '' (file: /etc/puppetlabs/code/environments/xxxxx/site/profile/manifests/xxx/sec_model.pp, line: 11, column: 13) on node xxxx.xxx.com

当我查看我的清单时,一切都很好,但无法确定调用哈希值的代码的哪一侧是错误的。

是的,这不是有效的语法。

因此,您应该将 YAML 重构为:

---
profile::sec::sec_model::users:
  app1:
    ensure: present
    home: /home/app1
    password: '!!'
    password_max_age: 99999
    password_min_age: 0
  app2:
    ensure: present
    home: /home/app2
    password: '!!'
    password_max_age: 99999
    password_min_age: 0

然后对于您的清单,请使用:

class profile::sec::sec_model(Hash[String,Hash] $users) {
  $users.each |$user,$user_hash| {
    user { $user: * => $user_hash }
  }
}

或者,简单地说:

class profile::sec::sec_model(Hash[String,Hash] $users) {
  create_resources(user, $users)
}

注意并不是 Puppet 社区中的每个人都喜欢使用 create_resources。

进一步说明:

  • 这个问题与 之前的问题非常相似。有关 "whys" 的更多信息和更多参考资料,请参阅此处。

  • 另请注意,我删除了 YAML 中多余的标点符号。我个人认为最好的做法是在实际需要的 YAML 文件中只包含标点符号,因为它更简洁,而且它还会迫使您了解何时以及为什么需要 YAML 中的标点符号。