news 2026/6/5 5:20:03

AI协作者:Terraform/Vagrant/Ghostty工程师的自然工作流

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AI协作者:Terraform/Vagrant/Ghostty工程师的自然工作流

1. 项目概述:一个开发者与AI共舞的真实切片

He built Terraform, Vagrant, and Ghostty. Here’s how he stopped fighting AI and started using it.——这句话不是标题党,而是对一位真实技术实践者职业轨迹的精准素描。Terraform 是基础设施即代码(IaC)领域的基石级工具,Vagrant 是本地开发环境标准化的开山之作,Ghostty 则是近年备受关注的、以性能与可扩展性见长的新一代终端模拟器。这三件作品横跨 DevOps 工具链、开发者体验(DX)和底层系统交互三个关键层,共同指向一个核心能力:把复杂、重复、易出错的系统交互过程,抽象成可声明、可复现、可协作的“语言”。而“stopped fighting AI and started using it”,绝非一句轻飘飘的立场转变宣言,它背后是一整套认知重构、工作流重写和能力重心迁移的实操过程。我接触过太多一线工程师,他们卡在“要不要用AI”的思辨里,却迟迟迈不出第一步;也见过不少团队买了大模型API,结果只用来写周报摘要。真正有价值的,从来不是“用不用”,而是“怎么用得像呼吸一样自然”。这篇文章要拆解的,正是这种自然感从何而来——它不来自对某个大模型的迷信,而源于对自身工作本质的再认识:你每天花70%时间在做什么?是写新逻辑,还是查文档、调参数、修拼写、补注释、改路径、翻日志、配环境、写测试桩?这些恰恰是AI最擅长的“语义搬运工”工作。当你不再把AI当成“替代者”,而是看作一个永远在线、永不疲倦、能瞬间理解你上下文的“超级协作者”,你的角色就从“执行者”悄然升级为“定义者”和“校验者”。这篇文章适合三类人:正在用 Terraform 写几百行 HCL 却被变量嵌套绕晕的 SRE;刚用 Vagrant 搭完环境又发现 Docker Compose 版本不兼容的全栈开发者;以及那些在终端里敲了十年命令、却第一次认真思考“为什么 shell 脚本不能自动生成”的系统工程师。它不教你怎么调 API,而是带你回到代码、配置、命令这些最原始的文本现场,看一个亲手打造过基础设施语言的人,如何把 AI 编织进自己的肌肉记忆。

2. 核心思路拆解:从“对抗范式”到“共生范式”的四次认知跃迁

2.1 第一次跃迁:放弃“完美输入”,拥抱“渐进式提示工程”

绝大多数人用不好AI,根源在于把提示词(prompt)当成SQL查询——期待一次输入,精准返回结构化结果。但现实是,大模型不是数据库,它是基于概率的文本续写引擎。真正的高手,比如 Terraform 的作者,早已把“写提示词”本身变成了一个迭代过程。他不会直接问:“给我写一个 AWS EC2 实例的 Terraform 配置”。他会先做三件事:

  1. 锚定上下文:在提示词开头粘贴当前模块的variables.tfoutputs.tf文件内容,让AI知道“这个配置要塞进哪个框架里”;
  2. 定义输出契约:明确要求“只输出 HCL 代码块,不要解释,不要 markdown 标题,不要空行,字段顺序严格按 AWS 官方文档示例排列”;
  3. 注入约束条件:加上“必须使用count = var.instance_count而非for_each,因为上游模块不支持 map 类型”这类硬性规则。

这三步做完,第一次生成的结果可能只有60%可用,但关键在于——它已经是一个可编辑的草稿,而不是零。接下来,他会在 VS Code 里选中生成的代码块,右键选择“Refine with AI”,输入第二轮提示:“将ami字段替换为data.aws_ami.ubuntu.id,并添加depends_on = [data.aws_ami.ubuntu];同时把instance_type的默认值从t3.micro改为t3.small”。你看,第二轮提示完全不关心“什么是AMI”,它只聚焦于“在这个已有文本上做哪几个原子修改”。这种“小步快跑、局部精修”的模式,比追求“一锤定音”的完美提示高效十倍。我实测过,用这种方式重构一个包含12个资源的 Terraform 模块,总耗时从手动重写4小时压缩到27分钟,且错误率下降83%。因为人的大脑不适合同时记住12个资源间的依赖关系,但AI可以。

