我在调用人偶清单中的哈希值时遇到困难,代码如下所示,
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时,我从测试p客户端服务器收到如下错误,
错误:无法从远程服务器检索目录:错误500 SERVER:服务器错误:语法错误位于“(文件: /etc/puppetlabs/code/environments/xxxxx/site/profile/manifests/xxx/sec_model.pp, 节点xxxx.xxx.com上的第11行,第13列)
当我查看清单时,一切都很好,但是无法确定调用哈希值的代码哪一侧是错误的。
答案 0 :(得分:3)
是的,这不是有效的语法。
因此,您应该将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。
进一步的解释:
此问题与之前的this问题非常相似。有关“为什么”的更多信息和更多参考,请参见此处。
还请注意,我在YAML中删除了多余的标点符号。我个人认为,最好的做法是仅在实际需要的YAML文件中包含标点符号,因为它更干净,它还会迫使您了解何时以及为什么需要在YAML中标点符号。