Deploy anything, anywhere — even air-gapped.
纯 Rust · 单二进制 · 零运行时依赖的声明式远程执行引擎 在线与离线同一套 YAML,整套环境一个文件交付
$ crater apply rustfs --host 10.0.0.5 --password ***
[1/5] dir /data/rustfs → changed
[2/5] preflight: docker ready → ok
[3/5] load image (blob) rustfs:1.0.0-beta.5 → changed
[4/5] container rustfs <- rustfs:1.0.0-beta.5 → changed
[5/5] verify: rustfs api /health -> 200 → ok
done: changed=3 ok=2 warn=0
$ crater apply rustfs --host 10.0.0.5 --password *** # 再跑一次 → 幂等
done: changed=0 ok=5 warn=0面向弱网 / 离线 / 气隙 / 信创环境的整套交付,Ansible 的心智、terraform 的预演、docker 的制品分发——压进一个 19MB 的静态二进制:
| crater | Ansible | 备注 | |
|---|---|---|---|
| 运行时依赖 | 无(musl 静态) | Python + 模块库 | 两端零安装,SSH 即可 |
| 离线交付 | 一等公民(OCI 制品) | 自己想办法 | build → 一个文件 → 气隙部署 |
| YAML | 纯数据(逻辑全在引擎) | Jinja2 图灵完备 | 可静态分析,模板写 if/for 直接报错 |
| 执行模型 | 自举 agent(本地执行) | SSH 逐任务往返 | 多节点 7min → 17s 的差距来源 |
| 变更预演 | crater plan(连真机探针) |
check mode | terraform 习惯 |
- 📦 离线一包带走 —
build → save → apply:task 打成 OCI 制品(recipe + 物料,内容寻址);project 把整套环境(基线→docker→k8s→存储)装进一个.oci文件,跨 task 共享 blob 自动去重 - 🚀 自举 agent — 把自己(musl 静态,不挑 glibc)推到目标机本地执行,二进制按 sha256 缓存、离线物料按内容寻址 staging,重复部署零传输
- 🔍
crater plan— terraform 式变更预演:连真机只跑只读探针,报告✓ ok / ~ would-change / ? unknown,什么都不执行 - 🏪 registry 闭包分发 — project
push/pull连同全部 task 制品走私有仓库(zot/Harbor),apply <ref>直连编排 - ⚡ 构建缓存 — 源未变整体跳过(指纹);物料下载按声明 sha256/URL 寻址;重复 build 秒级
- 🧩 声明式模块 —
copytemplateservicepackagedocker_container等 13 个内置模块,幂等回显 ansible 式ok/changed;复杂交付用 role 复用,准入有章程 - 🌐 多节点编排 —
when_role/register+hostvars跨节点传 fact / 组内并发组间串行 /throttle,真机验证过 3-master HA k8s - 🖥️ Web 看板 —
crater ui:部署状态/漂移检测,verify / plan / heal / delete 后台任务流 + 日志面板,token 鉴权,htmx 内嵌离线可用 - 🔐 安全默认 — SSH host key 校验(TOFU 钉
~/.crater/known_hosts)、build/apply 参数分治 gate(冻结闭包不可被 apply 篡改) - 🤖 AI 副驾不司机 —
crater ai "大白话"生成 task,引擎确定性校验;crater doctor离线规则诊断
从 Release 下载(musl 静态,任何 Linux 直接跑):
curl -fLO https://github.com/weironz/crater/releases/latest/download/crater-linux-$(uname -m)
chmod +x crater-linux-$(uname -m) && sudo mv crater-linux-$(uname -m) /usr/local/bin/crater
crater --version| 资产 | 架构 | 说明 |
|---|---|---|
crater-linux-x86_64 |
x86_64 | 真机久经验证 |
crater-linux-aarch64 |
ARM64(鲲鹏/飞腾/Graviton/树莓派) | qemu 冒烟通过,ARM 真机验证欢迎反馈 |
从源码构建:
git clone https://github.com/weironz/crater && cd crater
cargo build --release # → target/release/crater
scripts/build-musl.sh all # 双架构 musl 静态 → dist/crater apply install-yq.yaml # 本机
crater apply yq --host 10.0.0.5,10.0.0.6 --password *** # 少量机器(共用凭据)
crater apply yq -i inventory.yaml # 机群(各自凭据,crater create inventory 生成)
crater plan yq -i inventory.yaml # 先看会变什么(零执行)
crater delete yq -i inventory.yaml # 卸载(task 自带 teardown 才可用,opt-in)task 长这样——纯数据,没有模板逻辑:
name: install-yq
hosts: all
vars:
version: "4.44.3"
materials: # 物料闭包:build 据此打离线包,不扫 actions
- name: yq-bin
kind: file
arch: amd64
url_tmpl: "https://github.com/mikefarah/yq/releases/download/v{{version}}/yq_linux_amd64"
actions:
- id: install
action: copy # 三选一来源:content(内联)/ src(本地文件)/ material(物料)
material: yq-bin
dest: /usr/local/bin/yq
mode: "0755"
- id: verify
action: shell
phase: verify
cmd: "yq --version"
needs: [install]# demo-stack.yaml —— project:有序编排多个 task
name: demo-stack
plays:
- { name: 装 yq, source: yq, hosts: all }
- { name: 部署 rustfs, source: rustfs, hosts: all }# 构建机(在线)
crater build -f demo-stack.yaml # 逐 play 构建,play source 锁定为制品 ref
crater save crater/demo-stack:latest -o demo-stack.oci # 项目 + 全部 task 闭包 → 一个文件
# 离线现场(零联网)
crater apply demo-stack.oci -i inventory.yaml # 按 play 顺序 recipe-replay
crater delete demo-stack.oci -i inventory.yaml # 逆序卸载
# 或者走私有 registry(zot / Harbor)
crater tag crater/demo-stack:latest reg:5000/demo-stack:1
crater push reg:5000/demo-stack:1 # 闭包 push:task 制品一起走
crater pull reg:5000/demo-stack:1 # 另一台控制机:闭包 pull
crater apply reg:5000/demo-stack:1 --offline -i inventory.yaml| 类别 | 命令 |
|---|---|
| 部署 | apply plan delete(source:task 文件 / 裸名 / project / .oci / 镜像 ref) |
| 离线打包 | build(--set k=v 覆盖、源指纹缓存、--no-cache)· save · load |
| 制品库 | images pull push tag rmi gc inspect registry login |
| 状态 | task list/show/history(--verify 漂移检测)· ui(看板,--token 鉴权) |
| 工具 | run(临时命令)· cp(推文件)· doctor(离线诊断)· ai · create inventory |
crater/
├── crates/
│ ├── crater-core/ # 引擎:task / engine(模块 lowering)/ executor(SSH)/ bundle / store
│ └── crater-cli/ # `crater` 二进制(同一个二进制也是目标机上的 agent)
├── library/ # 交付库:每个子目录一个自闭环交付(yq/ docker/ rustfs/ zot/ k8s/ …)
├── docs/
│ ├── features/ # 功能文档(每功能一篇:介绍 + demo + 真机验证)
│ ├── modules/ # 模块参考(每模块一篇)
│ ├── decisions.md # 架构决策记录(ADR,D-001 起持续追加)
│ └── module-charter.md # 模块准入章程(shell → role → 模块的晋升路径)
└── scripts/build-musl.sh # 静态二进制构建(x86_64 / aarch64 / all)
设计北极星见 docs/design.md:YAML 是数据、逻辑在引擎(D-036)、引擎零产品知识(D-017)——加一个可部署对象 = 写一个 task,绝不改 Rust。