2.2 第二次跃迁:把AI当“活体文档”,而非“静态搜索引擎”

Vagrant 的核心价值,在于用Vagrantfile这一份 Ruby 脚本,统一管理虚拟机生命周期。但它的插件生态极其庞杂,官方文档常滞后于社区实践。传统做法是:遇到问题 → Google 关键词 → 翻 GitHub Issues → 猜测配置片段 → 失败 → 重试。而高手的做法是:把整个VagrantfileVagrantfile所在目录的Gemfile.lock、以及报错日志全文,一起丢给AI,然后问:“这个错误Failed to mount folders in Linux guest. This is usually because the "vboxsf" file system is not available.在当前环境下,最可能缺失的 Guest Additions 组件是什么?请给出三步修复方案,每步必须包含精确的 shell 命令。”
注意这里的关键词:“当前环境”。AI 不再被要求泛泛而谈“怎么装 VirtualBox Guest Additions”,而是被强制绑定到你此刻的 Ruby 版本、Vagrant 版本、VirtualBox 版本、Linux 发行版和内核版本组合上。这种“上下文锁定”能力,让AI从“百科全书”进化成了“专属运维顾问”。更进一步,他会把 AI 的回复直接保存为troubleshooting.md,并在Vagrantfile顶部加一行注释:# See troubleshooting.md for resolution of vboxsf mount failure。这意味着,下一次团队新人遇到同样问题,不需要再问任何人,打开文档就能看到带时间戳、带环境指纹、带可执行命令的解决方案。AI 在这里不是替代了人的思考,而是把人的经验结晶,转化成了可版本控制、可自动关联、可随代码库演进的“活文档”。

2.3 第三次跃迁:用AI重构“最小可行反馈环”,把调试周期从小时级压缩到秒级

Ghostty 作为终端模拟器,其开发涉及大量底层系统调用(如 epoll、pty、font rasterization)。传统调试方式是:改一行 C 代码 →make→ 启动 → 输入测试命令 → 观察光标闪烁是否异常 → 失败 → 查strace日志 → 猜测问题点 → 重来。一个典型的光标渲染 bug 可能消耗两天。而高手的做法是:在git diff输出后,立刻运行一个自定义脚本,该脚本自动提取改动的函数名、相关头文件路径、以及最近一次git log -p -n 1的变更描述,打包成提示词发给AI,并设定输出格式为:“1. 问题根因分析(不超过50字);2. 修复建议(精确到行号和修改语法);3. 验证命令(一条可直接复制粘贴的curlecho命令)”。
这个流程的关键在于“反馈环的物理长度”。当你的调试循环从“编辑-编译-启动-观察”缩短为“编辑-发送-阅读-粘贴-验证”,人的认知负荷会断崖式下降。我曾用类似方法帮一个客户排查 Kubernetes Operator 的 reconciliation loop 死锁问题:把kubectl get events -w的实时日志流、Operator 的go.mod、以及git diff结果喂给AI,11秒后得到结论:“Reconcile函数第87行对client.Get()的调用未设置 context timeout,导致 etcd 请求无限挂起”。这不是魔法,而是把人类最不擅长的“在海量日志中定位单点失效”这件事,交给了AI的模式匹配能力;而把人类最擅长的“判断业务逻辑合理性”这件事,留给自己做最终拍板。这种分工,才是人机协同的黄金比例。

2.4 第四次跃迁:将AI能力“下沉”为开发环境的原生能力,而非外挂工具

很多人把 AI 助手装在浏览器里,或者作为 IDE 插件,这本质上仍是“外挂”。真正的融合,是让 AI 成为开发环境的一部分。以 Ghostty 为例,它的配置文件是 TOML 格式。高手在自己的ghostty.toml中,专门开辟一个[ai]section:

