Writing Skills
writing-skills
效率与协作技能,来自 obra/superpowers,查看原文获取完整用途和操作说明。
infrastructure-as-code-spec【部署与运维】AI Workspace Infra Terraform, topology, rendering, state and CMDB standards. Use when changing iac_modules, GitOps topology declarations, Terraform-backed workflows, provider modules, resource resizing, or IaC-to-Ansible handoffs. Covers YAML/Jinja rendering, state identity, environment isolation, transition-safe topology ownership, and provider pref…
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
本规范专门用于指导在 iac_modules 仓库中进行自动化与基础设施代码(IaC)建设的最佳实践与红线原则。当 AI 进行任何云原生资源的修改与新增时,必须严格遵守以下守则。
先阅读 AI Workspace Infra Repository Map。进入 iac_modules/terraform-hcl-standard/** 前必须读取其 binding AGENTS.md,它的细则优先于本通用规范。
原则: 基础设施的拓扑变量、机器规格与具体参数,绝对禁止硬编码于 HCL (Terraform) 文件中。
resources/<project>/<env>/<provider>/*.yaml;IaC 仓库只保留可复用的 Terraform 模块、模板、渲染器和 workspace/backend 代码。<project>、<env>、<provider> 三元组是声明的唯一归属,不得在多个仓库复制或双写。uat/databases.tfstate),绝不可跨环境复用状态空间。scripts/generate.py render) 结合 Jinja2 模板解析 YAML 并自动输出 .tf.json 形式的配置文件。所有针对具体环境的逻辑修改,应优先考量在 YAML 拓扑或渲染逻辑中完成,而非直接修改基础模块。--resources(或等价 RESOURCES)参数接收声明目录,路径解析失败或目录为空时立即失败;不得把声明路径写死在模块中,也不得为兼容旧路径而复制一份拓扑。原则: Terraform HCL 代码仅仅作为最底层的资源“声明书”,应保持极致的简洁和纯粹。
count、复杂的 dynamic 块与条件表达式)。如果遇到业务级的条件判断,应将其上浮至 Python Jinja2 的渲染层去决策,使最终生成的 HCL 趋近纯声明式结构。local-exec provisioner 或 null_resource 中)内嵌或编写 shell、python 等执行脚本。原则: 明确边界,解耦职责,通过标准的凭证库(Vault)与静态清单进行传递。
cmdb.json)。IaC 不负责具体的软件系统配置。resources/<project>/<env>/<provider>/**)是随环境变动的数据,两者变更频率不同,不应被同一个 ref 绑在一起。判断能否分离,看三点:声明里是否引用了模块内部标识(source =、模块路径)、渲染器是否把声明路径写死(还是作为 --resources 之类的参数传入)、生成产物目录是否签入仓库。三者都为"否"时耦合仅剩数据,可以外移;此时优先移入唯一消费者仓库,而不是新开一个仓 —— 独立成仓只在出现第二个消费者、或声明需要不同访问控制(含 SSH 公钥、完整主机拓扑)时才划算。原则: 同一份 state 在任何触发路径下,都必须被要求提供同一组资源名。
console.{{ TARGET_DOMAIN_BASE }},而不同触发路径(分支 push / 手工 dispatch / tag)对该变量取值不同,却共用同一个 workspace 与 state key,则 Terraform 会认为"旧名字的资源消失了、新名字的资源出现了",于是销毁一台再新建一台。表现是资源被反复重建、IP 漂移、已部署的服务凭空消失。sit / uat / prod 应通过 env_suffix 等后缀区分,而不是让某个环境落在另一套域名(尤其不能落在生产域名下)—— 后者既制造上面的重建问题,又会把非生产记录发布进生产 zone。原则: 缺失的拓扑变量必须让渲染失败,而不是渲染出一个"看起来对"的值。
{{ env.get('TARGET_DOMAIN_BASE', 'svc.plus') }} 这类写法会在变量缺失时静默产出一个合法但错误的域名;当各文件的 fallback 还互相矛盾(同一环境的不同文件、甚至同一台主机的两个服务域名指向不同基准)时,错误会以"部分正确"的形态存在,极难发现。一律改为 {{ env['TARGET_DOMAIN_BASE'] }}。Undefined 不抛错,缺键会渲染成空串,console-nat.{{ ... }} 变成 console-nat. —— 同样是"看起来已渲染"。因此需要在渲染器入口对必需变量做显式断言,并在报错信息里指名是哪个变量。用具名必需列表即可,不必把整个 Environment 切成 StrictUndefined(那会改变模板里所有可选变量的行为)。--resources / --workdir 之类若带默认值,一旦默认指向的文件被移动或删除,命令行少传一个参数就会走向意料之外的目标。拓扑输入应当是必填参数。plan 不是所有云变更都能执行的证明。对计划变配、快照恢复、Reserved IP、DNS 和 state import,先读取 provider 的当前事实与目标能力。state rm、import、destroy 前列出精确 address/ID,保存受保护后端已有的回滚版本或安全恢复点,并验证 state 中最终 ID。