Puppet create_资源在目录创建期间中断解析器顺序

Puppet create_资源在目录创建期间中断解析器顺序,puppet,Puppet,我在Puppet 3.6.2中有一个严重的问题,我不理解。我想使用一个中央帐户和用户管理,但事情并不像预期的那样工作。我正在使用torrancew帐户()中的类型帐户。账户本身通过hiera定义: # common.yaml accounts: puppet: ssh_key_type: ssh-rsa ssh_key: some_key password: password create_group: true ... 资源(用户、组)通过我的个人资

我在Puppet 3.6.2中有一个严重的问题,我不理解。我想使用一个中央帐户和用户管理,但事情并不像预期的那样工作。我正在使用torrancew帐户()中的类型
帐户
。账户本身通过hiera定义:

# common.yaml

accounts:
  puppet:
    ssh_key_type: ssh-rsa
    ssh_key: some_key
    password: password
    create_group: true
  ...
资源(用户、组)通过我的个人资料中的
create\u 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,
    }
  }
}
我收到一个重复声明:用户[puppet]已经声明,无法重新声明

有人能解释一下为什么在目录创建过程中,
create\u资源('account',hiera\u hash('accounts'))
中的资源在分析了
profile::accounts
之后不会立即进行评估吗


我添加了一些调试输出,可以看到首先解析
profile::accounts
,然后解析
profile::puppet::master
,然后是实际创建所有用户和组的
account
类型。这会导致重复声明异常,因为用户是由
profile::puppet::master
创建的。这应该只是一种退路,在我的情况下不应该发生

永远不要构建依赖于解析顺序的构造。事实上,尽量避免使用
定义的
函数,尤其是
if!已定义(资源[x]){Resource{x:}}
反模式

你一定会像现在这样自焚。在大多数情况下,您无法可靠地预测解析顺序

特别要注意的是,仅仅因为你接到了一个(危险的)电话


在你的
if!前面的class
profile::puppet::master
中!defined()
调用,这并不意味着在对函数求值之前将解析所需的类。情况正好相反:编译器将首先计算
profile::puppet::master
,包括
defined()。为什么?它应该是并且我期望:
profile::accounts
->
account
->
profile::puppet::master
在评估主配置文件时,是什么要求必须声明
用户['puppet']
?原因是我想要配置系统,而不是模块本身。我试着让它们尽可能“愚蠢”,把设置留给profiles层,并广泛使用hiera进行配置puppet’in keys(hiera('accounts'){…}
?我处理的主要问题是第三方模块,例如stephenrjohnson/puppetmodule,其中包含一些
!已定义(资源[x])
表达式。大多数模块都做得很好,但在分离配置文件和角色的意义上,很难让事情正常运行。您是否有任何建议,正确的方法是什么:不使用第三方模块,构建自己的“正确”版本或处理当前的实现问题?好的。。。我尽量避免使用
require
语句,但是我应该把我的排序依赖项放在哪里呢?我应该让他们扮演这个角色吗?那些模块是。我们应该搬到伦敦去。是的,您可能需要分叉并修复这些模块。-关于订购,这取决于您的实现。无论什么类或资源依赖于accounts概要文件,您都可以将其显式化
Class[::profile::accounts]->Class[依赖我的东西]
。非常感谢您的帮助!我将只使用显式依赖项,并进行所有必要的修改,以摆脱这些
require
表达式。我将努力向前迈进。谢谢
require '::profile::accounts'