操作自动化和脚本
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,测试和练习。在这样的系统中,操作变得快速,可预测和可审核-业务获得稳定的发布和低事件风险。