Puppet 6和模块puppetlabs /帐户不会以Hiera YAML格式创建用户帐户

时间:2019-02-25 17:02:54

标签: yaml puppet hiera

运行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

pdist2

2 个答案:

答案 0 :(得分:4)

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定义类型的实例

    • 使用(外部)哈希键作为用户名,
    • 以及与该键关联的值,作为从参数名称到参数值的映射。

答案 1 :(得分:3)

这里有一些问题。

您在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宝石(建议使用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

此外,除了约翰提到的内容外,读取数据中最简单的类是:

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== sysop+moduledevkey@puppetlabs.com

与显式调用lookup函数相比,使用自动参数查找通常是编写Puppet代码的更惯用的方式。

有关更多信息:

(** create_resources是“有争议的”。Puppet社区中的许多人都不想使用它。)