我正在使用https://github.com/openstack/puppet-keystone设置OpenStack的管理/控制节点。我需要添加"glance"用户到keystone。我想尝试做尽可能多的我可以在我的层次数据,所以我的清单将是简单的。
这是我的清单:
class kilo2_keystone {
include controller_ceph
include keystone
include keystone::config
include keystone::user
# keystone_user { 'glance':
# ensure => present,
# }
}
注释掉的部分工作,但我希望能够做include keystone::user
,并提供参数在我的层次数据,像这样:
keystone::user:
"%{hiera('glance_admin_user')}":
ensure: present
但是当我在我的节点上运行puppet agent -t
时,我得到这个错误:
Could not find class ::keystone::user
注释掉的代码声明了一个类型为keystone_user
的资源,而不是一个类。假定它的类型keystone_user
是由puppet-keystone模块提供的。include()
系列函数用于声明类,而不是资源,因此它们不适用于keystone_user
。
有不止一种方法可以继续。如果您不想要比声明一个或多个keystone_user
更复杂的事情,那么我建议为您的类提供一个用户名参数,您可以通过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 = {}) {
# ...
}