os-apply-config 的控制机制

问题描述

我们需要在 os-apply-config (oac) 中建立一个控制机制。例如,这可以用于

  • 不创建空的目标文件

  • 设置目标文件的权限

提议的变更

基本方案是将 oac 参数化为包含控制数据的映射(也称为字典)。这些映射将作为 YAML 格式的伴随控制文件提供。每个文件将以其关联的模板命名,并带有“.oac”后缀。例如,文件“abc/foo.sh”将由“abc/foo.sh.oac”控制。

只有与模板文件匹配的控制文件才会被尊重,也就是说,文件“foo”必须存在,控制文件“foo.oac”才能生效。将添加一个 dib-lint 检查,以查找缺少匹配模板的控制文件,因为这可能表明模板已移动,而其控制文件未随之移动。

目录也可以有控制文件。在这种情况下,控制文件必须位于目录内部,并且命名为“oac”。任何名为“oac”或带有控制文件后缀“.oac”的文件都不会被视为模板。

控制文件中的 YAML 必须求值为 null 或映射。前者允许整个映射被注释掉。映射中存在未识别的键是一个错误。文件和目录控制键是不同的,但可以共享名称。如果它们确实共享名称,它们也应该共享相似的语义。

示例控制文件

key1: true
key2: 0700
# comment
key3:
  - 1
  - 2

为了使设计具体化,最初将提供一个文件控制键:allow_empty。它期望一个布尔值,默认值为 true。如果为 true,oac 的行为将与今天一样。否则,如果在替换后模板体为空,则不会在目标路径上创建文件,并且那里的任何现有文件都将被删除。

allow_empty 也可以用作目录控制键。同样,它将期望一个布尔值,默认值为 true。给定一个嵌套结构“A/B/C/foo”,其中“foo”是一个空文件,allow_empty=false

  • C 具有 allow_empty=false:A/B/ 被创建,C 不被创建。

  • B 具有 allow_empty=false:A/B/C/ 被创建。

  • B 和 C 具有 allow_empty=false:仅创建 A/。

预计在批准此规范后不久,将提出额外的键。

替代方案

可以使用围栏标题而不是单独的控制文件。虽然这有助于控制数据的可见性,但它与目录控制文件(如果稍后添加了符号链接)的控制文件不太一致。

目录控制文件名一直是讨论的主题。控制“foo/”的替代方案包括

  • foo/.oac(使用未修改的“ls”不可见)

  • foo/oac.control(较长)

  • foo/control(通用)

  • foo.oac(如果 foo/ 为空,则无法存储在 git 中)

  • foo/foo.oac(掩盖了 foo/foo 的控制文件)

安全影响

没有。用户已经完全控制目标环境。例如,他们可以使用 allow_empty 键删除关键文件。但是,他们已经可以简单地提供一个 bash 脚本来执行相同的操作。此外,生成的镜像将在他们的(或他们的客户)硬件上运行,因此他们将自食其果。

其他最终用户影响

无。

性能影响

无。

其他部署者影响

无。

开发人员影响

将不再能够使用 oac 创建名为“oac”或带有后缀“.oac”的文件。这不会影响 diskimage-builder 或 tripleo-image-elements 中当前存在的任何元素。

实现

负责人

主要负责人

alexisl(也称为 lxsli,Alexis Lee)

其他贡献者

工作项

  • 支持 oac 中的文件控制文件

  • 支持 allow_empty 文件控制键

  • 添加 dib-lint 检查,用于检测分离的控制文件

  • 支持 oac 中的目录控制文件

  • 支持 allow_empty 目录控制键

  • 更新 oac README

依赖项

无。

测试

可以使用标准单元测试技术轻松测试此更改。

文档影响

必须更新 oac README。

参考资料

此功能已经进行了大量的讨论

https://blueprints.launchpad.net/tripleo/+spec/oac-header

有一个 bug 开放,oac 控制机制对解决该 bug 有用

https://bugs.launchpad.net/os-apply-config/+bug/1258351