fix(chv-guest): seed user-data 不再自带 runcmd,防顶掉镜像钩子
sync-test 首轮实测:seed 的 runcmd 整体替换了镜像 /etc/cloud/cloud.cfg.d/99-chv-sync.cfg 的 runcmd(cloud-init 不跨配置类型合并,merge_how 救不了 conf.d),chv-sync boot 钩子静默不跑、启动 clone 没跑。 - hostkeys.build_seed_user_data 不再发 runcmd;chmod 600 已由 write_files 0600 保证;sshd 重启搬到镜像自己的 runcmd(cloud-final,sshd 首次启动之后)。 - build.sh:99-chv-sync.cfg 的 runcmd 增加 restart ssh 一行(在 chv-sync boot 之前)。 - README §5 同步硬性要求;回归测试 2 项(无 runcmd、 带 secret 仍单 write_files 列表无 runcmd)。 - 针对性 147 项全过(test_chv_to10/gaps/secfix/fix/ arch95plus)。 本地提交,未推未部署。
This commit is contained in:
1 parent
cbd5ab7c0b
commit
67ca0b86cd
4 files changed
+71
-10
No files matched your search
+21
-8
@@ -128,7 +128,22 @@ def build_seed_user_data(private_key_text: str, public_key_text: str) -> str:
|
||||
|
||||
注意:user-data 本身含私钥,只写进 per-VM seed 目录
|
||||
(0600),随 VM 销毁而删,绝不进镜像、绝不进日志、
|
||||
绝不进任务 prompt 落库。"""
|
||||
绝不进任务 prompt 落库。
|
||||
|
||||
根因禁令(sync-test 残留,2026-11-06 实测):seed 的
|
||||
user-data 里绝不能带 `runcmd:`。cloud-init 不跨配置
|
||||
类型合并——user-data 的 `runcmd` 会整体替换掉镜像
|
||||
`/etc/cloud/cloud.cfg.d/` 里的 `runcmd`(`merge_how`
|
||||
只合并多个 user-data 段,救不了 conf.d,见 cloud-init
|
||||
合并文档);旧版 seed 自带的 chmod + restart ssh 两行
|
||||
就这样顶掉了镜像 `99-chv-sync.cfg` 的 `chv-sync boot`
|
||||
钩子,首轮启动 clone 静默不跑。去掉的两行不需要
|
||||
补在 seed 里:chmod 600 已由 write_files 的
|
||||
permissions '0600' 保证;sshd 重启已搬到镜像自己的
|
||||
runcmd(`99-chv-sync.cfg`,cloud-final 阶段,sshd
|
||||
首次启动之后),那条是存活的列表,不会被 seed 覆盖。
|
||||
任何人再给 seed 加 runcmd 即重犯此 bug,回归测试
|
||||
`test_seed_user_data_has_no_runcmd` 会拦住。"""
|
||||
if not private_key_text or not public_key_text:
|
||||
raise ValueError("host key 对缺失,无法生成 seed")
|
||||
lines = [
|
||||
@@ -150,11 +165,6 @@ def build_seed_user_data(private_key_text: str, public_key_text: str) -> str:
|
||||
]
|
||||
for line in public_key_text.rstrip("\n").split("\n"):
|
||||
lines.append(" " + line)
|
||||
lines += [
|
||||
"runcmd:",
|
||||
" - chmod 600 /etc/ssh/ssh_host_ed25519_key",
|
||||
" - systemctl restart ssh || service ssh restart || true",
|
||||
]
|
||||
return "\n".join(lines) + "\n"
|
||||
|
||||
|
||||
@@ -183,8 +193,11 @@ def write_seed(seed_dir: str, vm_name: str, private_key_text: str,
|
||||
if secret_env:
|
||||
# 注意:只能把条目并进已有的 write_files 列表,绝不能
|
||||
# 再写一个 write_files: 键(YAML 重复键会覆盖掉 host
|
||||
# key 的两条写文件条目,预置即失效)。条目插在 runcmd
|
||||
# 段之前、仍属同一列表。
|
||||
# key 的两条写文件条目,预置即失效)。seed 自 2026-11-07
|
||||
# 起不再带 runcmd 段(见 build_seed_user_data 的根因
|
||||
# 禁令),所以正常走 else 分支追加到 write_files 列表
|
||||
# 末尾;marker 分支只作防御(将来模板若恢复 runcmd,
|
||||
# 条目仍插在其前、仍属同一列表)。
|
||||
lines = [
|
||||
" - path: %s" % GUEST_ENV_PATH,
|
||||
" permissions: '0600'",
|
||||
|
||||
Reference in new issue
Block a user