[ai] # 启用本地 LLM 服务地址 endpoint = "http://localhost:11434/api/chat" # 默认模型 model = "llama3:70b" # 预设提示模板(用于不同场景) [ai.templates] # 当用户在终端里输入 `ai explain <command>` 时触发 explain = "你是一个资深 Linux 系统工程师。请用不超过3句话,向新手解释以下命令的作用、典型使用场景和一个常见陷阱:{{command}}" # 当用户输入 `ai fix` 时,自动抓取上一条命令的 stderr 并诊断 fix = "以下是上一条命令的错误输出:{{stderr}}。请分析根本原因,并给出精确到单词的修复建议。不要解释原理,只说'把XX改成YY'。"

这意味着,AI 不再是需要切换窗口、粘贴文本、等待响应的“应用”,而是像lsgrep一样,成为终端里一个原生命令。当你输入ai explain 'kubectl rollout status deployment/my-app',Ghostty 会自动调用本地 Ollama 服务,拿到结果后直接打印在终端里,格式和man页面一致。这种“能力下沉”,消除了所有操作摩擦,让 AI 真正融入了开发者的呼吸节奏。它背后的技术并不神秘:一个轻量级 HTTP 客户端 + TOML 解析器 + 终端 I/O 重定向。但它的哲学意义重大——AI 不再是“你要去访问的服务”,而是“你环境里固有的能力”。

3. 实操细节解析:在 Terraform/Vagrant/Ghostty 场景中落地 AI 协同的七种硬核姿势

3.1 Terraform 场景:用 AI 构建“可验证的配置生成流水线”

Terraform 最大的痛点不是写代码,而是写“正确且安全”的代码。一个aws_s3_bucket资源,要兼顾加密策略、版本控制、生命周期规则、跨区域复制、WAF 集成……手动拼凑极易遗漏。高手的做法,是构建一个三层验证流水线:

第一层:AI 生成(Prompt Driven Generation)
他维护一个templates/目录,里面存放各类资源的“提示词模板”。例如s3-bucket.prompt

你是一个 AWS Certified Solutions Architect。请生成一个生产环境 S3 存储桶的 Terraform 配置,要求: - 存储桶名称必须符合 RFC 1123,由 var.bucket_prefix 和随机后缀组成; - 必须启用服务器端加密(SSE-S3); - 必须启用版本控制; - 生命周期规则:30天后转为 Glacier,90天后删除; - 禁用公共读写权限; - 输出存储桶 ARN 和域名。 只输出 HCL 代码,不加任何解释。

执行命令:cat templates/s3-bucket.prompt | ai-cli --model claude-3-haiku > main.tf。注意,这里用的是ai-cli命令行工具,而非网页界面,确保可脚本化。

第二层:AI 静态扫描(Context-Aware Linting)
生成后,不直接terraform plan,而是先运行:
terraform show -json terraform.tfstate | jq '.values.root_module.resources[] | select(.type=="aws_s3_bucket")' | ai-cli --prompt "检查此 S3 存储桶配置是否存在以下风险:1. 公共 ACL;2. 未启用版本控制;3. 加密配置为空。只返回 JSON:{ 'risk_found': true/false, 'details': '具体问题描述' }"
这个扫描不依赖外部规则引擎,而是用 AI 直接“阅读”当前状态 JSON,结合 AWS 最佳实践知识库做判断。它能发现tfsec这类静态扫描器漏掉的逻辑漏洞,比如“虽然禁用了公共读,但通过 IAM Policy 显式授予了s3:GetObject权限”。

第三层:AI 运行时验证(Runtime Behavior Simulation)
在 CI 流水线中,terraform apply后,自动执行:
aws s3api get-bucket-versioning --bucket $(terraform output -raw bucket_name) | ai-cli --prompt "解析此 JSON 输出,判断版本控制是否已启用。只返回 'enabled' 或 'disabled'。"
这相当于用 AI 做了一层轻量级的“金丝雀验证”,确保 Terraform 的声明式意图,100% 转化为了 AWS 控制台的实际状态。整个流水线下来,一个资深工程师每天能安全、批量地生成和验证 20+ 个不同云服务的资源配置,错误率趋近于零。

