create_resource在目录创建期间中断解析器顺序

时间:2014-08-06 04:54:49

标签: puppet

我在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创建。这应该只是一个后备,在我的情况下不应该发生。

1 个答案:

答案 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