# ADR-070: 全自動 AIOps 閉環 — MCP Phase 1-4 **狀態**: Accepted **日期**: 2026-04-11 (台北時間) **作者**: Claude Sonnet 4.6 + 首席架構師審查 **關聯**: `docs/superpowers/specs/2026-04-10-infra-rebuild-sprint-abc-design.md` § 14 --- ## 問題 AWOOOI AIOps 告警閉環存在三大盲點: 1. **主機層盲點(70%)**:所有修復動作都在 K8s 層,無法 SSH 到宿主機排查 Docker/Nginx/PM2 問題 2. **情報缺乏**:決策引擎只有告警標籤,無即時 Prometheus 指標輔助診斷 3. **知識沉澱不完整**:KM 只記錄動作,缺少「執行前情境 + 執行後驗證」三段資料 4. **零寫死判斷**:symptom_pattern 應由 AI 動態生成,不應硬編碼 --- ## 決定 採用 **MCP Provider 架構**(四個 Phase 遞進實作): ### MCP Phase 1 — K8s MCP 強化 新增 6 個 K8s 工具:`pod_logs`, `watch_rollout`, `get_events`, `describe_resource`, `get_hpa`, `get_node_status` ### MCP Phase 2 — 主機層 + 情報收集 - **Phase 2a** `ssh_provider.py`:15 工具,群組 A 診斷(9 工具)+ 群組 B 操作(6 工具) - 四層守衛:SSH 連線池、asyncssh、already-known-hosts、參數白名單 - 支援主機:188(ollama)/ 110(wooo)/ 111(ollama) - **Phase 2b** `prometheus_provider.py`:3 工具(query / range / alert_history) ### MCP Phase 3 — GitOps + 錯誤追蹤 - `argocd_provider.py`:3 工具(list_apps / get_app_status / get_sync_history) - TLS verify=False(self-signed), app name 白名單 `^[a-zA-Z0-9][a-zA-Z0-9._-]{0,62}$` - `sentry_provider.py`:3 工具(list_issues / get_issue / search_events) - issue_id 僅允許數字 `^\d{1,20}$` ### MCP Phase 4 — NemoClaw 整合 + KM 三段資料 **Phase 4a** — NemoClaw Second Opinion(deepseek-r1:14b): - 觸發條件:`confidence < 0.7` - 呼叫 Ollama 188:11434,解析 `...` CoT - 結果寫入 `proposal_data["advisory_note"]`,由 Telegram 推送 **Phase 4b** — K8s 狀態後驗證: - 自動修復完成後呼叫 `K8sProvider.kubectl_get(pods)` - 寫入 `incidents.k8s_state_after` **Phase 4c** — AI 動態 Playbook 草稿: - 新 alertname 首次出現時,`qwen2.5:7b-instruct` 生成 5 段結構化草稿 - 去重:semantic_search threshold=0.92(避免重複沉澱) - 狀態標記 DRAFT,人工審核後升為 APPROVED --- ## 後果 ### 正面 - 主機層告警可自動修復(Nginx down / Docker 容器異常 / 磁碟滿) - KM 三段資料完整(執行前指標 + 動作 + 執行後 K8s 狀態) - 新告警 AI 自動生成 Playbook 草稿,飛輪冷啟動速度提升 ### 風險 - SSH 工具有命令注入風險 → 四層白名單守衛緩解 - NemoClaw 呼叫增加 Ollama 負載 → 僅在信心 < 0.7 觸發,非必經路徑 - Playbook 草稿品質依賴 qwen2.5:7b → DRAFT 狀態人工審核把關 --- ## 實作記錄 | Phase | Commit | 檔案 | |-------|--------|------| | MCP Phase 1 | a29e5e1 | `k8s_provider.py` +6 工具 | | MCP Phase 2a | 6351e9a | `ssh_provider.py` 15 工具 | | MCP Phase 2b | 6351e9a | `prometheus_provider.py` 3 工具 | | MCP Phase 3 | a2cc985 | `argocd_provider.py` + `sentry_provider.py` | | MCP Phase 4a | f3ee577 | `decision_manager._nemoclaw_second_opinion()` | | MCP Phase 4b | 0fa3b35 | `decision_manager._push_auto_repair_result()` k8s_state_after | | MCP Phase 4c | 7eb49f9 | `decision_manager._generate_playbook_draft_if_new()` | | providers 全註冊 | a2cc985 | `providers/__init__.py` 10 providers | | 生產驗收 | 2026-04-11 | 10 providers enabled,2 pods Running | | 全自動化三大修復 | c439277 | `auto_approve.py` high risk 全開放 + DESTRUCTIVE_PATTERNS;`decision_manager._collect_mcp_context()` MCP 前置收集;`webhooks.py` target_resource 修正 | | Tier 3 CR 修補 | 8be87b0 | C1 ternary bug / C2 timeout / C3 DESTRUCTIVE_PATTERNS 補全 / I1 RFC-1918 / I4 25 tests |