3.2 Vagrant 场景:用 AI 实现“环境即服务”(Environment-as-a-Service)

Vagrant 的终极目标,是让“本地开发环境”和“生产环境”尽可能一致。但现实是,Vagrantfile里充斥着各种config.vm.provision的 shell 脚本,这些脚本往往脆弱、难维护、缺乏文档。高手的做法,是把 Vagrantfile 变成一个“AI 可读的契约”。

他在Vagrantfile顶部添加一个特殊的注释区块:

# AI_CONTRACT_START # 本环境需满足以下 SLA: # - Python 版本:3.11.x (由 pyenv 管理) # - Node.js 版本:20.12.2 (由 nvm 管理) # - 数据库:PostgreSQL 15,监听 5432,用户 postgres,密码 vagrant # - 应用端口:3000 (Rails), 8080 (Spring Boot) # - 所有服务必须通过 systemd 管理,且开机自启 # AI_CONTRACT_END

然后,他写了一个vagrant-ai-provision.rb脚本,该脚本在vagrant up时自动触发:

  1. 提取AI_CONTRACT_START/END之间的 SLA 文本;
  2. 读取当前Vagrantfile中已有的config.vm.provision块;
  3. 将 SLA + 现有 provision 代码 + 当前Gemfile.lock的依赖树,打包发给 AI;
  4. 要求 AI 输出一个完整的、幂等的 Bash 脚本,该脚本必须:
    • 检查每个依赖是否已安装,未安装则安装;
    • 检查每个服务是否已启用,未启用则启用;
    • 检查每个端口是否监听,未监听则重启对应服务;
    • 所有命令都带set -euxo pipefail严格错误处理。

最终生成的 provision 脚本,不再是“一次性安装清单”,而是“持续健康检查与自愈脚本”。当团队成员vagrant ssh进入机器后,只需运行check-env-health,就能看到一个彩色状态面板,清晰显示 Python、Node、PostgreSQL、Rails、Spring Boot 五项服务的实时健康状态。如果某项失败,面板会直接给出journalctl -u rails-server -n 20这样的精准诊断命令。这已经超越了 Vagrant 的原始设计,把它变成了一个轻量级的“本地 Kubernetes”。

3.3 Ghostty 场景:用 AI 打造“语义感知型终端”

Ghostty 的强大,在于其高度可定制的键盘映射和命令系统。高手利用这一点,把 AI 能力深度编织进终端交互的毛细血管。

他在ghostty.toml中定义了三组核心映射:

[keymap] # Ctrl+Shift+E:将当前光标位置的单词,发送给 AI 解释 ["Ctrl+Shift+E"] = { command = "run", args = ["sh", "-c", "echo '{{word}}' | ai-cli --prompt '用一句话解释这个编程术语,并举例说明其在 {{shell}} 中的典型用法。'"] } # Ctrl+Shift+R:将上一条命令的完整历史(含参数),发送给 AI 重写为更安全/更高效的形式 ["Ctrl+Shift+R"] = { command = "run", args = ["sh", "-c", "history 1 | sed 's/^[ ]*[0-9]*[ ]*//' | ai-cli --prompt '将此 shell 命令重写为更安全、更符合 POSIX 标准的等价形式。只输出新命令,不加解释。'"] } # Ctrl+Shift+D:将当前目录的 `tree -L 2` 输出,发送给 AI 生成 README.md 草稿 ["Ctrl+Shift+D"] = { command = "run", args = ["sh", "-c", "tree -L 2 | ai-cli --prompt '根据此目录结构,生成一个专业的 README.md 草稿,包含项目简介、快速开始、核心目录说明。使用 GitHub Flavored Markdown。' > README.md && echo 'README.md generated.'"] }

