Puppet 6 和模块 puppetlabs/accounts 不会以 Hiera YAML 格式创建用户帐户
Puppet 6 and module puppetlabs/accounts does not create user account in Hiera YAML format
当我运行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== sysop+moduledevkey@puppetlabs.com
Hiera 数据本身不会导致 任何东西 应用于目标节点。某处的清单或外部节点 classifier 脚本的输出中需要某种声明。此外,puppetlabs/accounts 模块只提供定义的类型,而不是 classes。您可以在 Hiera 中存储定义类型的数据并读回,但通过 Hiera 进行的自动参数绑定仅适用于 classes,而不适用于定义的类型。
简而言之,由于没有在目标节点的目录中声明相关资源,所以没有创建用户(也没有报错)。你还没有给 Puppet 任何事情做。
如果你想将存储的用户数据应用到你的节点,你会想要一些类似的东西:
$user_data = lookup('accounts::user', Hash[String,Hash], 'hash', {})
$user_data.each |$user,$props| {
accounts::user { $user: * => $props }
}
这将进入与您的目标节点匹配的节点块,或者更好的是,进入由该节点块或等效项声明的 class。这么少的几行代码相当复杂,但简而言之:
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 读取您的数据是这样的:
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 }
}
}
请注意,我依赖于自动参数查找功能。请参阅下面的 link。
然后,在您的 Hiera 数据中,您将有一个名为 test::users
的密钥对应于(class 名称 "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== sysop+moduledevkey@puppetlabs.com
与显式调用 lookup
函数相比,使用自动参数查找通常是更惯用的编写 Puppet 代码的方式。
更多信息:
(*请注意 create_resources
是 "controversial"。Puppet 社区中的许多人不喜欢使用它。)
当我运行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== sysop+moduledevkey@puppetlabs.com
Hiera 数据本身不会导致 任何东西 应用于目标节点。某处的清单或外部节点 classifier 脚本的输出中需要某种声明。此外,puppetlabs/accounts 模块只提供定义的类型,而不是 classes。您可以在 Hiera 中存储定义类型的数据并读回,但通过 Hiera 进行的自动参数绑定仅适用于 classes,而不适用于定义的类型。
简而言之,由于没有在目标节点的目录中声明相关资源,所以没有创建用户(也没有报错)。你还没有给 Puppet 任何事情做。
如果你想将存储的用户数据应用到你的节点,你会想要一些类似的东西:
$user_data = lookup('accounts::user', Hash[String,Hash], 'hash', {})
$user_data.each |$user,$props| {
accounts::user { $user: * => $props }
}
这将进入与您的目标节点匹配的节点块,或者更好的是,进入由该节点块或等效项声明的 class。这么少的几行代码相当复杂,但简而言之:
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 读取您的数据是这样的:
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 }
}
}
请注意,我依赖于自动参数查找功能。请参阅下面的 link。
然后,在您的 Hiera 数据中,您将有一个名为 test::users
的密钥对应于(class 名称 "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== sysop+moduledevkey@puppetlabs.com
与显式调用 lookup
函数相比,使用自动参数查找通常是更惯用的编写 Puppet 代码的方式。
更多信息:
(*请注意 create_resources
是 "controversial"。Puppet 社区中的许多人不喜欢使用它。)