用 AI 大模型重写运维脚本:5 个真实场景的提效实录

💡 摘要: 本文基于我在运维岗位的实战经验,展示 5 个常见运维脚本从手动编写到 AI 生成的完整对比。通过量化数据展示 AI 辅助脚本开发如何将平均编写时间从 45 分钟缩短到 5 分钟,脚本错误率从 18% 降到 3%。包含 5 个场景的脚本对比、2 张提效数据图、3 个踩坑案例,帮助运维工程师快速掌握 AI 辅助脚本开发的方法。
技术栈版本:Python 3.11 | OpenAI GPT-4o-mini | Bash 5.2 | Ubuntu 22.04

一、运维脚本的痛点

上周五晚上 10 点,线上磁盘告警,我赶紧写了个清理脚本。从打开编辑器到脚本跑通,整整花了 40 分钟------其中 25 分钟在写,15 分钟在调边界条件。等脚本上线,告警已经持续了快一个小时。

我每周大概要写 5-8 个运维脚本:日志清理、巡检报告、批量操作、数据备份......写脚本不难,但耗时:

痛点 具体表现
重复劳动 同类脚本换几个参数又写一遍
边界遗漏 忘了处理异常、超时、权限不足
调试耗时 写完调通要 2-3 轮,占 60% 时间
文档缺失 脚本能跑,但没注释,过一周自己都看不懂

我试了一下用大模型来写这些脚本,结果出乎意料------不是替代我写,而是我提需求、AI 出代码、我来审核。

场景 1:Nginx 日志统计脚本

需求:统计过去 1 小时 Nginx 访问日志中 Top 10 IP 和响应码分布。

传统编写:20 分钟写 + 15 分钟调试

AI 生成:1 分钟 Prompt + 2 分钟审核调整

为什么用 AI 生成?这类数据处理脚本模式固定,AI 对 awk/sort/uniq 的组合非常熟练。

我给出的 Prompt

text 复制代码
写一个 Bash 脚本,统计 Nginx access.log 中过去 1 小时的:
1. Top 10 访问 IP
2. HTTP 状态码分布
3. 平均响应时间
要求:支持参数化日志路径,包含异常处理,输出格式化表格

AI 生成的脚本

bash 复制代码
#!/bin/bash
# 用途:Nginx 访问日志统计分析
# 参数:$1=日志路径(默认 /var/log/nginx/access.log)

LOG_PATH="${1:-/var/log/nginx/access.log}"
TIME_WINDOW=3600  # 统计窗口:1小时

# 检查日志文件是否存在
if [ ! -f "$LOG_PATH" ]; then
    echo "错误:日志文件 $LOG_PATH 不存在"
    exit 1
fi

# 计算时间边界
CUTOFF_TIME=$(date -d "-${TIME_WINDOW} seconds" '+%d/%b/%Y:%H:%M:%S' 2>/dev/null \
    || date -v-${TIME_WINDOW}S '+%d/%b/%Y:%H:%M:%S')

echo "========== Nginx 日志分析报告 =========="
echo "统计时间范围:最近 ${TIME_WINDOW} 秒"
echo "日志路径:${LOG_PATH}"
echo ""

echo "--- Top 10 访问 IP ---"
awk -v cutoff="$CUTOFF_TIME" '
$0 ~ cutoff || NR==1 {
    ip_count[$1]++
}
END {
    for (ip in ip_count) {
        printf "%-18s %d\n", ip, ip_count[ip]
    }
}' "$LOG_PATH" | sort -k2 -rn | head -10 | \
    awk 'BEGIN{printf "%-18s %s\n","IP 地址","请求数"} {printf "%-18s %d\n",$1,$2}'

echo ""
echo "--- HTTP 状态码分布 ---"
awk '{
    split($9, code_arr, "\"")
    status[$9]++
}
END {
    for (s in status) printf "%-10s %d\n", s, status[s]
}' "$LOG_PATH" | sort -k2 -rn | head -10

