oslo-config-generator

oslo-config-generator 是一个用于生成各种格式的示例配置文件工具。示例配置文件列出了所有可用选项及其帮助字符串、类型、已弃用的别名和默认值。这些示例文件可以用作 oslo.config 本身的配置文件 (ini) 或由配置管理工具使用 (json, yaml)。

1.4.0 版本中添加。

4.3.0 版本变更:添加了 oslo-config-generator --format 参数,允许以其他格式输出。

用法

oslo-config-generator
   --namespace <namespace> [--namespace <namespace> ...]
   [--output-file <output-file>]
   [--wrap-width <wrap-width>]
   [--format <format>]
   [--minimal]
   [--summarize]
--namespace <namespace>

oslo.config.opts 中查询选项的选项命名空间。

--output-file <output-file>

要写入的文件路径。

默认值:

stdout

--wrap-width <wrap-width>

帮助行的最大长度。

默认值:

70

--format <format>

输出的所需格式。 ini 是可以直接与 oslo.config 配合使用的唯一格式。 jsonyaml 旨在供希望基于示例配置数据编写配置文件的第三方工具使用。有关更多信息,请参阅 生成机器可读的配置

选项:

ini, json, yaml

--minimal

生成最小必需的配置。

--summarize

仅将帮助文本的摘要输出到配置文件。为 Sphinx 文档保留更长的帮助文本。

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

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

要为具有自身选项并使用 oslo.messaging 的应用程序 myapp 生成示例配置文件,您将列出两个命名空间

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

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

$ oslo-config-generator --namespace oslo.messaging \
    --format json > oslo.messaging.conf

定义选项发现入口点

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

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

由入口点引用的可调用对象不应接受任何参数,并应返回一个 (group, [opt_1, opt_2]) 元组列表,其中 group 既可以是字符串形式的组名,也可以是 OptGroup 对象。传递 OptGroup 对象允许 list_opts 方法的消费者访问和发布组帮助。一个例子,使用两种风格

from oslo_config import cfg

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

opts2 = [
    cfg.StrOpt('baz'),
]

baz_group = cfg.OptGroup(name='baz_group'
                         title='Baz group options',
                         help='Baz group help text')
cfg.CONF.register_group(baz_group)

cfg.CONF.register_opts(opts1, group='blaa')
cfg.CONF.register_opts(opts2, group=baz_group)

def list_opts():
    # Allows the generation of the help text for
    # the baz_group OptGroup object. No help
    # text is generated for the 'blaa' group.
    return [('blaa', opts1), (baz_group, opts2)]

注意

您应该返回原始选项,而不是副本,因为默认更新挂钩依赖于返回原始选项对象。

包含入口点的模块必须可导入,即使该模块的依赖项未安装。例如,定义选项但对第三方模块具有可选依赖项的驱动程序模块,在未安装这些模块的情况下也必须可导入。为了实现这一点,可以使用 oslo.utils.importutils.try_import() 导入可选依赖项,或者可以将选项定义放在不尝试导入可选依赖项的文件中。

从其他命名空间修改默认值

有时应用程序需要覆盖库中定义的选项的默认值。在运行时,这是通过库内的 API 完成的。由于 config 生成器无法保证导入命名空间的顺序,因此我们无法确保应用程序代码可以在生成器加载库中的选项之前更改选项默认值。相反,为应用程序提供了一个单独的可选处理挂钩,以注册一个函数,以便在加载所有选项后更新默认值。

这些挂钩在单独的入口点命名空间 (oslo.config.opts.defaults) 中注册,使用与应用程序的 list_opts() 函数相同的入口点名称。

[entry_points]
oslo.config.opts.defaults =
    keystone = keystone.common.config:update_opt_defaults

警告

切勿在任何情况下使用另一个项目拥有的名称注册入口点。这样做会导致 config 生成器内项目之间出现意外的交互,并导致无法生成配置文件或示例中显示无效值。

在这种情况下,默认覆盖函数的入口点名称必须与定义应用程序选项的入口点之一匹配,才能被检测到并使用。具有多个 list_opts 函数的应用程序应使用一个在 config 生成器的输入中存在的函数,以便需要更改默认值的位置出现。例如,如果应用程序定义 foo.api 来列出与 API 相关的选项,并且需要覆盖 oslo.middleware.cors 库中的默认值,则应用程序应在 oslo.config.opts.defaults 下注册 foo.api 并指向应用程序代码空间中的一个函数,该函数更改 oslo.middleware.cors 的默认值。

更新函数不应接受任何参数。它应调用任何库中公开的 set_defaults() 函数,以覆盖其具有选项默认值的库,就像应用程序在正常启动过程中所做的那样。

from oslo_log import log

def update_opt_defaults():
    log.set_defaults(
        default_log_levels=log.get_default_log_levels() + ['noisy=WARN'],
    )

生成机器可读的配置

所有部署工具都必须解决一个类似的问题:如何在部署时为每个服务生成配置文件。为了帮助解决这个问题,oslo-config-generator 可以生成机器可读的示例配置文件,这些配置文件输出与 oslo.config 本身使用的 INI 文件相同的数据,但采用 YAML 或 JSON 格式,以便部署工具可以更轻松地使用。

重要提示

oslo-config-generator 生成的 YAML 和 JSON 格式的文件不能被 oslo.config 本身使用 - 它们仅供其他工具使用。

例如,一些 YAML 格式的输出可能如下所示

generator_options:
  config_dir: []
  config_file: []
  format_: yaml
  minimal: false
  namespace:
  - keystone
  output_file: null
  summarize: false
  wrap_width: 70
options:
  DEFAULT:
    help: ''
    opts:
    - advanced: false
      choices: []
      default: null
      deprecated_for_removal: false
      deprecated_opts: []
      deprecated_reason: null
      deprecated_since: null
      dest: admin_token
      help: Using this feature is *NOT* recommended. Instead, use the `keystone-manage
        bootstrap` command. The value of this option is treated as a "shared secret"
        that can be used to bootstrap Keystone through the API. This "token" does
        not represent a user (it has no identity), and carries no explicit authorization
        (it effectively bypasses most authorization checks). If set to `None`, the
        value is ignored and the `admin_token` middleware is effectively disabled.
        However, to completely disable `admin_token` in production (highly recommended,
        as it presents a security risk), remove `AdminTokenAuthMiddleware` (the `admin_token_auth`
        filter) from your paste application pipelines (for example, in `keystone-paste.ini`).
      max: null
      metavar: null
      min: null
      mutable: false
      name: admin_token
      namespace: keystone
      positional: false
      required: false
      sample_default: null
      secret: true
      short: null
      type: string value
    - ...
  ...
deprecated_options:
  DEFAULT:
  - name: bind_host
    replacement_group: eventlet_server
    replacement_name: public_bind_host

顶级键是

generator_options

传递给 oslo-config-generator 工具的选项

选项

提供命名空间中注册的所有选项。这些选项按其分配的 OptGroup 分组,如果未设置,则默认为 DEFAULT

有关每个选项的各种属性的信息,请参阅 oslo_config.cfg.Opt 及其子类。

deprecated_options

提供命名空间中注册的所有已弃用选项。与 options 一样,这些选项按 OptGroup 分组。

生成多个示例配置

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

[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.common
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')