oslo-config-generator

https://blueprints.launchpad.net/oslo.config/+spec/oslo-config-generator

为 oslo.config 添加一个命令行实用工具,用于生成示例配置文件,它将取代 oslo-incubator 中的生成器实用工具。

问题描述

对这种实用工具的需求已被充分理解

  • 包含所有可用配置选项列表、相关的帮助文本、类型和注释掉的默认值的示例配置文件,可以使操作员更容易发现和理解配置选项。

  • 操作员需要能够自行运行该工具,而不是试图在 git 中维护这些自动生成的配置文件。

当前工具存在的问题包括:

  • 加载模块并期望它们使用 cfg.CONF 注册它们的选项速度慢、奇怪且容易出错。

  • 这种对 cfg.CONF 的依赖会延续对全局对象的使用。

  • 生成器没有关于选项属于哪个组的信息,因此它只能猜测 - 这可能导致人们避免在多个组中添加“debug”选项,例如。

  • 由于生成器没有关于选项由哪个服务使用的信息,因此无法处理“拆分配置文件” - 例如,某些配置选项仅在 glance-api.conf 中有意义,而其他选项仅在 glance-registry.conf 中有意义。

  • 我们已经有一种模式,即在 oslo.config.opts 入口点命名空间下显式注册配置选项,但目前除了 oslo.messaging 之外,它没有被使用。

提议的变更

我们将向 oslo.config 包添加一个名为 oslo-config-generator 的示例配置文件生成器实用工具。

这个新的实用工具将采用与 oslo-incubator 中当前生成器截然不同的发现方法,即我们远离魔术,转向对生成器看到的选项进行更显式的控制。

要为 oslo.messaging 生成示例配置文件,您将运行

$> oslo-config-generator --namespace oslo.messaging > oslo.messaging.conf

生成的示例列出了所有可用选项,以及它们的帮助字符串、类型、弃用别名和默认值。

--namespace 选项指定在 ‘oslo.config.opts’ 入口点命名空间下注册的入口点名称。例如,在 oslo.messaging 的 setup.cfg 中,我们有

[entry_points]
oslo.config.opts =
    oslo.messaging = oslo.messaging.opts:list_opts

入口点引用的可调用对象不应接受任何参数,并应返回 (group_name, [opt_1, opt_2]) 元组的列表。例如

opts = [
    cfg.StrOpt('foo'),
    cfg.StrOpt('bar'),
]

cfg.CONF.register_opts(opts, group='blaa')

def list_opts():
    return [('blaa', opts)]

您可能选择返回选项的副本,以便无法修改返回值以进行恶意目的

def list_opts():
    return [('blaa', copy.deepcopy(opts))]

单个代码库可能有多个程序,每个程序使用代码库注册的总选项集的一个子集。在这种情况下,您可以注册多个入口点

[entry_points]
oslo.config.opts =
    nova.common = nova.config:list_common_opts
    nova.api = nova.config:list_api_opts
    nova.compute = nova.config:list_compute_opts

并为每个程序生成一个特定的配置文件

$> oslo-config-generator --namespace oslo.messaging \
                         --namespace nova.common \
                         --namespace nova.api > nova-api.conf
$> oslo-config-generator --namespace oslo.messaging \
                         --namespace nova.common \
                         --namespace nova.compute > nova-compute.conf

为了使这更方便,您可以使用配置文件来描述您的配置文件

$> cat > config-generator/api.conf <<EOF
[DEFAULT]
output_file = etc/nova/nova-api.conf
namespace = oslo.messaging
namespace = nova.common
namespace = nova.api
EOF
$> cat > config-generator/compute.conf <<EOF
[DEFAULT]
output_file = etc/nova/nova-compute.conf
namespace = oslo.messaging
namespace = nova.compute
namespace = nova.compute
EOF
$> oslo-config-generator --config-file config-generator/api.conf
$> oslo-config-generator --config-file config-generator/compute.conf

配置选项的默认运行时值并不总是包含在示例配置文件中最合适的值 - 例如,与其包含生成配置文件机器的 IP 地址或主机名,您可能希望包含类似 ‘10.0.0.1’ 的内容。为了便于操作,可以为选项提供 ‘sample_default’ 属性

cfg.StrOpt('base_dir'
           default=os.getcwd(),
           sample_default='/usr/lib/myapp')

备选方案

另一种选择是坚持使用当前生成器的自动选项发现方法,并尝试解决其不足之处。这已经是我们走过的道路,但一直是一个令人沮丧的根源。

Impact on Existing APIs

生成器主要预期通过 oslo-config-generator 命令行界面使用,但它也可以通过公共 generate(conf) API 使用。还有一个 register_cli_opts(conf) API,以便调用 generate() 的调用者可以在之前设置配置选项。

安全影响

没有安全影响。

性能影响

生成器完成得更快,因为它需要加载更少的模块才能发现选项。

Configuration Impact

没有配置影响。

开发人员影响

显式宣传配置选项的方法意味着开发人员需要手动维护代码中可用配置选项的列表,以便它可以由注册为 oslo.config.opts 入口点的可调用对象返回。

这不应该是一个巨大的负担,因为它通常是一个引用现有选项列表的列表。

但是,某种自动辅助功能来帮助捕获需要更新列表的情况将非常有帮助。确切如何实现还有待观察。

实现

负责人

主要负责人

markmc

其他贡献者

里程碑

juno-2

工作项

  • 将 oslo-config-generator 添加到 oslo.config。

  • 在 oslo.config.opts 下宣传 keystone auth_token 选项。

  • 演示 Nova、Ceilometer、Glance 或 Heat 等服务如何采用这个新的实用工具。

  • 从 oslo-incubator 中删除旧的生成器。

  • 设置 infra 作业,将示例配置文件发布到类似 docs.openstack.org 的地方。

  • 考虑添加类似 ‘python setup.py sample_config’ 的内容。

孵化

新的实用工具取代了 oslo-incubator 中的实用工具。

采用

预计所有应用程序都将采用它。

oslo.config。

请注意,这意味着 oslo.config 具有对 stevedore 的依赖关系。

预计 API 稳定

API 非常精简,预计在合并时将保持稳定。

文档影响

操作员指南将受益于有关如何使用该实用工具的说明。

依赖项

无。

参考资料

注意

本作品采用知识共享署名 3.0 非移植许可协议授权。 http://creativecommons.org/licenses/by/3.0/legalcode