我在Puppet 3.6.2中遇到了一个严重的问题,我不明白。我想使用中央帐户和用户管理,但事情不能按预期工作。我使用的是torrancew-account(https://github.com/torrancew/puppet-account)中的account
类型。帐户本身是通过hiera定义的:
# common.yaml
accounts:
puppet:
ssh_key_type: ssh-rsa
ssh_key: some_key
password: password
create_group: true
...
资源(用户,群组)是通过我的个人资料中的create_resources
创建的:
class profile::accounts {
create_resources('account', hiera_hash('accounts'))
}
另一个配置文件要求已创建所有用户和组。
class profile::puppet::master {
require '::profile::accounts'
if !defined(User['puppet']) {
user { 'puppet':
ensure => present,
}
}
}
我收到了Duplicate declaration: User[puppet] is already declared cannot redeclare
。
有人可以在创建目录期间解释我为什么在解析create_resources('account', hiera_hash('accounts'))
后不会立即评估profile::accounts
内的资源吗?
我添加了一些调试输出,可以看到首先解析profile::accounts
然后profile::puppet::master
以及之后实际创建所有用户和组的account
类型。这会导致重复声明异常,因为用户已由profile::puppet::master
创建。这应该只是一个后备,在我的情况下不应该发生。
答案 0 :(得分:1)
不要构建依赖于parse-order的构造。实际上,请尽量避免使用defined
函数,尤其是if !defined(Resource[x]) { resource { x: } }
反模式。
你必须按照目前正在发生的方式燃烧自己。在大多数情况下,您无法可靠地预测解析顺序。
请特别注意,因为你有一个(危险的)
的电话require '::profile::accounts'
在profile::puppet::master
调用之前,在课程if !defined()
中,这并不意味着在评估函数之前所需的类将被解析。情况恰恰相反:编译器将首先评估profile::puppet::master
,包括defined()
查询,然后才处理::profile::accounts
。