---
slug: cloud-ops-orchestrator
name: cloud-ops-orchestrator
version: 1.0.1
displayName: 云运维编排器
summary: 用 Terraform+Ansible 编排多云基础设施，内置漂移检测、变更预演与安全销毁，杜绝误删.
license: Proprietary
description: 云运维编排器为 AI Agent 提供以基础设施即代码（IaC）为核心的多云运维能力。它明确划分 Terraform（资源生命周期）与 Ansible（系统配置）的职责边界，覆盖
  AWS、GCP、Azure 三大云，并内置状态漂移检测、变更预演（plan）、安全销毁（带保护期）、凭证隔离与回滚机制。Use when 需要安全检测、合规审计、漏洞扫描、加密防护时使用。不适用于渗透测试未授权目标.
tags:
  - 自动化
  - 云运维
  - 基础设施即代码
  - 云计算
  - DevOps
  - 基础设施
  - prod
  - terraform
tools:
  - read
  - exec
  - write
homepage: ""
# 定价元数据
category: "Operations"
---
# 云运维编排器

用声明式代码管理多云基础设施，把"手动点控制台"变成"可审计、可回滚、可预演"的工程化流程。本技能解决五个核心痛点：**职责混淆**（Terraform/Ansible 用错地方）、**状态漂移**（线上与代码不一致）、**误删灾难**（destroy 不可逆）、**凭证泄露**（明文 AK/SK）、**环境串味**（dev 改动影响 prod）.
## 职责边界红线

这是最常出错的地方。明确分工：

| 维度 | Terraform 负责 | Ansible 负责 |
|---|------------|----------|
| 对象 | 云资源生命周期 | 主机内配置 |
| 操作 | 创建/修改/销毁资源 | 安装软件/改配置/启服务 |
| 状态 | 有状态（state 文件） | 无状态（幂等剧本） |
| 典型 | VPC、EC2、RDS、LB | Nginx 配置、应用部署、用户管理 |
| 禁止 | ❌ 不要用 TF 装软件 | ❌ 不要用 Ansible 建云资源 |

**一句话原则**：Terraform 声明"有什么"，Ansible 声明"里面跑什么"。两者通过 Terraform 输出的主机清单（inventory）衔接.
## 快速开始

1. 阅读## 核心能力章节了解skill功能
2. 按## 依赖说明配置环境
3. 执行所需能力对应的命令
4. 参考## 错误处理章节处理异常
5. 查看## FAQ解答常见疑问

### 前置检查

## 输入格式
| 参数名 | 类型 | 必填 | 说明 |
|:-----|:-----|:-----|:-----|
| input | string | 是 | 云运维编排器处理的输入数据或指令 |
| options | object | 否 | 附加配置选项,如模式选择、格式偏好等 |
| callback_url | string | 否 | 异步处理完成后的回调通知URL |

```bash
# 验证工具链
terraform version   # >= 1.5
ansible --version   # >= 2.15
aws --version       # 或 gcloud / az 版本
# ...
# 验证凭证（不要把凭证写进代码）
aws sts get-caller-identity   # AWS
gcloud auth list              # GCP
az account show               # Azure
```

### 标准工作流（plan → review → apply）

```bash
（请参考skill目录中的脚本文件） init aws prod          # 初始化 prod 环境后端
（请参考skill目录中的脚本文件） plan prod              # 预演变更，生成报告
（请参考skill目录中的脚本文件） review prod            # 人工/Agent 审查 plan 输出
（请参考skill目录中的脚本文件） apply prod             # 执行变更（需 --confirm）
```

### 安全销毁（带保护期）

```bash
（请参考skill目录中的脚本文件） destroy prod           # 默认 dry-run，只列出将删除的资源
（请参考skill目录中的脚本文件） destroy prod --confirm # 二次确认后才真正销毁
```

prod 环境强制 72 小时保护期：距离上次 apply 不足 72 小时的资源拒绝销毁，除非加 `--override-lock`.
## 命令参考

