尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

AI写运维脚本实战:Codex生成Shell脚本与安全审查指南

AI写运维脚本实战:Codex生成Shell脚本与安全审查指南 1. 运维脚本这件事为什么值得用 AI 重做一遍干了七八年运维我对手写脚本这件事的感情很复杂。一方面脚本是运维的命根子批量改配置、巡检、日志清理、服务重启全靠它另一方面写脚本本身就是个磨人的活——需求零碎、环境各异、参数记不住、报错还得现查。很多时候一个二十行的 Shell我要花半小时翻文档、试参数、调引号最后跑通了还得担心边界情况。这两年 AI 编程工具起来了我一开始是抗拒的。理由很实在运维脚本跟业务代码不一样它直接动生产环境一条rm -rf写错路径就是事故。但用 Codex 这类工具实际写了一段时间之后我的态度变了。不是因为它能替我拍板而是它把从想法到可运行脚本这段最枯燥的路给铺平了——你描述清楚要干什么它给你一版能跑的骨架你在上面改效率完全不是一个量级。这篇东西就是把我这段时间用 Codex 写运维脚本的完整经验摊开讲。包括怎么装、怎么描述需求、怎么让它生成靠谱的脚本、怎么审、怎么防坑。适合两类人看一类是运维老手想把手上的重复活提速另一类是刚入行的朋友脚本功底还不扎实想借 AI 把活干利索。我不吹它能包打天下只讲我实测下来真正管用的部分。先说清楚一个前提AI 生成的运维脚本永远要经过人工审查才能上生产。这不是保守是底线。下面所有内容都建立在这个前提上。2. 环境准备Codex 的安装与基础配置2.1 装之前先想清楚你要哪种形态Codex 目前主要有几种使用形态选错了后面会一直别扭。我按实际使用场景给你分一下形态适合场景我的评价CLI 命令行工具终端里直接对话、生成脚本、跑命令运维首选跟工作流最贴桌面版应用想要图形界面、管理多个会话适合不习惯纯终端的人编辑器插件在写脚本的编辑器里直接调用边写边改时最顺手我个人的主力是 CLI。原因很简单运维的活儿本来就在终端里生成完脚本直接就能测不用来回切窗口。桌面版我也装了主要用来管理一些长期会话和历史记录找之前生成过的脚本方便。2.2 安装过程与常见卡点安装本身不复杂但有几个坑我踩过提前说。Windows 上装桌面版最常见的两个问题是登录不上和无法加载组织设置。前者多半是网络环境或者账号状态的问题换个时间段、确认账号本身能正常登录通常能解决后者一般是账号权限配置没同步退出重登一次基本就好。这两个报错我在社区里看到频率很高不用慌基本都是环境问题不是工具坏了。CLI 安装完之后第一次运行会让你做认证。这一步如果卡住先确认你的终端能正常访问外部服务再检查是不是有代理配置干扰。我遇到过配置文件里残留了一条旧的代理设置导致认证一直失败把那条删掉就通了。还有一个高频报错值得单独说codex is ignoring 1 unrecognized configuration setting. check for typos。这个不是致命错误是配置文件里有个它不认识的键。多数情况是你抄了别人的配置里面有个字段名拼错了或者版本不匹配。解决办法就是打开配置文件把那个不认识的键找出来删掉或者改对。它只是警告不影响主流程但看着烦建议清掉。2.3 配置文件的关键项Codex 的配置文件是它的行为中枢几个关键项我建议你一开始就设好默认模型选一个你账号能用的、稳定的模型。这里要注意有些模型名在特定组合下会报model is not supported之类的错遇到就换一个官方文档里明确支持的。审批策略这个最重要。建议设成执行命令前需要确认尤其是涉及文件删除、服务重启这类操作。别图省事设成全自动运维场景下这是给自己埋雷。工作目录限定在项目目录里别让它有权限到处乱跑。提示配置文件改完记得重启会话很多设置是启动时读取的热改不生效。2.4 关于模型接入的一点说明Codex 支持接入不同的模型后端。有人喜欢接自己的模型服务这本身没问题但要注意兼容性——不是所有模型都能完整支持 Codex 的工具调用协议接上去可能出现能聊天但不能执行命令的情况。我的建议是先用官方默认配置跑通全流程确认没问题了再折腾自定义接入。一上来就搞复杂配置出问题你都不知道是哪一层的事。3. 用 Codex 写运维脚本的核心方法论3.1 为什么描述需求比写代码更关键用 AI 写脚本最大的认知转变是你的核心工作从写代码变成了把需求说清楚。这听起来简单实际非常考验人。我见过太多人上来就说帮我写个巡检脚本然后抱怨 AI 生成的东西不能用。问题不在 AI在于巡检这两个字背后有几十种可能。我的做法是把需求拆成四个维度每次描述都覆盖到目标这个脚本要达成什么结果一句话说清。输入它从哪拿数据文件、命令输出、还是参数。输出结果长什么样打印到终端、写文件、还是发通知。约束运行环境、权限、不能碰的东西、异常怎么处理。举个例子同样是清理日志我会这么描述写一个 Bash 脚本清理 /var/log/app/ 目录下 7 天前的 .log 文件。要求只删 .log 结尾的不碰其他文件删除前先打印将要删除的文件列表支持 --dry-run 参数只预览不实删删除操作记录到 /var/log/cleanup.log如果目录不存在就退出并报错。你看这么一说生成出来的脚本基本就能用了。需求描述的质量直接决定生成脚本的质量这是整个流程里最值得花时间的地方。3.2 让 Codex 先给方案再给代码我有个习惯不让它一上来就写代码而是先让它给思路。比如我要批量在多台服务器上检查磁盘使用率超过 80% 就告警。先别写代码告诉我你会怎么设计这个脚本有哪些要考虑的点。它会列出怎么读服务器列表、怎么并发还是串行、怎么解析df输出、怎么判断阈值、怎么发告警、失败怎么重试。这个方案讨论的过程往往能帮我发现需求里没想到的坑。确认思路没问题了再让它按这个思路写代码质量高很多。这个先方案后代码的节奏是我用下来觉得最值的一个技巧。它把 AI 从代码生成器变成了设计搭档。3.3 分而治之别让它一次写太复杂的东西一个脚本如果超过一百行、逻辑分支特别多AI 生成的质量会明显下降而且你审查起来也累。我的做法是拆把一个大脚本拆成几个小函数或者几个独立脚本逐个生成、逐个测。比如一个完整的部署脚本我会拆成环境检查、依赖安装、配置生成、服务启动、健康检查五块。每块单独让 Codex 写单独测通最后再拼起来。这样每一步都可控出问题也好定位。3.4 让它解释自己的代码生成完脚本我一定会加一句逐行解释这个脚本在做什么特别是那些不常见的参数和边界处理。这一步有两个作用。一是帮我快速审查看它有没有理解错需求二是很多参数我自己也记不全借这个机会复习一遍。有时候它解释到某一行我自己就发现哎这个逻辑不对比干看代码快多了。4. 实战三类高频运维脚本的生成与打磨4.1 批量巡检脚本从需求到可运行巡检是运维最日常的活。我拿批量检查服务器基础指标这个场景走一遍完整流程。第一步描述需求。我给 Codex 的输入是这样的写一个 Bash 脚本读取 servers.txt每行一个主机名通过 SSH 依次连接每台机器采集以下指标CPU 负载uptime、内存使用free -m、磁盘使用df -h、系统运行时间。把每台机器的结果汇总输出格式清晰。连接失败的主机要记录到 failed.txt不要中断整个流程。第二步看它给的方案。它提出用while read循环读文件用ssh -o ConnectTimeout5设置超时用ssh -o BatchModeyes避免交互式密码提示卡住。这两个参数很关键尤其是BatchMode不加的话遇到需要密码的主机会一直挂着整个脚本就卡死了。这个细节它主动提出来了说明方案是靠谱的。第三步生成代码。核心结构大概是这样#!/bin/bash SERVER_FILEservers.txt FAILED_FILEfailed.txt $FAILED_FILE while read -r host; do [ -z $host ] continue echo $host if ssh -o ConnectTimeout5 -o BatchModeyes $host \ uptime; free -m; df -h; uptime -p 2/dev/null; then echo [OK] $host else echo [FAIL] $host echo $host $FAILED_FILE fi echo done $SERVER_FILE第四步打磨。生成之后我做了几处调整加了并发用xargs -P或者后台任务因为串行跑几十台太慢把输出重定向到带时间戳的文件方便回溯给df加了-x tmpfs排除临时文件系统不然输出里一堆没用的挂载点。这里有个经验AI 生成的脚本通常是正确但不够好用。它能跑通但性能、输出格式、边界处理往往需要你按自己的习惯调。别指望一次到位把它当成一个高质量的初稿。4.2 日志清理脚本边界情况是重点日志清理看着简单其实坑最多。我让 Codex 写的时候重点盯几个地方。删除范围。一定要明确只删什么。我见过有人脚本写错把整个目录清了。所以我在需求里写死只匹配*.log且用find的-name精确匹配不用通配符乱扫。时间判断。find的-mtime 7是修改时间超过 7 天注意是超过不是等于。这个号的含义很多人搞混。我让 Codex 解释了一遍确认它用的是7而不是7。dry-run 模式。这个必须有。我要求脚本默认就是 dry-run要真删得显式加--force。这样即使误触发也不会出事。#!/bin/bash LOG_DIR/var/log/app DAYS7 DRY_RUNtrue [[ $1 --force ]] DRY_RUNfalse if [ ! -d $LOG_DIR ]; then echo 目录不存在: $LOG_DIR 2 exit 1 fi find $LOG_DIR -maxdepth 1 -name *.log -mtime $DAYS -type f | while read -r f; do if $DRY_RUN; then echo [DRY-RUN] 将删除: $f else rm -f $f echo [DELETED] $f /var/log/cleanup.log fi done一个容易忽略的点find ... | while read这种写法管道会开子 shell循环里的变量在外面读不到。如果你需要在循环里累加计数得用进程替换 (find ...)或者改用for。这个坑我踩过计数永远是 0查了半天。4.3 服务健康检查与自动重启这类脚本风险最高因为它会动服务。我的原则是AI 生成逻辑人工加保险。需求描述写一个脚本检查 nginx 服务状态如果没在运行就尝试重启重启后等待 5 秒再检查一次如果还是失败就发告警并退出。所有操作记录日志。Codex 生成的逻辑基本对但我会额外加几层保险重启前先确认不是正在重启中避免重复触发。限制重启频率比如一小时内最多重启 3 次超过就只告警不重启防止服务本身有问题时无限重启。告警要有去重别一分钟发十条。#!/bin/bash SERVICEnginx LOG/var/log/healthcheck.log MAX_RESTART3 WINDOW3600 log() { echo $(date %F %T) $* $LOG; } if systemctl is-active --quiet $SERVICE; then exit 0 fi log 服务 $SERVICE 未运行尝试重启 systemctl restart $SERVICE sleep 5 if systemctl is-active --quiet $SERVICE; then log 重启成功 else log 重启失败发送告警 # 告警逻辑 fi频率限制那段我一般单独写个函数用日志文件里的时间戳来算。这块 AI 生成得不一定完美需要你自己补。5. 审查与验证AI 脚本上生产前的必做功课5.1 三层审查法我审 AI 生成的运维脚本分三层缺一不可。第一层逻辑审查。通读一遍看它有没有理解错需求。重点看条件判断、循环边界、异常分支。这一步靠人AI 帮不上。第二层危险操作审查。把所有涉及删除、覆盖、重启、改配置的行单独拎出来看。rm、mv、、systemctl、chmod这些是重点。确认路径对不对、变量有没有可能为空。变量为空导致rm -rf $DIR/变成rm -rf /是经典事故所以脚本开头一定要有变量校验。第三层实测。在测试环境或者用 dry-run 跑一遍看输出对不对。没有测试环境就用容器起一个或者拿一台不重要的机器试。永远不要拿生产环境当第一个测试场。5.2 让 Codex 帮你做对抗性审查有个技巧我经常用生成完脚本后反过来问它假设这个脚本要在生产环境跑你觉得最可能出问题的地方在哪有哪些边界情况没考虑到它会给你列一堆潜在问题有些是你没想到的。比如它可能提醒你如果 servers.txt 里有空行会怎样、如果 SSH 密钥没配好会怎样、如果磁盘满了日志写不进去会怎样。这些对抗性的提问能显著提高脚本的健壮性。5.3 版本管理不能省AI 生成的脚本我全部纳入 Git 管理。每次修改都有记录出问题能回滚。别觉得运维脚本随便放放就行真出事的时候能快速回退到上一个可用版本比什么都重要。6. 常见问题与排查速查6.1 Codex 使用中的高频报错报错信息可能原因处理方式登录不上账号状态或网络环境确认账号可正常登录换时段重试无法加载组织设置权限配置未同步退出重登unrecognized configuration setting配置文件有拼写错误或版本不匹配的键找到并删除该键model is not supported模型名与当前配置组合不兼容换成官方支持的模型命令执行无响应审批策略或权限限制检查审批设置和工作目录权限6.2 生成脚本的典型问题问题一脚本能跑但输出太乱。这是最常见的。AI 默认的输出格式往往不适合人看。解决办法是在需求里明确输出格式或者生成后自己加格式化处理。问题二边界处理缺失。比如文件不存在、变量为空、命令失败没判断。这个必须人工补。我的习惯是每个关键命令后面都加|| exit 1或者错误处理。问题三性能问题。串行处理大量数据时特别明显。需要自己改成并发或者用更高效的工具比如awk替代多层循环。问题四环境依赖没说明。AI 生成的脚本可能用了某些命令但没告诉你需要装什么。跑之前确认依赖都在。6.3 我的避坑清单脚本开头永远加set -euo pipefail让错误及时暴露而不是默默跑完。所有变量引用加引号$VAR防止空格和空值问题。危险操作前先 echo 出将要执行的内容确认无误再执行。重要脚本加锁防止重复运行用flock。日志一定要写出问题时有据可查。别在脚本里硬编码密码用密钥或者环境变量。注意set -e有个坑在某些条件判断里会导致意外退出。用之前确认你理解它的行为或者用set -e配合|| true处理允许失败的命令。7. 我个人的一些体会用 Codex 写运维脚本这段时间最大的感受是它改变的不是我会不会写脚本而是我从想法到落地要多久。以前一个批量操作脚本从构思到测通可能要大半天现在描述清楚需求生成、审查、调整一两个小时能搞定。省下来的时间我可以花在更需要判断力的地方比如设计更合理的监控策略、梳理系统架构。但它也确实有边界。它不懂你的生产环境不知道哪台机器是核心、哪个目录不能碰、哪个服务重启会影响业务。这些判断只能你自己做。所以我的定位一直很清楚Codex 是加速器不是决策者。它负责把重复劳动干掉我负责把关和拍板。还有一点别把它当黑盒。生成的每一行代码尤其是涉及危险操作的都要看懂。看不懂就问它让它解释。这个过程本身也是学习用久了你会发现自己的脚本功底也在涨。最后分享一个小习惯我会把每次生成的好用脚本整理成一个自己的脚本库按场景分类存好。下次遇到类似需求直接改改就能用比重新生成还快。AI 帮你写一次你把它沉淀下来就是自己的资产了。
返回列表