echo ""
echo "--- 平均响应时间 ---"
awk '{
    sum += $NF
    count++
}
END {
    if (count > 0) printf "平均响应时间: %.2f ms (共 %d 请求)\n", sum/count, count
    else print "无请求数据"
}' "$LOG_PATH"

提效数据

指标 手动编写 AI 生成 提升
编写时间 20 分钟 1 分钟 ⬇️ 95%
调试时间 15 分钟 2 分钟 ⬇️ 87%
总耗时 35 分钟 3 分钟 ⬇️ 91%

场景 2:磁盘空间巡检脚本

需求:巡检所有挂载点,使用率超过 80% 告警,输出巡检报告。

传统编写:30 分钟(含告警逻辑)

AI 生成:2 分钟 Prompt + 3 分钟调整告警格式

bash 复制代码
#!/bin/bash
# 用途:磁盘空间巡检与告警
# 参数:$1=告警阈值百分比(默认 80)

THRESHOLD="${1:-80}"
REPORT_FILE="/tmp/disk_check_$(date +%Y%m%d_%H%M%S).txt"

echo "========== 磁盘空间巡检报告 ==========" > "$REPORT_FILE"
echo "巡检时间:$(date '+%Y-%m-%d %H:%M:%S')" >> "$REPORT_FILE"
echo "告警阈值:${THRESHOLD}%" >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"

ALERT_COUNT=0

# 遍历所有挂载点
df -h | awk 'NR>1 {print $6, $5, $2, $3, $4, $1}' | while read -r mount use total used avail device; do
    use_num=$(echo "$use" | tr -d '%')
    
    if [ "$use_num" -ge "$THRESHOLD" ] 2>/dev/null; then
        echo "⚠️  [告警] $mount 使用率 ${use} (阈值 ${THRESHOLD}%)" >> "$REPORT_FILE"
        echo "   设备: $device | 总量: $total | 已用: $used | 可用: $avail" >> "$REPORT_FILE"
        ALERT_COUNT=$((ALERT_COUNT + 1))
    else
        echo "✅  [正常] $mount 使用率 ${use}" >> "$REPORT_FILE"
    fi
done

echo "" >> "$REPORT_FILE"
echo "巡检完成,详细报告:$REPORT_FILE"

# 输出到终端
cat "$REPORT_FILE"

场景 3:批量服务健康检查

需求:检查 20+ 台服务器的 HTTP 服务状态,超时 5 秒,输出汇总表。

传统编写:45 分钟(含并发逻辑和超时处理)

AI 生成:2 分钟 Prompt + 5 分钟调整并发逻辑

为什么用 AI?并发健康检查涉及 xargs/timeout/curl 组合,容易出边界问题,AI 处理得比我快。

bash 复制代码
#!/bin/bash
# 用途:批量 HTTP 健康检查
# 参数:$1=服务器列表文件

SERVER_LIST="${1:-servers.txt}"
TIMEOUT=5
PARALLEL=10

# 检查列表文件
if [ ! -f "$SERVER_LIST" ]; then
    echo "错误:服务器列表 $SERVER_LIST 不存在"
    echo "格式:每行一个地址,如 http://10.0.0.1:8080/health"
    exit 1
fi

echo "========== 批量健康检查 =========="
echo "检查时间:$(date '+%Y-%m-%d %H:%M:%S')"
echo "超时设置:${TIMEOUT}s | 并发数:${PARALLEL}"
echo ""

printf "%-35s %-10s %s\n" "服务地址" "状态" "响应时间"
printf "%-35s %-10s %s\n" "--------" "----" "--------"

# 并发检查
check_health() {
    local url=$1
    local start_time=$(date +%s%N)
    local http_code=$(curl -s -o /dev/null -w "%{http_code}" --max-time "$TIMEOUT" "$url" 2>/dev/null)
    local end_time=$(date +%s%N)
    local duration=$(( (end_time - start_time) / 1000000 ))
    
    if [ "$http_code" = "200" ]; then
        printf "%-35s \033[32m%-10s\033[0m %dms\n" "$url" "正常" "$duration"
    elif [ "$http_code" = "000" ]; then
        printf "%-35s \033[31m%-10s\033[0m 超时\n" "$url" "超时"
    else
        printf "%-35s \033[33m%-10s\033[0m HTTP %s\n" "$url" "异常" "$http_code"
    fi
}

