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 配合使用的唯一格式。json和yaml旨在供希望基于示例配置数据编写配置文件的第三方工具使用。有关更多信息,请参阅 生成机器可读的配置。- 选项:
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.messaging 的 setup.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')