```
（请参考skill目录中的脚本文件） <command> <env> [options]
# ...
命令:
  init      初始化工作目录与 Terraform 后端
  plan      预演变更（dry-run）
  review    生成人类可读的变更摘要
  apply     执行变更（需 --confirm）
  destroy   销毁资源（默认 dry-run，需 --confirm，prod 有保护期）
  drift     检测状态漂移
  reconcile 修正漂移（apply 差异）
  config    运行 Ansible 配置
  output    导出主机清单给 Ansible
  cost      估算资源成本
# ...
环境: dev | staging | prod
通用选项: --confirm, --dry-run, --module <name>, --override-lock
```

## 目录结构（推荐）

```
infra/
├── （请参考skill目录中的脚本文件）              # 编排入口
├── envs/
│   ├── dev/                  # 开发环境
│   │   ├── backend.tf        # 状态后端
│   │   ├── terraform.tfvars  # 环境变量
│   │   └── providers.tf
│   ├── staging/
│   └── prod/
├── modules/                  # 可复用模块
│   ├── web-app/
│   ├── database/
│   ├── k8s-cluster/
│   └── serverless/
├── ansible/
│   ├── inventories/          # 由 terraform output 生成
│   ├── playbooks/
│   └── roles/
└── policies/                 # 策略与守卫
    ├── destroy-guard.json
    └── drift-baseline.json
```

## 漂移检测工作流

漂移（drift）指线上实际资源与 Terraform state 不一致，常因手动改控制台引起.
```bash
# 检测漂移（只读，不改任何东西）
（请参考skill目录中的脚本文件） drift prod
```

输出示例：

```
DRIFT REPORT - prod (2026-07-18 09:00)
──────────────────────────────────────
[CHANGED] aws_security_group.web
  ingress[0].from_port: 443 → 8443  (手动修改)
[MISSING] aws_s3_bucket.logs
  资源在 state 中但云上不存在（可能被手动删除）
[EXTRA] aws_instance.bastion-2
  云上存在但 state 中无（手动创建未纳入 IaC）
# ...
建议:
  - reconcile: 用代码覆盖线上（推荐用于配置类漂移）
  - import:    把手动资源纳入 IaC（推荐用于未纳管资源）
  - ignore:    标记为已知例外
```

```bash
# 修正漂移（把线上拉回代码定义）
（请参考skill目录中的脚本文件） reconcile prod --confirm
# ...
# 或反过来：把手动资源纳入 IaC
（请参考skill目录中的脚本文件） import prod aws_instance.bastion-2 i-xxxxx
```

## 变更预演报告

`plan` 命令不仅输出 Terraform 原始日志，还生成结构化摘要，供 Agent 或人审：

```bash
（请参考skill目录中的脚本文件） plan prod
```

```json
{
  "env": "prod",
  "summary": {
    "add": 3,
    "change": 1,
    "destroy": 0
  },
  "resources": [
    {"action": "create", "type": "aws_rds_instance", "name": "primary", "risk": "medium"},
    {"action": "create", "type": "aws_security_group", "name": "db", "risk": "low"},
    {"action": "update", "type": "aws_lb_listener", "name": "https", "risk": "high", "note": "修改监听端口将导致短暂中断"}
  ],
  "cost_delta": "+$340/月",
  "requires_confirm": true
}
```

`risk` 字段帮助 Agent 决定是否需要人工确认。high 风险变更默认拒绝自动 apply.
## 环境隔离矩阵

| 环境 | 后端 | 凭证 | 保护期 | 自动 apply |
|---:|---:|---:|---:|---:|
| dev | 本地文件 | 个人 IAM | 无 | 允许 |
| staging | S3+锁 | CI IAM | 2 小时 | 允许（CI 触发） |
| prod | S3+DynamoDB 锁 | 专用 IAM（最小权限） | 72 小时 | 禁止，必须人工确认 |

环境之间通过独立的 state 后端和 IAM 角色物理隔离，避免 dev 的 plan 误读 prod 的 state.
## 凭证管理（防泄露）

**绝对禁止**：把 `AWS_ACCESS_KEY_ID` 写进 `.tf` 文件或提交到 Git.
推荐方式（按优先级）：