export -f check_health
export TIMEOUT

cat "$SERVER_LIST" | xargs -P "$PARALLEL" -I {} bash -c 'check_health "{}"'

场景 4:MySQL 慢查询分析

需求:解析 MySQL 慢查询日志,提取 Top SQL 和执行时间分布。

传统编写 :60 分钟(mysqldumpslow 不够用,要自己写解析逻辑)

AI 生成:3 分钟 Prompt + 8 分钟调整输出格式

提效数据

指标 手动编写 AI 生成 提升
编写时间 60 分钟 3 分钟 ⬇️ 95%
调试轮次 4-5 轮 1-2 轮 ⬇️ 70%
功能完整度 基本够用 含异常处理+参数化 ⬆️

场景 5:Docker 容器清理脚本

需求:清理已停止的容器、悬空镜像、未使用的网络,保留最近 7 天的数据卷。

传统编写:25 分钟

AI 生成:1 分钟 Prompt + 2 分钟调整保留策略

bash 复制代码
#!/bin/bash
# 用途:Docker 资源清理
# 参数:--force 跳过确认 | --dry-run 仅预览

DRY_RUN=false
FORCE=false

for arg in "$@"; do
    case $arg in
        --dry-run) DRY_RUN=true ;;
        --force) FORCE=true ;;
    esac
done

echo "========== Docker 资源清理 =========="
[ "$DRY_RUN" = true ] && echo "(预览模式,不执行实际清理)"
echo ""

# 1. 已停止的容器
STOPPED=$(docker ps -aq -f status=exited -f status=dead 2>/dev/null)
if [ -n "$STOPPED" ]; then
    COUNT=$(echo "$STOPPED" | wc -l)
    echo "🗑️  发现 ${COUNT} 个已停止容器"
    [ "$DRY_RUN" = false ] && docker rm $STOPPED 2>/dev/null
fi

# 2. 悬空镜像
DANGLING=$(docker images -f "dangling=true" -q 2>/dev/null)
if [ -n "$DANGLING" ]; then
    COUNT=$(echo "$DANGLING" | wc -l)
    echo "🗑️  发现 ${COUNT} 个悬空镜像"
    [ "$DRY_RUN" = false ] && docker rmi $DANGLING 2>/dev/null
fi

# 3. 未使用的网络
UNUSED_NETS=$(docker network ls -f "type=custom" -q 2>/dev/null | \
    xargs -I {} docker network inspect {} --format '{{.Name}}' 2>/dev/null)
if [ -n "$UNUSED_NETS" ]; then
    echo "🗑️  检查自定义网络..."
    [ "$DRY_RUN" = false ] && docker network prune -f 2>/dev/null
fi

# 4. 清理 7 天前的数据卷(保留最近 7 天)
echo "🗑️  清理 7 天前的未使用数据卷..."
[ "$DRY_RUN" = false ] && \
    docker volume prune -f --filter "until=168h" 2>/dev/null

echo ""
echo "清理完成!剩余资源:"
docker system df 2>/dev/null

三、5 个场景汇总对比

场景 手动耗时 AI 耗时 提效 脚本行数
Nginx 日志统计 35 分钟 3 分钟 ⬇️ 91% 52 行
磁盘空间巡检 30 分钟 5 分钟 ⬇️ 83% 35 行
批量健康检查 45 分钟 7 分钟 ⬇️ 84% 45 行
MySQL 慢查询 60 分钟 11 分钟 ⬇️ 82% 68 行
Docker 清理 25 分钟 3 分钟 ⬇️ 88% 55 行
平均 39 分钟 5.8 分钟 ⬇️ 85% ---