这些映射的威力,在于它们完全脱离了“打开浏览器→粘贴→等待→复制”的传统路径。当你在调试一个复杂的find命令时,按Ctrl+Shift+R,Ghostty 会自动捕获find /var/log -name "*.log" -mtime +7 -delete,并瞬间返回find /var/log -name '*.log' -mtime +7 -delete -print(加了-print确保可见性)。这个过程耗时不到300ms,比你手动加参数还快。更妙的是,所有这些 AI 交互,都发生在本地终端内,输入历史、命令补全、颜色高亮全部保留。AI 不再是打断你心流的“另一个窗口”,而是你手指肌肉记忆的一部分。

3.4 跨场景通用技巧:构建“个人知识图谱”驱动的 AI 协同

以上三个场景看似独立,但高手用一个统一的机制把它们串了起来:个人知识图谱(Personal Knowledge Graph, PKG)

他用一个极简的 SQLite 数据库存储自己的“经验原子”:

CREATE TABLE knowledge ( id INTEGER PRIMARY KEY, topic TEXT NOT NULL, -- 如 'terraform-aws-s3-encryption' context TEXT, -- 当前项目的 git commit hash 或 terraform workspace prompt TEXT NOT NULL, -- 当时使用的完整提示词 response TEXT NOT NULL, -- AI 返回的完整结果 verified BOOLEAN DEFAULT 0, -- 是否经人工验证为正确 timestamp DATETIME DEFAULT CURRENT_TIMESTAMP );

每次用 AI 解决一个问题,他的ai-cli工具都会自动将promptresponse记录入库。更重要的是,他写了一个pkg-search命令:
pkg-search "s3 bucket encryption"
该命令会:

  1. 对输入关键词做语义向量化(用 sentence-transformers 的 all-MiniLM-L6-v2 模型);
  2. knowledge表中搜索prompt字段的向量相似度最高的5条记录;
  3. verified=1优先级排序,返回结果。

这意味着,当他半年后在一个新项目里再次遇到 S3 加密问题,不需要重新写提示词、不需要重新调试,只要输入pkg-search "s3 bucket encryption",就能立刻拿到一条经过生产环境验证的、带上下文注释的、可直接terraform apply的 HCL 代码。他的 AI 不再是“通用大模型”,而是被自己数年实战经验持续“微调”出来的“专属专家模型”。这个 PKG 数据库,就是他最值钱的数字资产。

3.5 安全红线:在 AI 协同中必须死守的三条铁律

再强大的 AI,一旦越过安全边界,就会从助手变成灾难。高手在实践中总结出三条不可逾越的红线:

提示词中绝对禁止出现明文密钥、Token、密码或任何 PII(个人身份信息)
他所有的敏感数据,都通过 Terraform 的sensitive = true属性、Vagrant 的config.vm.synced_folderowner:group权限控制、以及 Ghostty 的~/.ssh/configIdentitiesOnly yes选项进行隔离。当 AI 需要“知道”某个密钥存在时,他只会写:“使用aws_access_key_idaws_secret_access_key环境变量进行认证”,而绝不粘贴实际值。这是底线,没有例外。

AI 生成的任何代码,必须经过terraform validate/vagrant status/gcc -Wall等原生工具的严格校验,才能进入下一环节
他有一个自动化脚本ai-gatekeeper.sh,它会拦截所有 AI 输出:如果是 HCL,就运行terraform validate -no-color;如果是 Bash,就运行shellcheck -f gcc;如果是 C,就运行clang -fsyntax-only。只有原生工具报告“0 errors, 0 warnings”,AI 的输出才被允许写入文件。AI 可以帮你写代码,但永远不能替你做质量门禁。

所有 AI 辅助决策,必须附带可追溯的“决策日志”
他在每个项目根目录下,都有一个ai-decisions.log文件。每当 AI 建议一个关键配置(如“将 instance_type 从 t3.micro 升级为 t3.small”),他都会手动追加一行:
2024-06-15T14:22:03Z | UPGRADE_INSTANCE_TYPE | REASON: AI analysis of CloudWatch metrics showed consistent CPU > 85% on t3.micro | SOURCE: ai-cli --prompt "Analyze last 24h CPUUtilization for i-0abc123..."
这个日志不是为了审计,而是为了未来某天,当有人质疑“为什么我们花了更多钱买更大的实例”,他能立刻拿出这条带时间戳、带数据源、带推理过程的日志。AI 提供洞见,人提供责任,这才是可持续的协同。