1. **环境变量/Profile**（本地开发）：
```bash
export AWS_PROFILE=prod-admin
# 或
export AWS_ACCESS_KEY_ID=xxx
export AWS_SECRET_ACCESS_KEY=xxx
```

2. **CI OIDC**（推荐，无长期密钥）：
```hcl
# CI 通过 OIDC 临时获取凭证，无需存储 AK/SK
provider "aws" {
  # 凭证由 CI 运行时注入
}
```

3. **Vault 引用**（团队共享）：
```bash
export AWS_ACCESS_KEY_ID=$(vault read -field=access_key secret/cloud/prod)
```

`.gitignore` 必须包含：
```
*.tfvars.local
*.tfstate
*.tfstate.*
.cr-credentials/
```

## 模块模板

### Web 应用（含 LB + ASG）

```hcl
module "web_app" {
  source = "./modules/web-app"
  name   = "api"
  env    = "prod"
  instance_count = 3
  min_size = 2
  max_size = 6
  health_check_path = "/health"
  vpc_id   = module.network.vpc_id
  subnets  = module.network.private_subnets
}
```

### 数据库（含只读副本与备份）

```hcl
module "database" {
  source = "./modules/database"
  engine = "postgres"
  version = "15"
  instance_class = "db.r6g.large"
  allocated_storage = 200
  backup_retention = 30
  multi_az = true
  read_replica_count = 1
}
```

### Kubernetes 集群

```hcl
module "k8s" {
  source = "./modules/k8s-cluster"
  kubernetes_version = "1.28"
  node_groups = {
    general = { instance_type = "t3.large", desired = 3, min = 2, max = 5 }
    spot    = { instance_type = "t3.medium", desired = 2, min = 0, max = 10, capacity_type = "spot" }
  }
}
```

### Serverless 函数

```hcl
module "serverless" {
  source = "./modules/serverless"
  runtime = "python3.11"
  memory = 512
  timeout = 30
  log_retention = 14
}
```

## Terraform 与 Ansible 衔接

Terraform 建好主机后，输出 inventory 给 Ansible：

```bash
# 1. Terraform 输出主机信息
（请参考skill目录中的脚本文件） output prod > ansible/inventories/prod.yml
# ...
# 2. Ansible 配置主机
（请参考skill目录中的脚本文件） config prod --playbook site.yml
```

inventory 生成模板：

```yaml
all:
  children:
    web:
      hosts:
        web-0: { ansible_host: 10.0.1.10, ansible_user: ec2-user }
        web-1: { ansible_host: 10.0.1.11, ansible_user: ec2-user }
    db:
      hosts:
        db-primary: { ansible_host: 10.0.2.10 }
```

## 场景化指南

### 场景 A：新项目首次交付

```bash
（请参考skill目录中的脚本文件） init aws dev
（请参考skill目录中的脚本文件） plan dev --module web-app
（请参考skill目录中的脚本文件） apply dev --confirm
（请参考skill目录中的脚本文件） output dev
（请参考skill目录中的脚本文件） config dev --playbook bootstrap.yml
```

### 场景 B：生产扩容

```bash
# 修改 terraform.tfvars: instance_count = 5
（请参考skill目录中的脚本文件） plan prod              # 确认只增不减
（请参考skill目录中的脚本文件） review prod            # 检查风险等级
（请参考skill目录中的脚本文件） apply prod --confirm   # 执行
```

### 场景 C：成本优化清理

```bash
# 识别闲置资源
（请参考skill目录中的脚本文件） cost dev --idle
# 销毁（dev 无保护期）
（请参考skill目录中的脚本文件） destroy dev --confirm
```

### 场景 D：灾备切换

```bash
# 提升只读副本为主
（请参考skill目录中的脚本文件） plan prod --module database --promote-replica
（请参考skill目录中的脚本文件） apply prod --confirm
# 切换 DNS
（请参考skill目录中的脚本文件） config prod --playbook failover.yml
```

## 销毁保护机制（防误删）

`destroy` 命令的多层防护：

