design.md 2.3 KB

Context

当前 trojan_domaincertbot_email 定义在 group_vars/all.yml 中,所有 trojan 组内的服务器共用同一域名申请 Let's Encrypt 证书。实际部署中,每台服务器通常有独立的公网 IP 和域名,需要分别为每台主机配置证书。

Goals / Non-Goals

Goals:

  • 支持在 inventory 中为每台 Trojan 服务器独立配置域名和邮箱
  • 保持向后兼容:若主机未定义域名,可回退到全局默认值或报错

Non-Goals:

  • 不支持一台服务器绑定多个域名
  • 不修改 certbot 本身的申请逻辑

Decisions

使用 inventory host variables 替代 group_vars

  • Rationale: Ansible 的变量优先级中,host variables 高于 group_vars。将 trojan_domaincertbot_emailgroup_vars/all.yml 移除,改由用户在 inventory/hosts.yml 中按主机定义,trojan role 无需修改引用方式即可生效。
  • Alternatives considered: 使用 host_vars/ 目录文件化配置 — 对于少量主机,直接在 hosts.yml 中内联定义更直观,无需额外目录。

保留 group_vars 中的默认值作为 fallback

  • Rationale: 在 group_vars/all.yml 中保留 trojan_domain: ""certbot_email: "" 作为空默认值,当某台主机未定义时,playbook 可在 role 中通过 assert 模块报错,避免使用错误域名。
  • Alternatives considered: 完全移除全局变量 — 会导致未配置域名的主机直接使用未定义变量,错误信息不清晰。

Risks / Trade-offs

  • [Risk] 现有用户已习惯在 group_vars/all.yml 中配置域名,迁移时可能遗漏
    • Mitigation: 在 inventory/hosts.yml.example 中增加显眼的 per-host 域名示例;在 role 中增加 assert 前置检查,给出清晰错误提示
  • [Risk] group_vars/all.yml 中若保留非空默认值,会被所有主机继承,导致 host variable 无法生效
    • Mitigation: 将 group_vars/all.yml 中的默认值设为空字符串,确保用户必须在 inventory 中显式配置

Migration Plan

  1. group_vars/all.yml 中移除 trojan_domaincertbot_email(或设为空字符串)
  2. inventory/hosts.yml 中为每台 trojan 服务器添加 trojan_domaincertbot_email
  3. 重新运行 playbook