阅读量:3
在 Linux 中用 Rust 做自动化运维的实战路线
一、环境准备与工具链自动化
- 使用 rustup 非交互式安装与标准化环境:设置 RUSTUP_HOME/CARGO_HOME、选择默认工具链、添加常用目标(如 x86_64-unknown-linux-musl 用于静态二进制),并配置国内镜像加速下载。
- 在 CI/CD 中一键拉起环境:安装 stable、将 $CARGO_HOME/bin 加入 PATH,随后执行 cargo build --release 产出产物。
- 团队标准化:通过 rust-toolchain 文件与 .cargo/config.toml 固化工具链、目标、镜像与构建参数,保证开发、测试、生产一致。
- 常用命令速览:
- 安装工具链:rustup toolchain install 1.70.0;切换默认:rustup default 1.70.0
- 添加目标:rustup target add x86_64-unknown-linux-musl
- 交叉编译:cargo build --target x86_64-unknown-linux-musl --release
- 健康检查:rustup show;rustup check;cargo --version;rustc --version
二、核心能力选型与最小示例
- 能力选型
- 远程执行与编排:ssh2(同步)、tokio(异步运行时)、并发任务编排
- 数据处理与配置:serde/serde_json、config
- 系统信息采集:读取 /proc、调用 std::process::Command
- 服务化与发布:内置 HTTP 服务、对接 systemd、容器化
- 最小示例一 远程命令执行(基于 ssh2)
- 依赖 Cargo.toml
- [dependencies]
- ssh2 = “0.9”
- 代码片段
- use ssh2::Session; use std::net::TcpStream; fn main() -> anyhow::Result<()> { let tcp = TcpStream::connect(“192.0.2.10:22”)?; let mut sess = Session::new()?; sess.set_tcp_stream(tcp); sess.handshake()?; sess.userauth_password(“user”, “pass”)?; let mut chan = sess.channel_session()?; chan.exec(“uname -a”)?; let mut s = String::new(); chan.read_to_string(&mut s)?; println!(“{}”, s); Ok(()) }
- 依赖 Cargo.toml
- 最小示例二 读取本机 CPU 使用(读取 /proc/stat)
- 代码片段
- use std::fs::File; use std::io::{BufRead, BufReader}; fn main() -> std::io::Result<()> { let file = File::open(“/proc/stat”)?; for line in BufReader::new(file).lines() { let l = line?; if l.starts_with("cpu ") { let parts: Vec<&str> = l.split_whitespace().collect(); let user: u64 = parts[1].parse()?; let nice: u64 = parts[2].parse()?; let system: u64 = parts[3].parse()?; let idle: u64 = parts[4].parse()?; println!(“CPU Usage: user={} nice={} system={} idle={}”, user, nice, system, idle); break; } } Ok(()) }
- 代码片段
- 最小示例三 内置 HTTP 服务(基于 hyper)
- 依赖 Cargo.toml
- [dependencies]
- hyper = { version = “1”, features = [“full”] }
- 代码片段
- use hyper::{Body, Request, Response, Server};
use hyper::service::{make_service_fn, service_fn};
async fn handle(_req: Request) -> Result
, hyper::Error> { Ok(Response::new(Body::from(“Hello, Rust Ops”))) } #[tokio::main] async fn main() { let addr = ([0, 0, 0, 0], 3000).into(); let make_svc = make_service_fn(|conn| async { Ok::<, hyper::Error>(service_fn(handle)) }); Server::bind(&addr).serve(make_svc).await.unwrap(); }
- use hyper::{Body, Request, Response, Server};
use hyper::service::{make_service_fn, service_fn};
async fn handle(_req: Request) -> Result
- 依赖 Cargo.toml