1. **默认 dry-run**：不加 `--confirm` 只列出将删除的资源，不执行.
2. **保护期检查**：prod 环境资源创建后 72 小时内拒绝销毁.
3. **资源白名单**：`policies/destroy-guard.json` 标记的关键资源（如生产数据库）强制要求 `--override-lock`.
4. **依赖顺序**：按依赖反向销毁，避免"删了 VPC 还留着 EC2".
```json
// policies/destroy-guard.json
{
  "protected_resources": [
    {"type": "aws_rds_instance", "pattern": "prod-*", "reason": "生产数据库"},
    {"type": "aws_s3_bucket", "pattern": "backup-*", "reason": "备份桶"}
  ],
  "prod_lock_hours": 72,
  "require_override": ["prod"]
}
```

## FAQ

**Q：Terraform state 文件放哪？**
A：dev 用本地文件；staging/prod 用 S3+DynamoDB 锁，禁止本地存 prod state。`init` 命令会按环境矩阵自动配置后端.
**Q：plan 显示要删一个资源但我没动它？**
A：常见于 state 漂移或代码被他人修改。先 `git diff` 看 .tf 改动，再 `drift` 检查线上。不要盲目 apply.
**Q：Ansible 和 Terraform 谁先执行？**
A：Terraform 先建资源，`output` 生成 inventory，Ansible 后配置。变更时顺序相反：先 Ansible 下线应用，再 Terraform 改资源.
**Q：如何回滚？**
A：IaC 的回滚 = `git revert` + `apply`。把代码回退到上一个版本重新 apply。前提是 state 没被破坏性修改.
**Q：多云混用怎么管凭证？**
A：每个 provider 用独立的 profile/项目，通过 `alias` 区分。不要在一个 provider 块里塞多个云的凭证.
**Q：CI 里怎么跑？**
A：用 OIDC 短期凭证，CI 只对 staging 有 apply 权限，prod 必须人工触发。参考环境隔离矩阵.
## 故障排查

| 症状 | 可能原因 | 处置 |
|:---:|:---:|:---:|
| `Error acquiring the state lock` | 上次执行中断未释放锁 | `force-unlock` 谨慎使用，先确认无其他进程在跑 |
| `plan` 显示全部重建 | state 文件丢失或后端配置变 | 检查 backend.tf，必要时 `import` 恢复 |
| `Provider produced inconsistent result` | provider 版本 bug | 锁定 provider 版本，升级到稳定版 |
| Ansible 连接超时 | 安全组未放行 22/SSH 端口 | 检查 Terraform 创建的 security group |
| `destroy` 报 `resource not empty` | S3 桶/DB 有数据 | 按策略先清空或确认后再加 `--force` |
| 凭证报 `InvalidClientTokenId` | AK/SK 过期或权限不足 | 轮换密钥，检查 IAM 策略 |

## 性能优化

1. **并行资源**：Terraform 默认并行创建无依赖资源，`-parallelism=20` 可调高（小心 API 限流）.
2. **state 拆分**：大环境按模块拆成多个 state，避免单 state 过大导致 plan 慢.
3. **Ansible fact 缓存**：开启 `fact_caching=redis` 避免每次采集.
4. **增量 plan**：用 `-target` 只 plan 变更模块，但注意不要长期依赖 target（会掩盖漂移）.
## 依赖说明

### 运行环境
- **Agent 平台**：支持 SKILL.md 的任意 AI Agent
- **操作系统**：Linux / macOS（Windows 需 WSL2）
- **Shell**：bash 4+

### 依赖详情

| 依赖项 | 类型 | 是否必需 | 获取方式 |
|:------|------:|:------|:------|
| Terraform | CLI | 必需 | >= 1.5，`brew install terraform` 或官方下载 |
| Ansible | CLI | 必需 | >= 2.15，`pip install ansible` |
| AWS CLI | CLI | AWS 必需 | `brew install awscli` |
| GCP CLI (gcloud) | CLI | GCP 必需 | 官方安装 |
| Azure CLI (az) | CLI | Azure 必需 | `brew install azure-cli` |
| jq | CLI | 必需（报告解析） | `apt install jq` |
| LLM API | API | 必需 | 由 Agent 内置 LLM 提供 |

