微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在puppet中实现虚拟hiera数据,或者,如何从每台机器上的用户选择中抽象出hiera用户定义?

如何解决如何在puppet中实现虚拟hiera数据,或者,如何从每台机器上的用户选择中抽象出hiera用户定义?

我试图在 hiera 中定义虚拟用户和组数据,然后通过在每个主机的基础上定义用户列表和组列表,仅在需要它的节点上实现它。注意:我使用的是来自 puppet forge 的 accounts 模块,它利用了 hiera 中的 accounts:: 名称空间。例如,如果我创建了这个,就可以作为工作的基线:

# snippet from hiera.yaml
hierarchy:
  - name: "Users and Groups"
    glob: "UsersAndGroups/*.yaml"

# snippet from data/UsersAndGroups/webadmins.yaml
accounts::user_list:
  alice:
    uid: '999'
    gid: '999'
    comment: 'Alice User'
    shell: '/bin/bash'
  bob:
    uid: '998'
    gid: '998'
    comment: 'Bob User'
    shell: '/bin/bash'

它可以工作,但问题是,alicebob 会在所有机器上创建。我只希望它们在某些上创建。相反,我想在 hiera 中将这些数据定义为 virtual,然后使用不同的数据结构来指定应该在每台机器上实现的资源,例如: >

# snippet from data/UsersAndGroups/webadmins.yaml
accounts::user_list:
  @alice:
    uid: '999'
    gid: '999'
    comment: 'Alice User'
    shell: '/bin/bash'
  @bob:
    uid: '998'
    gid: '998'
    comment: 'Bob User'
    shell: '/bin/bash'

然后创建另一个数据结构(和对应的 puppet 类,未显示),如下所示:

# snippet from data/users_by_host/hosts.yaml
realize_accounts::by_host:
  host1.example.dom:
    - alice
    - bob
  host2.example.dom:
    - bob
  host3.example.dom:
    - alice

我已经尝试了我能想到的所有变体来完成这项工作,但到目前为止都失败了。第一个问题是虚拟资源声明。它不喜欢我使用 @ 符号。我收到错误消息:找到无法启动任何标记的字符“@”。

有人可以建议如何从应该在哪些机器上创建哪些用户的选择中抽象出用户定义吗?

解决方法

我正在尝试在 hiera 中定义虚拟用户和组数据,然后 通过定义用户列表,仅在需要的节点上实现它 和基于每个主机的组列表。

好吧,这不是没有道理。

注意:我使用的是 accounts 来自 puppet forge 的模块,它利用 accounts:: 命名空间

您可以使用 puppetlabs/accounts 模块,但如果您想坚持您的计划,则不能使用其 accounts 类来管理用户或组,因为它不提供虚拟声明这些。这是声明的 Puppet 代码的函数,而不是(直接)类消耗的任何数据的函数。

您仍然可以使用 Accounts::User 定义的类型、模块的各种自定义数据类型及其自定义函数。相对于 Puppet 的核心 User 资源类型,这些可能提供了足够的附加值,使模块值得。无论如何,您可能正在查看核心 Group 资源类型。您需要虚拟声明 Accounts::User(或 User)和 Group 资源,然后根据您的每个主机列表实现所需的资源。


但是还有其他选择。您在评论中澄清说,您的目标是集中用户和组属性的主列表,您可以从中选择每台机器的子集。在 Hiera's alias() interpolation function 的帮助下,您可以直接在 Hiera 中完成所有这些操作。

您可以使用两级(至少)级别的层次结构来执行此操作。用户和组详细信息将进入所有主机共享的层次结构级别,如果您使用它们,accounts::user_defaultsaccounts::group_defaults 可能也会进入那里。 accounts::user_listaccounts::group_list 将进入每个主机或更具体的层次结构级别,从中央列表插入元素。示例:

common.yaml

user:
  alice:
    uid: '999'
    gid: '999'
    comment: 'Alice User'
    shell: '/bin/bash'
  bob:
    uid: '998'
    gid: '998'
    comment: 'Bob User'
    shell: '/bin/bash'

host1.yaml

accounts::user_list:
  alice: "%{alias('user.alice')}"
  bob: "%{alias('user.bob')}"

host2.yaml

accounts::user_list:
  bob: "%{alias('user.bob')}"

host3.yaml

accounts::user_list:
  alice: "%{alias('user.alice')}"

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。