## Context 当前 `trojan_domain` 和 `certbot_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_domain` 和 `certbot_email` 从 `group_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_domain` 和 `certbot_email`(或设为空字符串) 2. 在 `inventory/hosts.yml` 中为每台 trojan 服务器添加 `trojan_domain` 和 `certbot_email` 3. 重新运行 playbook