### API Key 配置
- **AWS**：`AWS_PROFILE` 或 `AWS_ACCESS_KEY_ID` + `AWS_SECRET_ACCESS_KEY`，建议 OIDC.
- **GCP**：`GOOGLE_APPLICATION_CREDENTIALS` 指向服务账号 JSON.
- **Azure**：`az login` 或 `ARM_CLIENT_ID`/`ARM_CLIENT_SECRET`/`ARM_TENANT_ID`/`ARM_SUBSCRIPTION_ID`.
- 所有凭证禁止写入 .tf 文件，必须通过环境变量或 Profile 注入.
### 可用性分类
- **分类**：MD+EXEC（Markdown 指令 + shell/Terraform/Ansible 执行）
- **说明**：Agent 调用 `（请参考skill目录中的脚本文件）` 编排底层工具链，负责策略判断、风险审查与人工确认触发.
- 需要Claude、GPT-4等大语言模型提供推理和自然语言理解能力

## 核心能力

### 云运维编排器为 AI Agen
云运维编排器为 AI Agent 提供以基础设施即代码（IaC）为核心的多云运维能力

**输入**: 用户提供云运维编排器为 AI Agen所需的指令和必要参数.
**处理**: 解析云运维编排器为 AI Agen的输入参数,完成核心逻辑,返回结构化响应.
**输出**: 返回云运维编排器为 AI Agen的响应数据,包含状态码、结果和日志.
- 执行此能力时使用`input_params`参数,支持创建/查询/导出操作

### 适用场景
适用场景：多环境交付、灾备切换、扩缩容演练、合规基线对齐、成本优化清理、一人公司 DevOps 自动化

**输入**: 用户提供适用场景所需的指令和必要参数.
**处理**: 解析适用场景的输入参数,完成核心逻辑,返回结构化响应.
**输出**: 返回适用场景的响应数据,包含状态码、结果和日志.
- 执行此能力时使用`input_params`参数,支持创建/查询/导出操作

### 所有销毁类操作默认 dry-run
所有销毁类操作默认 dry-run，需显式 `--confirm` 才执行

**输入**: 用户提供所有销毁类操作默认 dry-run所需的指令和必要参数.
**处理**: 解析所有销毁类操作默认 dry-run的输入参数,完成核心逻辑,返回结构化响应.
**输出**: 返回所有销毁类操作默认 dry-run的响应数据,包含状态码、结果和日志.
- 执行此能力时使用`input_params`参数,支持创建/查询/导出操作

### 适用关键词
适用关键词：云, 基础设施, 编排, terraform, ansible, aws, gcp, azure, drift, 销毁, 部署, cloud, infra, provision

**输入**: 用户提供适用关键词所需的指令和必要参数.
**处理**: 解析适用关键词的输入参数,完成核心逻辑,返回结构化响应.
**输出**: 返回适用关键词的响应数据,包含状态码、结果和日志.
- 执行此能力时使用`input_params`参数,支持创建/查询/导出操作

**技术实现要点**：核心能力基于`input_params`参数与`output_format`配置实现,支持创建/查询/修改/删除等操作模式,通过`config_options`进行运行时配置.
**能力覆盖范围**：本skill的核心能力覆盖以下场景关键词：编排多云基础设施、内置漂移检测、变更预演与安全销、杜绝误删、它明确划分、资源生命周期、系统配置、的职责边界、三大云、并内置状态漂移检、变更预演、plan、安全销毁、带保护期、凭证隔离与回滚机、Use、when、需要安全检测、合规审计、漏洞扫描、加密防护时使用、不适用于渗透测试、未授权目标等。这些关键词对应description中声明的使用场景,均已在上述能力点中提供对应的操作支持.
## 适用场景(补充)

### 场景 A：新项目首次交付(补充)

```bash
（请参考skill目录中的脚本文件） init aws dev
（请参考skill目录中的脚本文件） plan dev --module web-app
（请参考skill目录中的脚本文件） apply dev --confirm
（请参考skill目录中的脚本文件） output dev
（请参考skill目录中的脚本文件） config dev --playbook bootstrap.yml
```

### 场景 B：生产扩容(补充)

