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。
参考资料¶
- 此功能已经进行了大量的讨论
- 有一个 bug 开放,oac 控制机制对解决该 bug 有用