当我运行puppet agent --test
时,我没有错误输出,但用户没有创建。
我的木偶hira.yaml配置是:
---
version: 5
datadir: "/etc/puppetlabs/code/environments"
data_hash: yaml_data
hierarchy:
- name: "Per-node data (yaml version)"
path: "%{::environment}/nodes/%{::trusted.certname}.yaml"
- name: "Common YAML hierarchy levels"
paths:
- "defaults/common.yaml"
- "defaults/users.yaml"
users.yaml是:
accounts::user:
joed:
locked: false
comment: System Operator
uid: '1700'
gid: '1700'
groups:
- admin
- sudonopw
sshkeys:
- ssh-rsa ...Hw== [email protected]
Hiera数据本身没有任何内容可以将任何内容应用于目标节点。清单中某处或外部节点分类器脚本的输出中需要某种声明。此外,puppetlabs / accounts模块仅提供已定义的类型,而不提供类。您可以在Hiera中存储已定义类型的数据并将其读回,但通过Hiera进行的自动参数绑定仅适用于类,而不是定义的类型。
简而言之,没有用户被创建(并且没有报告错误),因为没有相关资源被声明到目标节点的目录中。你没有给Puppet任何事情。
如果要将存储的用户数据应用于节点,您可能需要以下内容:
$user_data = lookup('accounts::user', Hash[String,Hash], 'hash', {})
$user_data.each |$user,$props| {
accounts::user { $user: * => $props }
}
这将进入与目标节点匹配的节点块,或者更好地进入由该节点块或等效节点声明的类。对于这么少的线路来说这很复杂,但简而言之:
lookup
函数在您的Hiera数据中查找关键字'accounts :: user'
执行出现在层次结构的不同级别的结果的哈希合并
期望结果是带有字符串键和哈希值的哈希值
如果没有找到结果,则默认为空哈希;accounts::user
定义类型的实例
使用(外部)哈希键作为用户名,
以及与该键相关联的值,作为从参数名称到参数值的映射。这里有一些问题。
您在hiera.yaml
中缺少一条线,即defaults
键。它应该是:
---
version: 5
defaults: ## add this line
datadir: "/etc/puppetlabs/code/environments"
data_hash: yaml_data
hierarchy:
- name: "Per-node data (yaml version)"
path: "%{::environment}/nodes/%{::trusted.certname}.yaml"
- name: "Common YAML hierarchy levels"
paths:
- "defaults/common.yaml"
- "defaults/users.yaml"
我检测到使用puppet-syntax gem(如果你使用PDK,包括推荐):
▶ bundle exec rake validate
Syntax OK
---> syntax:manifests
---> syntax:templates
---> syntax:hiera:yaml
ERROR: Failed to parse hiera.yaml: (hiera.yaml): mapping values are not allowed in this context at line 3 column 10
此外,除了John提到的内容之外,读取数据的最简单的类是:
class test (Hash[String,Hash] $users) {
create_resources(accounts::user, $users)
}
或者如果你想避免使用create_resources
*:
class test (Hash[String,Hash] $users) {
$users.each |$user,$props| {
accounts::user { $user: * => $props }
}
}
请注意,我依赖于自动参数查找功能。请参阅以下链接。
然后,在您的Hiera数据中,您将有一个名为test::users
的密钥对应(类名“test”,密钥名称“users”):
---
test::users: ## Note that this line changed.
joed:
locked: false
comment: System Operator
uid: '1700'
gid: '1700'
groups:
- admin
- sudonopw
sshkeys:
- ssh-rsa ...Hw== [email protected]
与显式调用lookup
函数相比,使用自动参数查找通常是编写Puppet代码的惯用方式。
欲了解更多信息:
(*请注意,create_resources
是“有争议的”.Puppet社区中的许多人不愿意使用它。)