从 Terraform 说起 链接到标题

之前一直用 Terraform 管理阿里云资源:DNS 记录、安全组规则、ECS 查询。

Terraform 是优秀的基础设施编排工具,但日常运维中使用它有些痛点:

  • 操作重:改一条 DNS 记录也要跑完改 HCL → plan → apply 全套流程
  • State 维护繁琐:即使使用 OSS 后端,每次操作前要 pull state,操作后要 push state。多人操作时还要处理 lock 超时或冲突
  • 查询不便:查一条 DNS 记录,要么 terraform state list 再 grep,要么混用 aliyun CLI,反而多一套工具
  • 过设计:只有几台 ECS、几十条 DNS 记录的场景,Terraform 的"全量声明式"模型过于笨重

这些痛点本质上是因为:Terraform 是为"基础设施全生命周期管理"设计的,不是为"今天改条记录明天加个端口"设计的。

而日常运维中后者才是常态。

更轻量的方案:aliyun CLI 链接到标题

aliyun CLI 一条命令就能完成 Terraform 改 HCL → plan → apply 三件事:

# 查 DNS 记录
aliyun alidns DescribeDomainRecords --DomainName example.com

# 添加 A 记录
aliyun alidns AddDomainRecord --DomainName example.com --RR www --Type A --Value 1.2.3.4

# 更新 A 记录
aliyun alidns UpdateDomainRecord --RecordId <id> --RR www --Type A --Value 5.6.7.8

# 查安全组规则
aliyun ecs DescribeSecurityGroupAttribute --SecurityGroupId <sg-id>

找到正确的命令和参数比跑 Terraform 快得多。但问题在于:每次都记不住这些命令的参数格式。

Skill:把命令模板变成可复用的知识 链接到标题

将常用命令整理为 Skill,agent 在需要时自动加载,不需要你记忆命令格式。

文件位置:.opencode/skills/aliyun-mgr/SKILL.md

---
name: aliyun-mgr
description: 阿里云资源管理 — 通过 aliyun CLI 管理 DNS 记录、安全组规则、查询 ECS 实例
---

Skill 的核心是命令模板和操作步骤:

## 前置准备
set -a; source .env; set +a

## DNS 管理(域名 example.com)
### 列出所有记录
aliyun alidns DescribeDomainRecords --DomainName example.com

### 添加 A 记录
aliyun alidns AddDomainRecord \
  --DomainName example.com \
  --RR <hostname> --Type A --Value <目标IP>

### 更新 A 记录
aliyun alidns UpdateDomainRecord \
  --RecordId <recordId> \
  --RR <hostname> --Type A --Value <新IP>

### 批量重定向:将所有指向旧 IP 的 A 记录改为新 IP
aliyun alidns DescribeDomainRecords --DomainName example.com | \
  jq '.DomainRecords.Record[] | select(.Type == "A" and .Value == "<旧IP>") | .RecordId' -r | \
  xargs -I {} aliyun alidns UpdateDomainRecord --RecordId {} --Type A --Value <新IP>

现在当你需要操作 DNS 时,agent 看到 aliyun-mgr 的 description 匹配你的请求,自动加载 Skill 内容,然后按模板执行。你只需要说需求,不需要记命令。

Subagent:隔离执行,不污染主上下文 链接到标题

Skill 虽然解决了记命令的问题,但 aliyun CLI 的输出(整屏 JSON)会直接注入主 agent 的 context,污染对话。

这就是 Subagent 的用武之地。

文件位置:.opencode/agents/aliyun-mgr.md

---
description: 阿里云资源管理。DNS 记录增删改、安全组规则管理、ECS 实例查询。
  涉及阿里云操作时 MUST be used PROACTIVELY。
mode: subagent
permission:
  bash:
    "aliyun *": "allow"
    "set -a*": "allow"
    "source *": "allow"
    "ssh *": "allow"
    "jq *": "allow"
  edit: deny
  write: deny
