os-collect-config 本地数据源

https://blueprints.launchpad.net/tripleo-juno-occ-local-datasource

os-collect-config 需要一个本地数据源收集器来获取配置数据。这将允许各个元素将文件放入一个已知的地点,以设置实例的初始配置数据。

目前已经存在一个 heat_local 收集器,但它使用单个硬编码路径 /var/lib/heat-cfntools/cfn-init-data。

问题描述

  • 各个元素目前无法影响实例的 os-apply-config 可用的配置,而不会相互覆盖。

  • 那些依赖于需要在镜像构建时间和实例运行时间都设置为相同值的配置值的元素,目前没有办法将构建时间使用的值传播到运行时间值。

  • 元素没有办法指定它们在运行时可能需要的配置的默认值(在配置文件模板之外)。

提议的变更

将向 os-collect-config 添加一个新的收集器类,该收集器将从可配置目录列表中的 JSON 文件中收集配置数据,默认的已知位置为 /var/lib/os-collect-config/local-data。

该收集器将返回一个 JSON 文件及其内容的列表,按传统的 C 排序规则对 JSON 文件名进行排序。例如,如果 /var/lib/os-collect-config/local-data 包含 bar.json 和 foo.json

[ (‘bar.json’, bar_content),

(‘foo.json’, foo_content) ]

这个新的收集器将在 os-collect-config 中的 DEFAULT_COLLECTORS 中首先进行配置。这意味着所有后续配置的收集器将覆盖来自本地数据源收集器的任何共享配置键。

使用此功能的元素可以将 json 文件安装到 /var/lib/os-collect-config/local-data 目录中。os-collect-config 元素将负责在构建时创建 /var/lib/os-collect-config/local-data 目录,并以 0755 权限创建它。

替代方案

OS_CONFIG_FILES

os-apply-config 中已经存在一种机制,可以通过设置 OS_CONFIG_FILES 环境变量来指定用于配置数据的任意文件。但是,这并不是理想的,因为每次调用 os-apply-config 都必须先设置 OS_CONFIG_FILES,或者需要在全局环境中设置它(例如通过 environment.d 脚本)。作为元素开发者,这并不明确。拥有一个健壮且清晰记录的位置来放置配置数据会更简单。

heat_local 收集器

已经存在一个从本地数据读取的收集器,但必须配置为读取显式的文件路径。如果多个元素想要提供本地配置数据,这无法很好地扩展,因为您必须重新配置 os-collect-config 本身。我们可以修改 heat_local 收集器以从目录读取,同时保持向后兼容性,而不是编写全新的收集器。但是,考虑到收集器实现相当简单,我建议编写一个新的收集器,以便它们保持通用目的,并具有明确的目标。

安全影响

  • 有害的元素可能会将错误的配置数据放入已知的地点。这在一定程度上得到了缓解,因为作为部署者,您应该了解并验证您正在使用的可能注入本地配置的元素。

  • 我们应该验证本地数据源文件是否不可被全局写入,并且位于 root 拥有的目录中。可以向 dib-lint 添加检查,以在镜像构建时验证这一点。可以在 os-collect-config 中添加检查,以进行实例运行时间验证。

其他最终用户影响

性能影响

将有一个额外的收集器作为 os-collect-config 的一部分运行,但其执行时间应该最短。

其他部署者影响

  • os-collect-config 中将有一个额外的配置选项,用于配置要查找配置数据的目录列表。这将有一个合理的默认值,通常不需要更改。

  • 部署者必须考虑本地数据源配置可能影响其当前应用的配置。

开发人员影响

我们需要在文档中明确何时使用此功能,以及在模板中暴露什么或通过传递配置指定什么。在镜像构建时间需要配置值,并且在实例运行时间也需要访问这些值的情况,是使用此功能的良好候选对象。

实现

负责人

主要负责人

james-slagle

工作项

  • 为 os-collect-config 编写新的收集器

  • 为新的收集器编写单元测试

  • 记录新的收集器

  • 向 dib-lint 添加检查,以验证安装到本地数据源目录的 JSON 文件是否不可被全局写入

  • 向 os-collect-config 添加检查,以验证本地数据收集器读取的 JSON 文件是否不可被全局写入,并且它们的目录由 root 拥有。

依赖项

测试

将为新的收集器编写单元测试。新的收集器最终也会在 CI 中进行测试,因为将有一个现有的元素将配置持久数据目录为 /mnt/state,它将使用此实现。

文档影响

元素将配置数据放入已知位置的能力应在 tripleo-image-elements 本身中记录,以便让大家更好地了解此功能。

参考资料