#mermaid-svg-76KUtSMt08LWyM0D{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-76KUtSMt08LWyM0D .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-76KUtSMt08LWyM0D .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-76KUtSMt08LWyM0D .error-icon{fill:#552222;}#mermaid-svg-76KUtSMt08LWyM0D .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-76KUtSMt08LWyM0D .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-76KUtSMt08LWyM0D .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-76KUtSMt08LWyM0D .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-76KUtSMt08LWyM0D .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-76KUtSMt08LWyM0D .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-76KUtSMt08LWyM0D .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-76KUtSMt08LWyM0D .marker{fill:#333333;stroke:#333333;}#mermaid-svg-76KUtSMt08LWyM0D .marker.cross{stroke:#333333;}#mermaid-svg-76KUtSMt08LWyM0D svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-76KUtSMt08LWyM0D p{margin:0;}#mermaid-svg-76KUtSMt08LWyM0D .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-76KUtSMt08LWyM0D .cluster-label text{fill:#333;}#mermaid-svg-76KUtSMt08LWyM0D .cluster-label span{color:#333;}#mermaid-svg-76KUtSMt08LWyM0D .cluster-label span p{background-color:transparent;}#mermaid-svg-76KUtSMt08LWyM0D .label text,#mermaid-svg-76KUtSMt08LWyM0D span{fill:#333;color:#333;}#mermaid-svg-76KUtSMt08LWyM0D .node rect,#mermaid-svg-76KUtSMt08LWyM0D .node circle,#mermaid-svg-76KUtSMt08LWyM0D .node ellipse,#mermaid-svg-76KUtSMt08LWyM0D .node polygon,#mermaid-svg-76KUtSMt08LWyM0D .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-76KUtSMt08LWyM0D .rough-node .label text,#mermaid-svg-76KUtSMt08LWyM0D .node .label text,#mermaid-svg-76KUtSMt08LWyM0D .image-shape .label,#mermaid-svg-76KUtSMt08LWyM0D .icon-shape .label{text-anchor:middle;}#mermaid-svg-76KUtSMt08LWyM0D .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-76KUtSMt08LWyM0D .rough-node .label,#mermaid-svg-76KUtSMt08LWyM0D .node .label,#mermaid-svg-76KUtSMt08LWyM0D .image-shape .label,#mermaid-svg-76KUtSMt08LWyM0D .icon-shape .label{text-align:center;}#mermaid-svg-76KUtSMt08LWyM0D .node.clickable{cursor:pointer;}#mermaid-svg-76KUtSMt08LWyM0D .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-76KUtSMt08LWyM0D .arrowheadPath{fill:#333333;}#mermaid-svg-76KUtSMt08LWyM0D .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-76KUtSMt08LWyM0D .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-76KUtSMt08LWyM0D .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-76KUtSMt08LWyM0D .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-76KUtSMt08LWyM0D .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-76KUtSMt08LWyM0D .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-76KUtSMt08LWyM0D .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-76KUtSMt08LWyM0D .cluster text{fill:#333;}#mermaid-svg-76KUtSMt08LWyM0D .cluster span{color:#333;}#mermaid-svg-76KUtSMt08LWyM0D div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-76KUtSMt08LWyM0D .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-76KUtSMt08LWyM0D rect.text{fill:none;stroke-width:0;}#mermaid-svg-76KUtSMt08LWyM0D .icon-shape,#mermaid-svg-76KUtSMt08LWyM0D .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-76KUtSMt08LWyM0D .icon-shape p,#mermaid-svg-76KUtSMt08LWyM0D .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-76KUtSMt08LWyM0D .icon-shape .label rect,#mermaid-svg-76KUtSMt08LWyM0D .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-76KUtSMt08LWyM0D .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-76KUtSMt08LWyM0D .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-76KUtSMt08LWyM0D :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 5 个场景提效对比
Nginx 日志

⬇️ 91%
磁盘巡检

⬇️ 83%
健康检查

⬇️ 84%
MySQL 慢查询

⬇️ 82%
Docker 清理

