操作自動化和腳本
1)為什麼要自動化操作
減少MTTR/人為錯誤,加快發布和反應。
使動作可重復和可審核(合規性)。
騰出工程師的時間進行改進而不是例行程序。
2)基本原則
1.相同性:重新啟動→相同的結果。
2.安全欄桿:幹跑,確認,限制,自動回滾。
3.可觀察性:每個腳本/管道中都內置了邏輯/度量/跟蹤。
4.配置>代碼中的常數:全部通過參數/清單。
5.GitOps/Docs-as-Code:操作代碼經過驗證、重寫、測試。
6.小步驟:金絲雀股票,蹦床,帶預算的retrai。
7.回購中沒有秘密:僅通過秘密存儲。
3)自動化任務類
重建和事件:回滾,提供商切換,退化字幕。
計劃工作:證書/密鑰輪換,DB遷移(expand→migrate→contract)。
基礎架構管理:IaC (Terraform)、配置(Ansible)、K8s清單。
數據和DataOps:後門、ETL、質量驗證。
Xaoc/DR演習:安全門故障模擬。
4)如何選擇工具
Bash是簡短的glue腳本,CLI編排。
Python-邏輯/SDK,retrai,API,與JSON/YAML合作。
Ansible是一種等效配置,不需要代理。
Terraform是聲明性基礎架構。
Kubernetes Jobs/CronJobs-批處理任務/計劃。
Argo/Airflow是從屬的DAG-和編排。
ChatOps是通過審核從聊天中安全啟動的。
5)自動化架構(參考)
CLI/ChatOps →控制器(GitOps/編排器) →表演者(Ansible/Terraform/K8s工作)→監視(邏輯/度量/跟蹤)→審計/滴答作響→文物(測試)。
6)相似性和狀態管理
「檢查,然後改變」:檢測這些行為(如果已經確定-不要做任何事情)。
為長過程保存「執行標記」(state/lock)。
程序分為原子步驟,並可以重新運行。
7)錯誤、回滾和回滾
具有指數延遲和抖動的回傳。
運營時間預算(每任務總計SLA)。
總是提供回滾和「停止按鈕」(電路斷路器)。
顯式返回代碼和結構化錯誤。
8)安全與秘密
RBAC/ABAC,最低特權,臨時令牌(JIT/JEA)。
來自Vault/KMS/Cloud Secret Manager的秘密;按鍵輪換。
「職責分工」:寫作的人不是批準並在銷售中運行的人。
審計日誌:何人/何時/何時/何時/何時/何時/何時/何時/何時/何時/何時/何時/何時/何時/何時/何時/何時/何時/何時/何時/何時/何時/何時/何時/何時/何時/何時/何時/何時/何時/何時/何時/何時。
9) GitOps и ChatOps
PR →測試→咆哮→ merge →周三的自動促銷。
聊天中的命令(例如'/ops deploy checkout -canary 5%')調用派伊線;機器人施加事件和指向行車記錄儀的鏈接。
10)規劃和編排
CronJobs/DAG具有依賴性和截止線。
競爭:「Forbid」,「Replace」,「Allow」(K8s)取決於任務。
資源政策/配額以免被「吃掉」。
11)自動可觀察性
度量標準:成功/錯誤、持續時間、轉發、受影響的對象。
Logs:結構化的correlation-ID,錯誤上的紅色字符串。
Traces:在分布式跟蹤中可以看到冗長操作的步驟。
Alerts:按癥狀(SLO)和技術指標(截止日期、百分比錯誤)。
12)測試和模擬
邏輯和人工制品解析器的統一測試。
沙盒和金絲雀的整合測試。
「模擬器」(dry-run+虛擬提供程序),replay replay real script。
演習:明確的目標,安全門,AAR→RCA→CAPA。
13)代碼模板
Bash(帶欄桿的骨架)
bash
!/usr/bin/env bash set -Eeuo pipefail trap 'echo "[ERR] line $LINENO"; exit 1' ERR
log(){ printf '%s %s\n' "$(date -Iseconds)" "$"; }
DRY=${DRY_RUN--true}
ensure_dep(){ command -v "$1" >/dev/null { echo "need $1"; exit 2; }; }
apply_change(){
local target="$1"
if [[ "$DRY" == "true" ]]; then log "[DRY] would update $target"
else kubectl apply -f "$target"
fi
}
main(){
ensure_dep kubectl for f in manifests/.yaml; do apply_change "$f"
done log "done"
}
main "$@"
python import argparse, time, json, sys from pathlib import Path import requests
def with_retries(fn, attempts=5, base=0. 2):
for i in range(attempts):
try:
return fn()
except Exception as e:
sleep = base (2i)
time. sleep(sleep)
raise
def already_done(marker):
return Path(marker). exists()
def mark_done(marker):
Path(marker). write_text("ok")
def main():
ap = argparse. ArgumentParser()
ap. add_argument("--endpoint", required=True)
ap. add_argument("--marker", default="/tmp/op. marker")
args = ap. parse_args()
if already_done(args. marker):
print("idempotent: nothing to do"); return
def call():
r = requests. post(args. endpoint, json={"action":"rotate"})
r. raise_for_status()
return r. json()
resp = with_retries(call)
print(json. dumps(resp))
mark_done(args. marker)
if __name__ == "__main__":
sys. exit(main())
Ansible(等效任務)
yaml
- hosts: web become: true tasks:
- name: Ensure nginx present and enabled ansible. builtin. package:
name: nginx state: present
- name: Deploy config ansible. builtin. template:
src: nginx. conf. j2 dest: /etc/nginx/nginx. conf mode: '0644'
notify: restart nginx handlers:
- name: restart nginx ansible. builtin. service:
name: nginx state: restarted
Kubernetes CronJob(計劃輪換)
yaml apiVersion: batch/v1 kind: CronJob metadata:
name: cert-rotate spec:
schedule: "0 3 "
concurrencyPolicy: Forbid jobTemplate:
spec:
template:
spec:
serviceAccountName: ops-automation restartPolicy: OnFailure containers:
- name: rotator image: registry/ops/rotator:1. 2. 3 args: ["--rotate", "--budget-ms=60000"]
envFrom:
- secretRef: { name: rotator-secrets }
GitHub Actions(聊天操作觸發器)
yaml name: ops-deploy on:
workflow_dispatch:
inputs:
service: {required: true}
canary: {required: false, default: "5"}
jobs:
deploy:
runs-on: ubuntu-latest steps:
- uses: actions/checkout@v4
- run:./scripts/deploy. sh "${{ inputs. service }}" --canary "${{ inputs. canary }}"
14)實施支票
- 為每個操作選擇了工具並描述了運行手冊。
- 有幹跑,確認和限制(欄桿)。
- 徽標是結構化的,度量標準和Alertes連接的。
- 來自存儲的秘密,最小和暫時的可用性。
- 進行了測試(unit/集成/金絲雀)和模擬。
- GitOps/PR評論是強制性的,有審計。
- 回滾計劃和成功標準已記錄在案。
- 自動化與SLO/錯誤預算掛鉤。
15)反模式
腳本沒有止步和回滾。
「代碼中的秘密」,每個人的超級記分卡。
手動編輯在銷售中無需審核。
Bash動物園代替聲明性IaC。
「縫合」到代碼的選項-沒有重新使用。
沒有幹跑/金絲雀→大爆炸。
沒有結構和共鳴的「為人」徽標。
16)Ops自動化成熟度量標準
Coverage:自動化和運行手冊操作的百分比。
Success rate/Retry rate自動任務。
要求執行時間(平均持續時間)和計時時間(在截止日期)。
自動化之前/之後更改失敗率。
審核完整性:具有完整事件的百分比。
證券:按鍵/證書輪換時間,JIT訪問份額。
17)結果
Ops自動化不是一組不同的腳本,而是系統:等效動作,安全欄桿,可觀察性,秘密和可控制性,GitOps/ChatOps,測試和練習。在這樣的系統中,操作變得快速,可預測和可審核-業務獲得穩定的發布和低事件風險。