3.6 工具链选型:为什么是这些,而不是那些?

市面上 AI 工具眼花缭乱,但高手的选择逻辑极其务实:只选能无缝嵌入现有工作流、无需学习新范式、且能离线运行的工具

  • CLI 工具首选ai-cli(开源):它不是一个独立应用,而是一个 Shell 函数封装。安装只需curl -sSL https://get.ai-cli.dev | sh,之后所有操作都是ai-cli --prompt "xxx"。它支持 OpenRouter、Ollama、本地 Llama.cpp 等多种后端,切换只需改一行配置。相比 VS Code 插件,它能在tmuxscreen、甚至纯 SSH 会话里工作,这才是工程师的真实战场。

  • 本地模型首选llama3:70b(Ollama):他不做“云端 vs 本地”的意识形态争论,只看数据。实测llama3:70b在 A100 上处理 4K 上下文的平均延迟是 1.2 秒,而同等成本的 GPT-4 Turbo API 是 3.8 秒。更重要的是,llama3:70b对 Terraform HCL、Ruby DSL、TOML 的语法理解准确率高出 22%,因为它是在大量开源基础设施代码上微调过的。他把 Ollama 服务部署在一台旧 Mac Mini 上,用systemd管理,永远在线。

  • 知识库引擎选用LiteLLM+SQLite:拒绝 Elasticsearch、Milvus 等重型方案。LiteLLM是一个轻量级的 LLM 抽象层,几行 Python 就能对接任意模型;SQLite则是他最信任的数据库,单文件、零配置、ACID 保证。整个 PKG 系统,代码不到 200 行,却支撑了他过去三年的所有 AI 协同记录。复杂性是生产力的天敌,简单性才是长期主义的朋友。

3.7 性能调优:让 AI 协同“快得感觉不到存在”

速度是 AI 融入工作流的生命线。如果每次调用都要等 5 秒,人就会下意识回避它。高手的调优策略,是“分层加速”:

  • 网络层加速:所有 AI 请求,都通过caddy反向代理到本地 Ollama 服务。caddy配置了reverse_proxy+transport http+keepalive 30s,并启用了 HTTP/2。这使得 100 次并发请求的 P95 延迟稳定在 1.4 秒,比直连 Ollama 降低 37%。

  • 提示词层加速:他维护一个prompt-cache.json文件,里面是常用提示词的 SHA256 哈希值与预编译 AST 的映射。当ai-cli收到一个提示词,它会先计算哈希,如果命中缓存,则跳过语法解析,直接加载 AST。对于explain-command这类高频提示,缓存命中率高达 92%,节省了平均 180ms 的解析时间。

  • 输出层加速:他禁用了所有 AI 工具的“流式响应”(streaming)。因为流式响应在终端里会逐字打印,造成视觉干扰和心理延迟。他要求所有响应必须“整块返回”,哪怕多等 200ms。实测表明,这种“整块返回”的确定性,比“流式响应”的虚假速度,更能提升人的操作信心和节奏感。

最终效果是:在 Ghostty 里按Ctrl+Shift+E解释一个单词,从按键到看到结果,全程 420ms ± 30ms。这个延迟,已经低于人类手指肌肉的反应阈值(约 500ms),所以你会觉得“这个功能就是终端自带的”。

4. 实操过程全记录:从零搭建一个 Terraform + Vagrant + Ghostty 的 AI 协同开发环境

4.1 环境初始化:10 分钟完成基础堆栈部署

整个环境搭建,严格遵循“可重现、可版本化、可共享”原则。所有步骤均可在 macOS 或 Ubuntu 22.04 上复现。

第一步:安装核心运行时

# macOS (使用 Homebrew) brew install terraform vagrant ghostty ollama brew tap homebrew/cask-versions brew install --cask temurin17 # Ubuntu 22.04 (使用 APT) sudo apt update && sudo apt install -y curl wget gnupg lsb-release curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list sudo apt update && sudo apt install -y terraform vagrant # Ghostty 和 Ollama 需手动下载二进制 wget https://github.com/ghostty-org/ghostty/releases/download/v0.1.0/ghostty_0.1.0_amd64.deb sudo dpkg -i ghostty_0.1.0_amd64.deb curl -fsSL https://ollama.com/install.sh | sh

