Puppet create_资源在目录创建期间中断解析器顺序
我在Puppet 3.6.2中有一个严重的问题,我不理解。我想使用一个中央帐户和用户管理,但事情并不像预期的那样工作。我正在使用torrancew帐户()中的类型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 ... 资源(用户、组)通过我的个人资
帐户
。账户本身通过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!前面的classprofile::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'