生产环境扩容需要格外谨慎，必须遵循 plan → review → apply 三步流程，且 prod 环境禁止自动 apply.
```bash
# 1. 修改 terraform.tfvars 中的 instance_count
#    例如从 3 改为 5
# 2. 预演变更，确认只增不减
（请参考skill目录中的脚本文件） plan prod
# 3. 检查风险等级，确认无 destroy 操作
（请参考skill目录中的脚本文件） review prod
# 4. 人工确认后执行
（请参考skill目录中的脚本文件） apply prod --confirm
# 5. 验证扩容结果
（请参考skill目录中的脚本文件） output prod
```

扩容后建议配合 Ansible 执行新实例的 bootstrap 配置，确保新节点与应用层就绪.
### 前置检查(补充)

执行任何 IaC 操作前必须完成以下检查，确保工具链与凭证就绪：

```bash
# 1. 验证 Terraform 版本 >= 1.5
terraform version

# 2. 验证 Ansible 版本 >= 2.15
ansible --version

# 3. 验证云厂商 CLI 凭证有效
aws sts get-caller-identity   # AWS
gcloud auth list              # GCP
az account show               # Azure

# 4. 确认 state 后端可访问（prod 环境）
terraform init -backend-config=envs/prod/backend.tf

# 5. 检查是否有未提交的 .tf 改动
git status -- '*.tf'
```

任何一项检查失败都应先修复再继续，避免在凭证缺失或版本不兼容的情况下执行变更.
## 示例

### 示例1：基础用法

以下是一个完整的 AWS 开发环境初始化与部署示例：

```bash
# 初始化 dev 环境后端
（请参考skill目录中的脚本文件） init aws dev

# 预演变更：创建 VPC + EC2 + RDS
（请参考skill目录中的脚本文件） plan dev
# 输出摘要：add=12, change=0, destroy=0, cost_delta=+$180/月

# 审查变更摘要
（请参考skill目录中的脚本文件） review dev
# 确认无高风险变更后执行
（请参考skill目录中的脚本文件） apply dev --confirm

# 导出 inventory 给 Ansible
（请参考skill目录中的脚本文件） output dev > ansible/inventories/dev.yml

# 用 Ansible 配置主机
（请参考skill目录中的脚本文件） config dev --playbook site.yml
```

## 已知限制

- 依赖云服务厂商 API，网络中断时 plan/apply 均不可用
- Terraform state 文件在多人协作时可能产生锁冲突，需依赖远程后端（S3+DynamoDB）
- 不支持 Terraform Cloud/Enterprise 的远程执行模式，仅支持本地 CLI 执行
- Ansible 配置依赖 Terraform output 生成的 inventory，主机 IP 变更后需重新 output
- 漂移检测只能发现资源级差异，无法检测主机内部的配置漂移（如手动改了 Nginx 配置）
- Windows 环境需 WSL2，原生 PowerShell 不支持文件锁等 Unix 语义

## 常见问题

### Q1: 云运维编排器支持哪些输入格式？
支持文本输入、文件上传和API调用三种方式.
### Q2: 使用云运维编排器需要什么环境？
需要支持SKILL.md的AI Agent平台，详见依赖说明.
### Q3: 输出结果可以直接使用吗？
输出结果建议人工审核后使用，确保符合具体业务需求.
## 错误处理

- 降级策略: 异常时返回默认值, 确保流程不中断
- 执行ping命令测试网络连通性,检查防火墙和代理设置连接后重新执行命令机制: 失败时自动执行ping命令测试网络连通性,检查防火墙和代理设置连接后重新执行命令, 最多3次

| 错误场景 | 原因 | 处理方式 |
|---:|:---|---:|
| LLM响应超时 | 网络延迟 | 执行ping命令测试网络连通性,检查防火墙和代理设置连接后重新执行命令 |
| 输入格式错误 | 参数不匹配 | 对照使用流程章节检查输入格式 |
| 执行失败 | 环境不满足 | 对照依赖说明章节确认环境配置 |
## 输出格式

处理结果以结构化格式返回, 包含状态码、消息和数据字段.