0

我正在使用https://github.com/openstack/puppet-keystone来设置 OpenStack 管理/控制器节点。我需要将'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
4

1 回答 1

1

注释掉的代码声明了一个类型的资源keystone_user,而不是一个类。大概它的类型 ,keystone_user是由 puppet-keystone 模块提供的。函数族用于声明类,而include()不是资源,因此不适用于keystone_user.

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

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

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

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

例如,您的课程可能如下所示:

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

  create_resources('keystone_user', $userdata)
}

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

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

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

class mymodule::kilo2_keystone($userdata = {}) {
  # ...
}
于 2016-08-09T14:08:12.973 回答