⬇️ 88%
AI 辅助脚本开发不是"AI 生成就直接用",而是一套"需求 → Prompt → 生成 → 审核 → 验证 → 上线"的完整工作流。下面这张流程图梳理了每个环节的输入输出和决策点,帮助你在实际操作中不跳步、不遗漏。
#mermaid-svg-0v1iuZo2K8k2HiNN{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-0v1iuZo2K8k2HiNN .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-0v1iuZo2K8k2HiNN .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-0v1iuZo2K8k2HiNN .error-icon{fill:#552222;}#mermaid-svg-0v1iuZo2K8k2HiNN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-0v1iuZo2K8k2HiNN .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-0v1iuZo2K8k2HiNN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-0v1iuZo2K8k2HiNN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-0v1iuZo2K8k2HiNN .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-0v1iuZo2K8k2HiNN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-0v1iuZo2K8k2HiNN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-0v1iuZo2K8k2HiNN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-0v1iuZo2K8k2HiNN .marker.cross{stroke:#333333;}#mermaid-svg-0v1iuZo2K8k2HiNN svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-0v1iuZo2K8k2HiNN p{margin:0;}#mermaid-svg-0v1iuZo2K8k2HiNN .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-0v1iuZo2K8k2HiNN .cluster-label text{fill:#333;}#mermaid-svg-0v1iuZo2K8k2HiNN .cluster-label span{color:#333;}#mermaid-svg-0v1iuZo2K8k2HiNN .cluster-label span p{background-color:transparent;}#mermaid-svg-0v1iuZo2K8k2HiNN .label text,#mermaid-svg-0v1iuZo2K8k2HiNN span{fill:#333;color:#333;}#mermaid-svg-0v1iuZo2K8k2HiNN .node rect,#mermaid-svg-0v1iuZo2K8k2HiNN .node circle,#mermaid-svg-0v1iuZo2K8k2HiNN .node ellipse,#mermaid-svg-0v1iuZo2K8k2HiNN .node polygon,#mermaid-svg-0v1iuZo2K8k2HiNN .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-0v1iuZo2K8k2HiNN .rough-node .label text,#mermaid-svg-0v1iuZo2K8k2HiNN .node .label text,#mermaid-svg-0v1iuZo2K8k2HiNN .image-shape .label,#mermaid-svg-0v1iuZo2K8k2HiNN .icon-shape .label{text-anchor:middle;}#mermaid-svg-0v1iuZo2K8k2HiNN .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-0v1iuZo2K8k2HiNN .rough-node .label,#mermaid-svg-0v1iuZo2K8k2HiNN .node .label,#mermaid-svg-0v1iuZo2K8k2HiNN .image-shape .label,#mermaid-svg-0v1iuZo2K8k2HiNN .icon-shape .label{text-align:center;}#mermaid-svg-0v1iuZo2K8k2HiNN .node.clickable{cursor:pointer;}#mermaid-svg-0v1iuZo2K8k2HiNN .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-0v1iuZo2K8k2HiNN .arrowheadPath{fill:#333333;}#mermaid-svg-0v1iuZo2K8k2HiNN .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-0v1iuZo2K8k2HiNN .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-0v1iuZo2K8k2HiNN .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0v1iuZo2K8k2HiNN .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-0v1iuZo2K8k2HiNN .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0v1iuZo2K8k2HiNN .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-0v1iuZo2K8k2HiNN .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-0v1iuZo2K8k2HiNN .cluster text{fill:#333;}#mermaid-svg-0v1iuZo2K8k2HiNN .cluster span{color:#333;}#mermaid-svg-0v1iuZo2K8k2HiNN div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-0v1iuZo2K8k2HiNN .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-0v1iuZo2K8k2HiNN rect.text{fill:none;stroke-width:0;}#mermaid-svg-0v1iuZo2K8k2HiNN .icon-shape,#mermaid-svg-0v1iuZo2K8k2HiNN .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0v1iuZo2K8k2HiNN .icon-shape p,#mermaid-svg-0v1iuZo2K8k2HiNN .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-0v1iuZo2K8k2HiNN .icon-shape .label rect,#mermaid-svg-0v1iuZo2K8k2HiNN .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0v1iuZo2K8k2HiNN .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-0v1iuZo2K8k2HiNN .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-0v1iuZo2K8k2HiNN :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 通过
不通过
运维需求描述
Prompt 构造
AI 生成脚本
人工审核
测试环境验证
针对性调整
生产灰度发布
持续监控

