从希拉评估木偶清单中的哈希值

时间:2019-03-14 08:03:48

标签: automation yaml puppet puppet-enterprise 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时,我从测试p客户端服务器收到如下错误,

  

错误:无法从远程服务器检索目录:错误500   SERVER:服务器错误:语法错误位于“(文件:   /etc/puppetlabs/code/environments/xxxxx/site/profile/manifests/xxx/sec_model.pp,   节点xxxx.xxx.com上的第11行,第13列)

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

1 个答案:

答案 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中标点符号。