1 个不稳定版本
0.1.0 | 2023年5月5日 |
---|
#12 in #hostname
24KB
422 行
cloud-seed
cloud-seed 是 cloud-init 的一个非常简单的替代品。它可以设置主机名并根据用户数据中提供的指令写入文件。
动机
启动服务器应该是确定的:使用相同配置启动相同镜像应该得到相同的结果。为此,服务器镜像应包含服务器功能所需的全部软件和基本配置。通过启动时的脚本安装软件或执行配置会引入失败或非确定性的机会。要更新软件或基本更改服务器的配置,应构建新的镜像。镜像构建过程应该是自动化的、无摩擦的,以便在必要时快速部署。
cloud-seed 存在是因为通常需要向已准备就绪的镜像提供一些“种子”数据:由于这些值在各个服务器之间有所不同,因此不应将其烧录到镜像中。
用户数据格式
用户数据由 #cloud-seed
开头,后跟一个换行符,然后是一个 JSON 对象组成。整个用户数据(包括 #cloud-seed
标头)可以可选地使用 gzip 进行压缩,这将被自动检测。
JSON 对象目前定义了两个键:files
,它是一个文件对象的数组,以及 hostname
,它是一个字符串。两者都是可选的。所有其他键都将被忽略。
例如
#cloud-seed
{
"hostname": "myserver",
"files": [
{
"path": "/etc/foobar/foobar.conf",
"content": "Zm9vYmFyCg==",
"encoding": "base64",
"owner": "root:root",
"permissions": "0644",
"append": false
}
]
}
如果设置了 hostname
,则当 cloud-seed 运行时,它将被传递给 sethostname(2)
以设置系统主机名。为此,cloud-seed 必须以 root
身份运行或具有 CAP_SYS_ADMIN
能力。
如果设置了 files
,则数组中的每个对象都描述了将由 cloud-seed 写入的文件。支持的字段包括
字段 | 描述 |
---|---|
path |
必需。要写入的文件的路径。根据需要创建父目录。相对路径相对于 cloud-seed 的工作目录进行解释。 |
content |
要写入的内容,根据 encoding 键进行编码。默认为无内容。 |
encoding |
内容值的编码。可以是 plain (默认值)、base64 或 base64gzip 。而不是使用 base64gzip 编码,可以考虑使用 gzip 对整个用户数据进行压缩。 |
所有者 |
应拥有文件的用户和组,格式为 user:group 。默认为运行 cloud-seed 的用户及其主要组。 |
权限 |
创建文件时应使用的模式,指定为一个八进制字符串。默认为 0644 。如果文件已存在,cloud-seed 不会更改其模式。 |
追加 |
如果 true ,当文件已存在时,content 将被追加到文件中。如果 false (默认值),则在写入内容之前将截断文件。 |
关于敏感数据的说明
云系统上的用户数据通常不适用于存储敏感数据,因此不应使用像 cloud-seed(或 cloud-init)这样的工具在服务器上播种凭据或其他敏感数据。使用功能,如实例角色和临时凭据来授予服务器权限。
支持的数据源
cloud-seed 当前可以从以下云提供商的元数据服务器获取用户数据:
- 阿里云
- AWS
- Exoscale
- 谷歌云
- OpenStack
- Oracle Cloud
- Vultr
欢迎提交拉取请求以添加其他数据源。
DMI 数据用于自动检测 cloud-seed 运行在哪个云环境中。
与 cloud-init 的兼容性
为了与 cloud-init 兼容,支持 YAML,接受 #cloud-config
前导字符,接受 fqdn
作为 hostname
的别名,接受 write_files
作为 files
的别名。每个文件的 encoding
字段也支持 cloud-init 的值 b64
、gz+base64
、gzip+base64
、gz+b64
和 gzip+b64
作为对应 cloud-seed 值的别名。
忽略所有其他 cloud-init 指令。如果不需要 cloud-init 兼容性,建议使用上面描述的 cloud-seed 的 JSON 格式。
许可
MIT 或 Apache 2.0,任选其一。
依赖关系
~12–27MB
~405K SLoC