Codex 实战:用 AI 写运维脚本

文章目录

    • [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 好的描述如何影响脚本质量

写运维脚本提示词时,建议包含五个要素:

  1. 目标:脚本要完成什么任务;
  2. 输入:数据来源、文件路径、命令来源;
  3. 输出:期望的格式,例如表格、JSON、日志行;
  4. 约束:脚本语言、运行环境、依赖限制、错误处理要求;
  5. 示例:一条期望的输入和输出示例。

缺少任何一个要素,模型都只能用默认假设来补全,而这些假设未必符合你的真实环境。

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 切到父目录再打包,避免解压时出现多层绝对路径;可以手动解压验证:

    bash 复制代码
    tar -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 一次性生成"全能脚本"。更好的做法是拆成多个小脚本或小函数,逐个验证后再组合。例如"批量巡检"可以拆成:

  1. 读取主机列表;
  2. 建立 SSH 连接并执行命令;
  3. 解析输出并汇总。

每步单独验证,出错时更容易定位,也方便在会话中让 Codex 针对性修复。

同时,要明确限定语言版本和依赖。Python 脚本要说明"只用标准库"还是"可以用 paramiko";Shell 脚本要说明 bash 还是 sh,是否兼容 POSIX。这些限定能避免模型引入你环境中不存在的依赖。

8.3 如何避免生成无法运行的"幻觉命令"

Codex 有时会生成并不存在的命令参数或错误的工具用法。减少这类问题:

  • 优先选择常见稳定的工具:如 grep、awk、find、tar、kubectl、systemctl 等;
  • 要求 Codex 给出验证方式:在提示词中让它附上测试用例或验证命令;
  • 小步执行:先跑只读命令,再跑有副作用的命令;
  • 让 AI 解释关键行:对不理解的部分,直接追问"这一行为什么这么写"。

记住:AI 生成的是草稿,不是最终答案。在测试环境验证通过,才是在生产环境使用的底线。

9. 安全与合规须知

运维脚本直接接触生产环境,安全要求远高于普通示例代码。

9.1 涉及生产环境的命令必须人工复核

任何删除、重启、修改配置、批量执行的命令,上线前必须逐行读懂,并在测试或预发环境验证。不要把 AI 生成的内容未经审查就执行,尤其是带有 rm -rfkillkubectl deletesystemctl 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 一个可持续打磨的练习路径

建议按下面的顺序持续练习:

  1. 每天把自己手写的运维脚本交给 Codex 重构,对比差异;
  2. 收集 10 个高频运维任务,为每个任务打磨一句高质量提示词;
  3. 建立个人脚本库,给所有脚本补充参数校验、日志和退出码规范;
  4. 每周复盘一次 AI 生成错误,总结成"避坑清单",反哺提示词模板。

AI 写运维脚本的收益,不在某一两个脚本上,而在你形成的**"明确描述需求 + 快速验证反馈"的工程习惯**。把这个习惯保持下去,Codex 才能成为真正的效率放大器。

相关推荐
用户73499134716531 小时前
我把思考外包给了AI,三个月后我成了自己项目的文盲
人工智能
Rocky Ding*1 小时前
【三年面试五年模拟】2026-08-18_哔哩哔哩_AI应用岗Agent开发一面面经(含完整答案)
论文阅读·人工智能·深度学习·机器学习·aigc·ai-native·ai agent
Geek-Chow1 小时前
02 多模态 LLM 是什么:定义、边界与生态位置
人工智能·大语言模型·多模态
广州硅基技术官方1 小时前
硅基技术OPC会客厅千城计划:构建AI时代“超级个体”的全国服务中心
人工智能
南鲸吖1 小时前
04 深入理解大语言模型
人工智能
小小帅呀1 小时前
学习VLA第3天:训练一个最简单的神经网络
人工智能·神经网络·学习
TDengine (老段)1 小时前
TDengine 应用案例 — 工业大数据与智能制造
大数据·数据库·制造·时序数据库·tdengine·涛思数据
数字护盾(和中)1 小时前
和中科技剖析 EDR 绕过全链路,AMSI、ETW 规避技术与防御对策
运维·网络·人工智能·科技·安全·web安全
土星云SaturnCloud1 小时前
高速服务区AI视觉全场景方案:安全管控+运营提效+服务升级,土星云边缘算力赋能智慧交通
服务器·人工智能·ai·边缘计算