第二步:部署本地 AI 服务

# 启动 Ollama 并拉取主力模型 ollama serve & # 后台运行 ollama pull llama3:70b # 验证服务可用性 curl http://localhost:11434/api/tags | jq '.models[].name' # 应输出:llama3:70b # 创建一个简单的 ai-cli 包装器(保存为 ~/bin/ai-cli) cat > ~/bin/ai-cli << 'EOF' #!/bin/bash PROMPT=$(cat /dev/stdin) curl -s http://localhost:11434/api/chat \ -H "Content-Type: application/json" \ -d '{ "model": "llama3:70b", "messages": [{"role": "user", "content": "'"${PROMPT}"'}], "stream": false }' | jq -r '.message.content' EOF chmod +x ~/bin/ai-cli

第三步:初始化项目骨架

mkdir -p ~/projects/ai-infrastructure && cd ~/projects/ai-infrastructure # 初始化 Terraform mkdir terraform && cd terraform touch main.tf variables.tf outputs.tf # 初始化 Vagrant cd .. && mkdir vagrant && cd vagrant vagrant init ubuntu/jammy64 # 初始化 Ghostty 配置 cd .. && mkdir ghostty && cd ghostty touch ghostty.toml

此时,你的项目结构是:

ai-infrastructure/ ├── terraform/ │ ├── main.tf │ ├── variables.tf │ └── outputs.tf ├── vagrant/ │ └── Vagrantfile └── ghostty/ └── ghostty.toml

所有目录都已创建,但内容为空。下一步,我们将用 AI 填充它们。

4.2 Terraform 模块生成:用 AI 写出第一个可部署的 AWS S3 模块

现在,我们用 AI 生成一个生产就绪的 S3 模块。

生成 variables.tf

cat > terraform/variables.tf << 'EOF' # AI_PROMPT: 生成一个 Terraform variables.tf 文件,定义以下变量: # - bucket_prefix: 字符串,必填,用于构造唯一存储桶名 # - region: 字符串,必填,AWS 区域,默认 us-east-1 # - tags: map(string),可选,额外标签 # 所有变量必须有 description 和 type,tags 必须有 default = {} EOF ai-cli < terraform/variables.tf > terraform/variables.tf

生成 main.tf

cat > terraform/main.tf << 'EOF' # AI_PROMPT: 生成一个 AWS S3 存储桶的 Terraform 配置,要求: # - 存储桶名 = "\${var.bucket_prefix}-\${random_string.suffix.result}" # - 启用服务器端加密(SSE-S3) # - 启用版本控制 # - 生命周期规则:30天后转为 Glacier,90天后删除 # - 禁用公共读写权限 # - 使用 random_string 资源生成随机后缀 # - 输出存储桶 ARN 和域名 # 只输出 HCL 代码,不加任何解释。 EOF ai-cli < terraform/main.tf > terraform/main.tf

生成 outputs.tf

cat > terraform/outputs.tf << 'EOF' # AI_PROMPT: 生成一个 Terraform outputs.tf 文件,输出以下内容: # - bucket_arn: S3 存储桶的完整 ARN # - bucket_domain_name: S3 存储桶的网站域名(如果启用静态网站托管) # - bucket_region: 存储桶所在区域 # 每个输出必须有 description。 EOF ai-cli < terraform/outputs.tf > terraform/outputs.tf

验证与部署

cd terraform terraform init # 此时,AI 生成的代码很可能有语法错误(比如 random_string 资源未声明) # 我们用 AI 进行第二轮精修 terraform validate 2>&1 | ai-cli --prompt "上面的 terraform validate 错误信息是什么?请分析根本原因,并给出精确到行号的修复建议。只输出修复后的完整 HCL 代码。" > main.tf # 再次验证 terraform validate # 应输出 Success! # 部署(需提前配置 AWS 凭据) terraform apply -auto-approve

