文章目录
-
- [1. 为什么用 Codex 写运维脚本](#1. 为什么用 Codex 写运维脚本)
- [2. 环境准备:让 Codex 跑起来](#2. 环境准备:让 Codex 跑起来)
-
- [2.1 前置条件](#2.1 前置条件)
- [2.2 安装 Codex CLI](#2.2 安装 Codex CLI)
- [2.3 最小可运行示例](#2.3 最小可运行示例)
- [3. 认识 Codex 的工作方式](#3. 认识 Codex 的工作方式)
-
- [3.1 提示词、上下文与输出窗口](#3.1 提示词、上下文与输出窗口)
- [3.2 好的描述如何影响脚本质量](#3.2 好的描述如何影响脚本质量)
- [3.3 明确需求 vs 模糊需求](#3.3 明确需求 vs 模糊需求)
- [4. 实战一:日志分析与告警脚本](#4. 实战一:日志分析与告警脚本)
-
- [4.1 场景说明](#4.1 场景说明)
- [4.2 编写提示词](#4.2 编写提示词)
- [4.3 Codex 生成的脚本](#4.3 Codex 生成的脚本)
- [4.4 运行、验证与微调](#4.4 运行、验证与微调)
- [5. 实战二:批量主机巡检脚本](#5. 实战二:批量主机巡检脚本)
-
- [5.1 场景说明](#5.1 场景说明)
- [5.2 编写提示词](#5.2 编写提示词)
- [5.3 Codex 生成的脚本](#5.3 Codex 生成的脚本)
- [5.4 处理超时、异常与输出格式化](#5.4 处理超时、异常与输出格式化)
- [6. 实战三:定时自动备份与清理](#6. 实战三:定时自动备份与清理)
-
- [6.1 场景说明](#6.1 场景说明)
- [6.2 编写提示词](#6.2 编写提示词)
- [6.3 Codex 生成的脚本](#6.3 Codex 生成的脚本)
- [6.4 脚本安全性与幂等性检查](#6.4 脚本安全性与幂等性检查)
- [6.5 接入 Cron](#6.5 接入 Cron)
- [7. 实战四:Kubernetes 资源检查脚本](#7. 实战四:Kubernetes 资源检查脚本)
-
- [7.1 场景说明](#7.1 场景说明)
- [7.2 编写提示词](#7.2 编写提示词)
- [7.3 Codex 生成的脚本](#7.3 Codex 生成的脚本)
- [7.4 常见错误与校对方法](#7.4 常见错误与校对方法)
- [8. 提示词模板与工程化技巧](#8. 提示词模板与工程化技巧)
-
- [8.1 可复用的提示词模板](#8.1 可复用的提示词模板)
- [8.2 拆任务、给示例、限定环境与依赖](#8.2 拆任务、给示例、限定环境与依赖)
- [8.3 如何避免生成无法运行的"幻觉命令"](#8.3 如何避免生成无法运行的“幻觉命令”)
- [9. 安全与合规须知](#9. 安全与合规须知)
-
- [9.1 涉及生产环境的命令必须人工复核](#9.1 涉及生产环境的命令必须人工复核)
- [9.2 禁止直接执行未读懂的代码](#9.2 禁止直接执行未读懂的代码)
- [9.3 敏感信息与密钥的传递注意事项](#9.3 敏感信息与密钥的传递注意事项)
- [10. 小结与进阶方向](#10. 小结与进阶方向)
-
- [10.1 本文实战回顾](#10.1 本文实战回顾)
- [10.2 进一步方向](#10.2 进一步方向)
- [10.3 一个可持续打磨的练习路径](#10.3 一个可持续打磨的练习路径)
1. 为什么用 Codex 写运维脚本
运维工作里,脚本几乎无处不在:日志切割、告警巡检、批量发布、备份清理、资源监控......这些任务有一个共同特点------逻辑不复杂,但细节特别多,写起来琐碎且容易出错。比如忘记给变量加引号、路径拼错、awk 的字段序号错位、循环里变量作用域不清,这些看似微小的问题,往往要花掉大量时间调试。
Codex 的价值就在于此。它可以把你用自然语言描述的需求,转换成一段结构清晰、可以直接运行的脚本。它不是替你想方案,而是帮你把已经想清楚的流程快速落地。你负责描述"要做什么、输入是什么、输出是什么",它负责补全语法、边界处理和常见实现细节。
当然,Codex 也有能力边界:对于模式明确、输入输出清晰的运维任务,它表现很好;对于强依赖当前环境状态、需要实时探索确认的复杂场景,它给出的代码仍需要人工校验。本文的核心思路是:用 Codex 加速从需求到脚本的过程,而不是把安全审查也交给 AI。
读完这篇文章,你可以学会:
- 如何正确安装并配置 Codex CLI;
- 如何写出高质量的运维脚本提示词;
- 用四个真实场景完成从提示词到可运行脚本的完整闭环;
- 掌握工程化提示词模板与安全审查要点。
前置要求:熟悉 Linux 基本命令,了解 Shell 或 Python 基础语法即可,不需要精通编程。
2. 环境准备:让 Codex 跑起来
2.1 前置条件
本文以 Codex CLI 为主要演示工具。AI 编程工具更新较快,配置方式可能随时间变化,建议以官方文档为准。开始前请确认本机具备:
- 一个可用的 Linux/macOS 环境,或 Windows 下的 WSL;
- Python 3.10+ 或 Node.js 18+(部分 CLI 工具依赖);
- 可访问对应 AI 服务的账号与 API Key 配置。
2.2 安装 Codex CLI
以当前常见的 Codex CLI 安装方式为例,通常使用包管理器一键安装。下面以 Node.js/npm 场景为例,请以你实际选择的工具官方文档为准:
bash
# 确认 Node.js 与 npm 版本
node -v
npm -v
# 全局安装 Codex CLI(以实际工具提供的包名为准)
npm install -g @openai/codex
# 验证安装是否成功
codex --version
安装完成后,按工具提示配置登录凭证。一般会要求你在交互式环境里完成认证,认证信息会保存在本机配置目录中。也可以在编辑器(如 VS Code)里安装对应插件,直接在编辑界面内使用补全与对话能力。
2.3 最小可运行示例
先做一次最简单的验证:让 Codex 输出一段 Shell 脚本,检查某个进程是否存活,不存活则自动拉起。
text
请写一个 Bash 脚本:
- 检查进程 nginx 是否在运行
- 如果不在运行,记录一条日志并尝试启动它
- 使用 systemctl 启动
- 脚本要兼容 set -euo pipefail
Codex 可能给出类似下面的结果:
bash
#!/usr/bin/env bash
set -euo pipefail
SERVICE="nginx"
LOG_FILE="/var/log/nginx_watchdog.log"
if ! pgrep -x "$SERVICE" >/dev/null 2>&1; then
echo "$(date '+%Y-%m-%d %H:%M:%S') $SERVICE is down, restarting..." >> "$LOG_FILE"
systemctl start "$SERVICE"
fi
这个例子虽然简单,但已经能体现 Codex 的工作方式:你明确边界,它补全实现。接下来我们进一步理解它内部是如何工作的。
3. 认识 Codex 的工作方式
3.1 提示词、上下文与输出窗口
Codex 的每次生成,本质上是"提示词 + 上下文"共同作用的结果。
- 提示词:你明确给出的指令,包括目标、约束、输入输出格式;
- 上下文:当前文件、相关代码片段、会话历史、你指定的参考文件等;
- 输出窗口:模型在单次对话中能生成的内容范围。
理解这三者的关系,能解释很多看似"不稳定"的现象:同样的需求,换个说法、少给一段上下文,结果可能完全不同。因此,把关键约束写进提示词,比指望模型"自己猜"要可靠得多。
3.2 好的描述如何影响脚本质量
写运维脚本提示词时,建议包含五个要素:
- 目标:脚本要完成什么任务;
- 输入:数据来源、文件路径、命令来源;
- 输出:期望的格式,例如表格、JSON、日志行;
- 约束:脚本语言、运行环境、依赖限制、错误处理要求;
- 示例:一条期望的输入和输出示例。
缺少任何一个要素,模型都只能用默认假设来补全,而这些假设未必符合你的真实环境。
3.3 明确需求 vs 模糊需求
对比下面两种写法:
text
# 模糊需求
帮我写个监控脚本。
text
# 明确需求
请写一个 Python 脚本:
- 目标:每 60 秒检查一次 /data/app 目录的磁盘占用率
- 当占用率超过 80% 时,向 stdout 打印告警,并退出码返回 1
- 当占用率不超过 80% 时,打印当前占用率,退出码返回 0
- 只允许使用 Python 标准库
- 路径和阈值需要支持通过命令行参数传入
前者的结果是不可控的;后者几乎可以直接得到可运行、可测试的脚本。提示词的明确程度,直接决定脚本的可用程度。
4. 实战一:日志分析与告警脚本
4.1 场景说明
线上 Nginx 服务每天产生大量访问日志,运维同学需要定期统计:
- 各 HTTP 状态码的数量;
- 5xx 错误的数量,超过阈值时发出告警。
这是一个非常典型的日志分析任务,用 Shell 的 grep、awk 就能完成,但字段位置容易写错,正好适合用 Codex 来生成。
4.2 编写提示词
text
请写一个 Bash 脚本分析 Nginx access.log:
- 日志路径通过第一个参数传入,默认 /var/log/nginx/access.log
- 统计每个 HTTP 状态码出现的次数,按状态码升序输出
- 统计 5xx 状态码的总数
- 如果 5xx 总数超过 100,打印一行 ALERT 并退出码返回 1,否则返回 0
- 状态码位于日志行中用双引号包裹的请求字段之后,例如:
127.0.0.1 - - [10/Oct/2024:13:00:00 +0800] "GET /api HTTP/1.1" 502 123
这里 502 就是状态码
- 使用 awk 提取字段,支持 gzip 压缩过的 .gz 文件(用 zcat)
提示词里给出了日志样例和状态码位置,这样模型就不需要靠猜测 Nginx 日志格式。
4.3 Codex 生成的脚本
Codex 可能输出如下脚本:
bash
#!/usr/bin/env bash
set -euo pipefail
LOG_FILE="${1:-/var/log/nginx/access.log}"
cat_log() {
if [[ "$LOG_FILE" == *.gz ]]; then
zcat "$LOG_FILE"
else
cat "$LOG_FILE"
fi
}
# 统计状态码:通过正则从 "GET /api HTTP/1.1" 502 中提取尾部状态码
status_counts=$(cat_log \
| awk '{ for (i=1; i<=NF; i++) if ($i ~ /^[0-9]{3}$/) { count[$i]++; break } }
END { for (code in count) print code, count[code] }' \
| sort -n)
echo "状态码统计:"
echo "$status_counts"
five_xx_total=$(echo "$status_counts" \
| awk '$1 >= 500 && $1 <= 599 { sum += $2 } END { print sum + 0 }')
echo "5xx 错误总数:$five_xx_total"
if (( five_xx_total > 100 )); then
echo "ALERT: 5xx 错误数超过阈值 100"
exit 1
fi
4.4 运行、验证与微调
先用一小段测试日志验证:
bash
# 构造测试日志
cat > /tmp/test_access.log <<'EOF'
127.0.0.1 - - [10/Oct/2024:13:00:00 +0800] "GET /api HTTP/1.1" 200 512
127.0.0.1 - - [10/Oct/2024:13:00:01 +0800] "GET /api HTTP/1.1" 502 323
127.0.0.1 - - [10/Oct/2024:13:00:02 +0800] "POST /login HTTP/1.1" 200 1024
127.0.0.1 - - [10/Oct/2024:13:00:03 +0800] "GET /health HTTP/1.1" 200 200
EOF
chmod +x analyze_nginx.sh
./analyze_nginx.sh /tmp/test_access.log
运行后可以看到状态码统计正常。如果发现数字提取有误,可以继续在会话中让 Codex 调整 awk 逻辑,例如"状态码只匹配三位数组成的字段,且只取每行第一个符合条件的字段"。把验证反馈带回给 Codex,是持续提升脚本质量的关键闭环。
5. 实战二:批量主机巡检脚本
5.1 场景说明
生产环境里,运维经常需要对多台主机执行同样的检查命令,汇总 CPU、内存、磁盘和负载情况。手动登录每台机器太慢,写 SSH 批量脚本又会遇到超时、认证失败、输出错乱等问题。
这个场景用 Python 的 paramiko 库比较合适:代码结构清晰,容易做异常处理和结果汇总。
5.2 编写提示词
text
请写一个 Python 脚本,批量 SSH 巡检多台 Linux 主机:
- 主机列表从 JSON 文件读取,格式:
[
{"host": "192.168.1.10", "user": "ops", "key_file": "/home/ops/.ssh/id_rsa"},
{"host": "192.168.1.11", "user": "ops", "key_file": "/home/ops/.ssh/id_rsa"}
]
- 对每台主机执行以下命令:
- hostname
- uptime
- free -m | head -2
- df -h / | tail -1
- 使用 paramiko 库,通过私钥认证,不允许使用密码明文
- 单台主机连接超时 10 秒,连接失败要记录错误但不要中断整个巡检
- 结果以表格形式输出到 stdout,列:主机、连接状态、主机名、负载、内存使用、根分区使用率
- 完全使用 Python 标准库和 paramiko,不依赖其他第三方库
5.3 Codex 生成的脚本
python
#!/usr/bin/env python3
import json
import sys
import paramiko
def load_hosts(path):
with open(path, "r", encoding="utf-8") as f:
return json.load(f)
def run_command(ssh, command):
stdin, stdout, stderr = ssh.exec_command(command)
out = stdout.read().decode("utf-8").strip()
err = stderr.read().decode("utf-8").strip()
return out, err
def inspect_host(host_info):
host = host_info["host"]
user = host_info["user"]
key_file = host_info["key_file"]
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
ssh.connect(host, username=user, key_filename=key_file, timeout=10)
hostname, _ = run_command(ssh, "hostname")
uptime, _ = run_command(ssh, "uptime")
mem, _ = run_command(ssh, "free -m | head -2")
disk, _ = run_command(ssh, "df -h / | tail -1")
load = uptime.split("load average:")[-1].strip() if "load average:" in uptime else "N/A"
mem_line = mem.splitlines()[-1].split() if mem else []
mem_usage = f"{mem_line[2]}/{mem_line[1]}MB" if len(mem_line) >= 3 else "N/A"
disk_usage = disk.split()[-2] if disk else "N/A"
return {
"host": host,
"status": "OK",
"hostname": hostname,
"load": load,
"mem": mem_usage,
"disk": disk_usage,
}
except Exception as exc:
return {
"host": host,
"status": f"FAIL: {exc}",
"hostname": "-",
"load": "-",
"mem": "-",
"disk": "-",
}
finally:
ssh.close()
def main():
if len(sys.argv) != 2:
print("用法: python inspect_hosts.py hosts.json")
sys.exit(2)
hosts = load_hosts(sys.argv[1])
rows = [inspect_host(h) for h in hosts]
header = f"{'主机':<16} {'状态':<8} {'主机名':<20} {'负载':<24} {'内存':<16} {'根分区使用率':<12}"
print(header)
print("-" * len(header))
for r in rows:
print(
f"{r['host']:<16} {r['status']:<8} {r['hostname']:<20} "
f"{r['load']:<24} {r['mem']:<16} {r['disk']:<12}"
)
if __name__ == "__main__":
main()
5.4 处理超时、异常与输出格式化
这段脚本的几个关键点值得注意:
- 用
set_missing_host_key_policy(paramiko.AutoAddPolicy())避免首次连接时因known_hosts校验失败; - 每台主机独立 try/except,单台失败不中断,符合设备数量多时的巡检诉求;
- 输出表格用字符串格式化对齐,方便直接粘贴到日报。
实际使用时,建议先在小范围主机上试验,确认私钥路径和 SSH 权限无误后再扩大范围。
6. 实战三:定时自动备份与清理
6.1 场景说明
某台服务器上的应用数据需要每天备份一次,并保留最近 7 天的备份文件,过期文件自动删除。这个需求非常适合脚本化:备份动作、保留策略、定时调度三条线都很清晰。
6.2 编写提示词
text
请写一个 Bash 备份脚本:
- 将 /data/app 目录使用 tar 打包压缩,压缩格式为 gzip
- 备份文件保存到 /backup/app 目录
- 备份文件命名格式:app_YYYYmmdd_HHMMSS.tar.gz
- 使用 date 命令生成时间戳
- 备份完成后,删除 /backup/app 下超过 7 天的 app_*.tar.gz 文件
- 使用 find 命令清理过期文件,删除前打印要删除的文件名
- 所有操作记录日志到 /var/log/backup_app.log
- 要求脚本幂等:重复执行不会产生破坏性结果
6.3 Codex 生成的脚本
bash
#!/usr/bin/env bash
set -euo pipefail
SOURCE_DIR="/data/app"
BACKUP_DIR="/backup/app"
LOG_FILE="/var/log/backup_app.log"
RETENTION_DAYS=7
mkdir -p "$BACKUP_DIR"
timestamp=$(date '+%Y%m%d_%H%M%S')
backup_file="$BACKUP_DIR/app_${timestamp}.tar.gz"
echo "$(date '+%Y-%m-%d %H:%M:%S') 开始备份 $SOURCE_DIR -> $backup_file" >> "$LOG_FILE"
tar -czf "$backup_file" -C "$(dirname "$SOURCE_DIR")" "$(basename "$SOURCE_DIR")"
echo "$(date '+%Y-%m-%d %H:%M:%S') 备份完成:$backup_file" >> "$LOG_FILE"
# 清理超过 7 天的备份文件
echo "$(date '+%Y-%m-%d %H:%M:%S') 开始清理超过 ${RETENTION_DAYS} 天的备份文件" >> "$LOG_FILE"
find "$BACKUP_DIR" -name "app_*.tar.gz" -type f -mtime +${RETENTION_DAYS} -print \
-exec tee -a "$LOG_FILE" {} \; \
-exec rm -f {} \;
echo "$(date '+%Y-%m-%d %H:%M:%S') 清理完成" >> "$LOG_FILE"
6.4 脚本安全性与幂等性检查
备份脚本直接操作文件,上线前务必检查:
-
压缩路径 :
tar -czf中-C切到父目录再打包,避免解压时出现多层绝对路径;可以手动解压验证:bashtar -tzf /backup/app/app_20241010_120000.tar.gz | head -
清理条件 :
find -mtime +7表示修改时间在 7 天前,逻辑上符合"保留最近 7 天"的需求; -
幂等性:每次执行只是生成新备份并删除过期文件,不会重复修改已有文件,可安全纳入定时任务。
6.5 接入 Cron
用 crontab -e 添加一条每天凌晨 2 点执行的任务:
cron
0 2 * * * /usr/local/bin/backup_app.sh
添加后先用 crontab -l 确认,再手动执行一次脚本确保路径和权限无误。
7. 实战四:Kubernetes 资源检查脚本
7.1 场景说明
在 Kubernetes 集群中,运维需要定期检查:
- 是否存在非 Running 状态的 Pod;
- 各命名空间的资源配额使用率;
- 节点资源是否紧张。
直接拼 kubectl 命令很容易把输出字段写错,特别是 JSONPath 的语法。用 Codex 可以快速生成一个可复用的检查脚本。
7.2 编写提示词
text
请写一个 Bash 脚本检查 Kubernetes 集群:
- 列出所有命名空间中状态不是 Running 或 Succeeded 的 Pod
- 输出格式:命名空间、Pod 名称、状态、重启次数
- 使用 kubectl get pods --all-namespaces 命令获取数据
- 使用 awk 解析输出,不依赖 jq
- 统计异常 Pod 数量,如果超过 0 则退出码返回 1
- 输出第一行是表头
7.3 Codex 生成的脚本
bash
#!/usr/bin/env bash
set -euo pipefail
kubectl get pods --all-namespaces -o wide \
| awk 'NR == 1 { next }
$4 != "Running" && $4 != "Succeeded" {
printf "%-20s %-40s %-12s %s\n", $1, $2, $4, $5
count++
}
END { exit count > 0 ? 1 : 0 }'
上面这个版本的退出码取决于 awk 的 END 块,逻辑清晰但输出表头需要单独处理。更推荐进一步让 Codex 优化成先输出表头再统计的形式:
bash
#!/usr/bin/env bash
set -euo pipefail
echo "命名空间 Pod 状态 重启次数"
echo "--------------------------------------------------------------------------------"
abnormal=0
kubectl get pods --all-namespaces \
| awk '$4 != "Running" && $4 != "Succeeded" && NR > 1 {
printf "%-20s %-40s %-12s %s\n", $1, $2, $4, $5
count++
}
END { exit count > 0 ? 1 : 0 }'
if (( $? != 0 )); then
abnormal=1
fi
if (( abnormal == 1 )); then
echo "存在异常 Pod"
exit 1
fi
echo "所有 Pod 状态正常"
7.4 常见错误与校对方法
kubectl 列宽在不同版本、不同终端宽度下可能变化,用固定列号解析容易出错。校对时建议:
- 先手动执行一次
kubectl get pods --all-namespaces,核对字段顺序; - 确认目标集群中是否已有 jq,如果有,优先使用
-o json配合 jq,可读性和稳定性更好; - 把脚本输出与实际
kubectl get pods结果逐行比对,确认状态、重启次数没有串列。
如果发现字段对不齐,可以回到会话让 Codex 改用 -o custom-columns 固定输出列,从源头消除解析歧义。
8. 提示词模板与工程化技巧
8.1 可复用的提示词模板
把前面的经验抽象成模板,可以显著提升日常使用效率:
text
请写一个 {语言} 脚本:
- 目标:{一句话描述任务}
- 输入:{数据来源、文件路径、参数}
- 输出:{期望格式,如表格、JSON、日志行}
- 约束:
- {运行环境或依赖限制}
- {错误处理、退出码、日志要求}
- 示例:{一条输入和期望输出示例}
请只给出可运行的代码,附带必要注释。
模板中的占位符按需替换即可。约束和示例是最有价值的两部分,它们直接决定了模型生成结果的可用程度。
8.2 拆任务、给示例、限定环境与依赖
大型运维任务不要试图让 Codex 一次性生成"全能脚本"。更好的做法是拆成多个小脚本或小函数,逐个验证后再组合。例如"批量巡检"可以拆成:
- 读取主机列表;
- 建立 SSH 连接并执行命令;
- 解析输出并汇总。
每步单独验证,出错时更容易定位,也方便在会话中让 Codex 针对性修复。
同时,要明确限定语言版本和依赖。Python 脚本要说明"只用标准库"还是"可以用 paramiko";Shell 脚本要说明 bash 还是 sh,是否兼容 POSIX。这些限定能避免模型引入你环境中不存在的依赖。
8.3 如何避免生成无法运行的"幻觉命令"
Codex 有时会生成并不存在的命令参数或错误的工具用法。减少这类问题:
- 优先选择常见稳定的工具:如 grep、awk、find、tar、kubectl、systemctl 等;
- 要求 Codex 给出验证方式:在提示词中让它附上测试用例或验证命令;
- 小步执行:先跑只读命令,再跑有副作用的命令;
- 让 AI 解释关键行:对不理解的部分,直接追问"这一行为什么这么写"。
记住:AI 生成的是草稿,不是最终答案。在测试环境验证通过,才是在生产环境使用的底线。
9. 安全与合规须知
运维脚本直接接触生产环境,安全要求远高于普通示例代码。
9.1 涉及生产环境的命令必须人工复核
任何删除、重启、修改配置、批量执行的命令,上线前必须逐行读懂,并在测试或预发环境验证。不要把 AI 生成的内容未经审查就执行,尤其是带有 rm -rf、kill、kubectl delete、systemctl restart 等高风险操作的脚本。
9.2 禁止直接执行未读懂的代码
看不懂的部分,不要抱着"应该没问题"的心态执行。可以让 Codex 解释代码逻辑,再对照官方文档确认。一条命令带来的事故成本,远远大于多花几分钟读懂它的成本。
9.3 敏感信息与密钥的传递注意事项
- 不要把 API Key、数据库密码、SSH 私钥内容直接粘贴到公共或不信任的对话环境中;
- 脚本中使用凭据时,优先通过环境变量、密钥管理系统或配置文件注入,避免硬编码;
- SSH 认证优先使用私钥文件,避免在脚本中明文写密码;
- 备份、日志等文件中如包含敏感信息,要设置合理的权限并纳入访问控制。
一个简单有效的原则:把 AI 当合作者,把最终责任留给自己。
10. 小结与进阶方向
10.1 本文实战回顾
本文围绕"用 Codex 写运维脚本"完成了四个典型场景:
| 场景 | 核心工具 | 关键收获 |
|---|---|---|
| 日志分析与告警 | Bash + awk | 用日志样例明确字段位置 |
| 批量主机巡检 | Python + paramiko | 异常隔离与结果汇总 |
| 定时备份清理 | Bash + tar/find | 幂等性与清理策略 |
| Kubernetes 检查 | kubectl + awk | 输出字段的稳定性校对 |
贯穿始终的方法只有一条:写清楚目标、输入、输出、约束和示例,再把结果带回验证。
10.2 进一步方向
掌握了基础用法后,可以朝这三个方向继续深入:
- 结合 Agent:让 AI 在执行脚本时能读取实时输出,根据错误自动调整下一步操作,形成"生成---执行---反馈---修正"的闭环;
- 接入 CI/CD:把脚本生成与测试纳入流水线,例如在代码评审阶段自动生成运维手册或部署脚本初稿;
- 构建内部运维工具:沉淀团队专用的提示词库、脚本模板和审查规范,把个人经验变成团队资产。
10.3 一个可持续打磨的练习路径
建议按下面的顺序持续练习:
- 每天把自己手写的运维脚本交给 Codex 重构,对比差异;
- 收集 10 个高频运维任务,为每个任务打磨一句高质量提示词;
- 建立个人脚本库,给所有脚本补充参数校验、日志和退出码规范;
- 每周复盘一次 AI 生成错误,总结成"避坑清单",反哺提示词模板。
AI 写运维脚本的收益,不在某一两个脚本上,而在你形成的**"明确描述需求 + 快速验证反馈"的工程习惯**。把这个习惯保持下去,Codex 才能成为真正的效率放大器。