---

你是一个阿里云运维助手,操作步骤参考 skill aliyun-mgr。
每次操作前先加载凭证。
执行完成后向主 agent 返回结构化结果。

Key 设计:

  • 权限隔离:只允许 aliyun CLI 和 source 命令,禁止 edit/write,不会误改项目文件
  • Context 隔离:Subagent 在独立的 context 中执行,所有 JSON 输出都在子 context 中消化,主 agent 只收到结果摘要
  • Skill 引用:Subagent 不重复写命令模板,而是引用已有的 SKILL.md,知识维持单一来源

完整执行流程 链接到标题

当你说"帮我把 example.com 的所有 DNS 记录指向新服务器"时:

主 agent(收到请求)
├── AGENTS.md → "涉及阿里云 → @aliyun-mgr"
└── 调用 @aliyun-mgr subagent
    ├── [独立 context] source .env 加载凭证
    ├── [独立 context] 读取 SKILL.md 获取命令模板
    ├── [独立 context] aliyun alidns DescribeDomainRecords
    ├── [独立 context] 逐条 UpdateDomainRecord
    ├── [独立 context] 整理结果摘要
    └── 返回主 agent:
        "已完成。更新了 5 条 A 记录:
         - gate 123.x → 5.6.7.8
         - hello 123.x → 5.6.7.8
         - rag-app 123.x → 5.6.7.8
         - home-ping 123.x → 5.6.7.8
         - 未变更指向其他 IP 的记录"

主 agent context 无污染

主 agent 看不到 aliyun CLI 的原始 JSON 输出,看不到凭证加载过程,只看到一段清晰的结果摘要。

和 Terraform 的对比 链接到标题

Terraform aliyun CLI + Skill + Subagent
操作步骤 改 HCL → plan → apply 一句话需求 → Subagent 执行
查询效率 terraform state list 或混用 CLI 直接 aliyun CLI
State 管理 OSS 后端、pull/push、lock 超时 无 state
学习成本 HCL 语法、provider 配置、state 机制 aliyun CLI 参数(agent 帮你记)
安全性 plan 预览 + apply 确认 Subagent 权限白名单
Context 影响 Terraform 输出注入主 agent Subagent 隔离,零污染
适用场景 基础设施初始化/大规模变更 日常运维/查询/临时变更

两者不互斥。Terraform 仍然适合"基础设施即代码"的全量管理场景。但如果你只是日常查个记录、加个域名、改个安全组——这套 Skill + Subagent 方案比 Terraform 轻量得多。

原则:Skill 管知识,Subagent 管执行 链接到标题

Skill 和 Subagent 各司其职:

Skill aliyun-mgr/SKILL.md     ← 知识库(命令模板、注意事项)
Subagent aliyun-mgr.md         ← 执行器(权限控制、context 隔离)
  • Skill 只放"怎么做"——命令模板、参数格式、注意事项
  • Subagent 引用 Skill,但用自己的 prompt 和权限策略
  • 修改命令模板只改 SKILL.md,不影响 Subagent 逻辑

社区有句话总结得精辟:Skills are how-to. Subagents are who-does-it.

总结 链接到标题

Terraform 是重型起重机,适合盖楼。日常运维需要的是一把趁手的螺丝刀。

Skill + Subagent 提供的价值:

  • 不需要记命令——Skill 帮你记
  • 不需要拼参数——模板就在那里
  • 不需要和 JSON 搏斗——Subagent 消化原始输出
  • 不需要维护 state——每次操作独立执行
  • 不需要担心误操作——Subagent 权限白名单兜底

用 Terraform 还是用 Agent,取决于你要做的事。一次性地创建整个 VPC + 多台 ECS + RDS,Terraform 显然合适。但如果只是"帮我把 example.com 的 DNS 全部指向新 IP",这句话比改 HCL 再 plan apply 快一个数量级。