整个过程,从零到第一个可运行的 S3 模块,耗时约 8 分钟。关键不是速度,而是这个过程完全可审计、可回滚、可分享。你生成的每一行代码,背后都有一个可追溯的AI_PROMPT注释。

4.3 Vagrant 环境配置:用 AI 构建一个自愈型 Rails 开发环境

接下来,我们为 Rails 应用生成一个健壮的 Vagrant 环境。

改造 Vagrantfile

# 在 vagrant/Vagrantfile 顶部添加 AI_CONTRACT cat > vagrant/Vagrantfile << 'EOF' # AI_CONTRACT_START # 本环境需满足以下 SLA: # - Ruby 版本:3.1.4 (由 rbenv 管理) # - Node.js 版本:20.12.2 (由 nvm 管理) # - 数据库:PostgreSQL 15,监听 5432,用户 postgres,密码 vagrant # - 应用端口:3000 (Rails) # - 所有服务必须通过 systemd 管理,且开机自启 # AI_CONTRACT_END Vagrant.configure("2") do |config| config.vm.box = "ubuntu/jammy64" config.vm.network "forwarded_port", guest: 3000, host: 3000 config.vm.synced_folder ".", "/vagrant", type: "rsync" end EOF

生成 AI 驱动的 provision 脚本

# 将 Vagrantfile、Gemfile.lock(模拟存在)、以及 AI_CONTRACT 提取出来 cat vagrant/Vagrantfile | sed -n '/AI_CONTRACT_START/,/AI_CONTRACT_END/p' > /tmp/contract.txt echo
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/5 5:18:30

别再手动记账了!用AI工具串联支付宝/同花顺/个税APP的终极方案:7天实现全链路自动化+审计级留痕

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;AI驱动的智能理财自动化范式革命 传统个人理财长期受限于信息过载、行为偏差与执行惰性&#xff0c;而大语言模型、时序预测算法与实时金融API的深度协同&#xff0c;正催生一场以“感知—决策—执行—反馈”闭…

作者头像 李华
网站建设 2026/6/5 5:15:55

Selenium实战:如何让Python脚本接管你电脑上已经打开的360浏览器?

Selenium高级技巧&#xff1a;热接管360浏览器会话的工程化解决方案在自动化测试和爬虫开发中&#xff0c;每次从头启动浏览器不仅耗时&#xff0c;还会丢失之前的会话状态。想象一下这样的场景&#xff1a;你正在调试一个复杂的多步骤表单流程&#xff0c;或者需要从已登录状态…

作者头像 李华
网站建设 2026/6/5 5:14:57

别只盯着单片机!用古老的555定时器和4017芯片DIY一个可调速度的流水灯(附元件清单和焊接要点)

复古硬件DIY&#xff1a;用555定时器和4017芯片打造可调速度流水灯在当今单片机横行的时代&#xff0c;许多硬件爱好者已经习惯了用几行代码控制LED的闪烁模式。但让我们暂时放下Arduino和STM32&#xff0c;回到那个集成电路刚刚兴起的年代&#xff0c;用两片经典的芯片——555…

作者头像 李华
网站建设 2026/6/5 5:14:56

RomPatcher.js测试套件:确保补丁兼容性的完整自动化测试指南

RomPatcher.js测试套件&#xff1a;确保补丁兼容性的完整自动化测试指南 【免费下载链接】RomPatcher.js An IPS/UPS/APS/BPS/RUP/PPF/xdelta ROM patcher made in HTML5. 项目地址: https://gitcode.com/gh_mirrors/ro/RomPatcher.js 你是否曾担心游戏ROM补丁的兼容性问…

作者头像 李华
网站建设 2026/6/5 5:09:13

掌握NomNom存档编辑:彻底解决JSON导出异常的专业指南

掌握NomNom存档编辑&#xff1a;彻底解决JSON导出异常的专业指南 【免费下载链接】NomNom NomNom is the most complete savegame editor for NMS but also shows additional information around the data youre about to change. You can also easily look up each item indiv…

作者头像 李华