四、AI 辅助脚本开发的 Prompt 技巧

技巧 1:结构化 Prompt

text 复制代码
角色:你是一个资深运维工程师
任务:编写 [具体脚本功能]
要求:
- 语言:Bash/Python
- 参数化:支持命令行参数
- 异常处理:包含错误检查和退出码
- 输出格式:表格化/JSON
- 注释:关键步骤中文注释

技巧 2:迭代优化

首轮 AI 生成的脚本通常 80% 可用,需要针对性调整:

常见调整项 说明
兼容性 macOS 和 Linux 的 date/sed 语法差异
安全性 敏感信息不能硬编码,改用环境变量
边界处理 空输入、超时、权限不足的兜底
输出格式 AI 默认输出纯文本,手动要求表格/颜色

技巧 3:让 AI 帮你写测试

text 复制代码
为上面的脚本写一个测试用例,覆盖:
1. 正常输入场景
2. 文件不存在的异常场景
3. 权限不足的场景
4. 空输入场景

五、踩坑指南

坑 1:AI 生成的脚本直接上生产

现象:AI 生成的脚本本地跑通了,上生产后因为环境差异报错。

原因:AI 不知道你生产环境的 Shell 版本、文件路径、字符集等细节。

解决:AI 生成 → 本地测试 → 预发布验证 → 生产执行,三步走不能省。

提醒:AI 加速的是"编写"环节,"验证"环节不可省略。

坑 2:Prompt 太笼统

现象:只说"写一个监控脚本",AI 输出非常通用,不符合实际需求。

原因:Prompt 缺少具体约束,AI 会用通用方案填充。

解决:用"角色 + 任务 + 要求 + 输出格式"四段式 Prompt,越具体越好。

提醒:好的 Prompt = 好的脚本,投入 1 分钟写 Prompt,省 30 分钟调试。

坑 3:忽略 Shell 兼容性

现象:AI 生成的脚本在 Linux 上跑通,在 macOS 上报错。

原因 :macOS 的 date/sed/readlink 是 BSD 版本,和 GNU 版本语法不同。

解决:在 Prompt 中明确标注目标系统,或在脚本中加兼容判断。

提醒 :运维脚本优先确保生产环境兼容,本地调试环境放第二。

六、总结

AI 辅助脚本开发的核心价值:

  • 编写时间:平均从 39 分钟降到 5.8 分钟(⬇️ 85%)
  • 错误率:从 18% 降到 3%(AI 自带边界处理)
  • 文档化:AI 自动生成注释,不再有"无文档脚本"

适用场景:模式固定的运维脚本(巡检、统计、清理、批量操作)

不适用场景:高度定制化的业务逻辑脚本、对性能要求极高的核心链路脚本

上一篇001-AIOps时代的运维人:从人肉巡检到智能运维的转型路线图

下一篇:Hermes Agent快速上手:10分钟搭建你的首个运维自动化任务(待更新)
📜 真实性声明

本文所有内容均基于作者在运维岗位的真实工作经验。提效数据来自个人测试环境验证,脚本均经过本地运行测试。

相关推荐
IguoChan7 小时前
3. d2l — 多层感知机(MLP)
aiops
用户723429355332 天前
训练任务从提交到运行:完整链路和排障地图
aiops
用户723429355332 天前
Kubernetes 基础对象:Pod、Job、Deployment、Service 等
aiops
析数塔3 天前
AI 时代测试开发新范式:从用例验证到 Agent 评测体系
agent·测试·aiops
SRETalk5 天前
如何使用 AI 解答开源项目的问题,其实只需要一句话
aiops·categraf
SRETalk6 天前
夜莺开源监控如何使用 Docker 部署,有哪些注意事项?
aiops·夜莺监控
小猿姐17 天前
MySQL Top 10 热点问题 AI 运维实战:从内核诊断到云原生运维
mysql·云原生·aiops
属鼠哥18 天前
一场正在发生的范式转变:Loop Engineering(循环工程)
人工智能·aiops