通过 hiera 从 openstack/puppet-keystone 定义 keystone_user?

define keystone_user from openstack/puppet-keystone via hiera?

我正在使用 https://github.com/openstack/puppet-keystone 设置 OpenStack management/controller 节点。我需要将 'glance' 用户添加到 keystone。我想在我的 hiera 数据中尝试并做尽可能多的事情,这样我的清单就会很简单。

这是我的清单:

class kilo2_keystone {
    include controller_ceph
    include keystone
    include keystone::config
    include keystone::user
#    keystone_user { 'glance':
#        ensure => present,
#    }

}

注释掉的部分有效,但我希望能够 include keystone::user 并在我的 hiera 数据中提供参数,如下所示:

keystone::user: 
   "%{hiera('glance_admin_user')}":
      ensure: present

但是当我在我的节点上 运行 puppet agent -t 时,我得到这个错误:

Could not find class ::keystone::user

commented-out 代码声明了类型为 keystone_user 资源 ,而不是 class。据推测,它的类型 keystone_user 是由 puppet-keystone 模块提供的。 include() 系列函数用于声明 classes,而不是资源,因此它们不适用于 keystone_user.

有不止一种方法可以继续。如果您不希望做比声明一个或多个 keystone_user 存在更复杂的事情,那么我建议为您的 class 提供一个用户名参数,您可以通过 Hiera 赋值:

class kilo2_keystone($usernames = []) {
  include controller_ceph
  include keystone
  include keystone::config

  keystone_user { $usernames:
    ensure => present,
  }
}

另一方面,如果您希望能够声明多个用户,每个用户都有自己的一组属性,那么 create_resources() 函数可能是阻力最小的路径。您仍然希望参数化 class 以便它通过自动数据绑定从 Hiera 获取数据,但现在您希望数据的结构不同,如 create_resources() 文档中所述:作为哈希映射资源标题(用户名,在您的情况下)到资源参数的内部哈希到相应的值。

例如,您的 class 可能如下所示:

class kilo2_keystone($userdata = {}) {
  include controller_ceph
  include keystone
  include keystone::config

  create_resources('keystone_user', $userdata)
}

此 class 的相应数据可能如下所示:

kilo2_keystone::userdata:
  glance:
    ensure: present
    enabled: true
  another_user:
    ensure: absent

另请注意,您将 kilo2_keystone class 置于顶部范围。你真的应该把它放在一个模块中并将它分配给该模块的名称空间。后者看起来像这样:

class mymodule::kilo2_keystone($userdata = {}) {
  # ...
}