Rust在Linux系统自动化运维中的应用
一、优势与适用场景
二、核心能力模块与常用库
| 能力模块 | 常用库 | 典型用途 |
|---|---|---|
| 远程执行与批量编排 | ssh2-rs | 通过SSH在多台主机上执行命令、传输文件、批量变更 |
| 异步运行时 | tokio / async-std | 并发巡检、并行拉取指标、非阻塞I/O |
| 配置与数据序列化 | config / serde / serde_json | 多环境配置、JSON API 对接、结构化日志 |
| 系统监控与指标 | rust-psutil | 采集CPU、内存、磁盘、进程等指标,做阈值告警与健康检查 |
| systemd 集成 | libsystemd-rs | 与systemd交互:服务就绪通知、状态查询、日志对接 |
| 服务自愈与平滑升级 | axum + graceful shutdown | 运维自研HTTP API/调度器,支持USR1触发的平滑重启 |
| 命令行与交互 | clap | 构建带子命令的CLI,参数校验、自动补全、帮助文档 |
| 嵌入式静态资源 | embed-file | 将配置/模板/脚本打包进二进制,便于分发与单文件部署 |
三、实战示例
示例一 远程批量执行命令(基于ssh2-rs)
[dependencies]
ssh2 = "0.9"
tokio = { version = "1", features = ["full"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
config = "0.11"
{
"address": "192.168.1.100:22",
"username": "your_username",
"password": "your_password"
}
use ssh2::Session;
use std::net::TcpStream;
use serde::Deserialize;
#[derive(Deserialize)]
struct ServerConfig {
address: String,
username: String,
password: String,
}
fn main() -> anyhow::Result<()> {
let cfg: ServerConfig = serde_json::from_str(include_str!("config.json"))?;
let tcp = TcpStream::connect(&cfg.address)?;
let mut sess = Session::new()?;
sess.set_tcp_stream(tcp);
sess.handshake()?;
sess.userauth_password(&cfg.username, &cfg.password)?;
let mut chan = sess.channel_session()?;
chan.exec("uname -a")?;
let mut s = String::new();
chan.read_to_string(&mut s)?;
println!("{}", s);
Ok(())
}
说明:生产环境建议使用SSH 密钥、禁用口令登录,并配合tokio并发对多台主机执行。
示例二 采集本机指标并上报(基于rust-psutil)
[dependencies]
psutil = "3.2.1"
serde_json = "1.0"
use psutil::cpu::cpu_percent;
use psutil::memory::virtual_memory;
use serde_json::json;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let cpu = cpu_percent()?.unwrap_or(0.0);
let mem = virtual_memory()?;
let payload = json!({
"cpu_percent": cpu,
"mem_total": mem.total(),
"mem_available": mem.available(),
"mem_used_percent": mem.percent(),
});
println!("{}", serde_json::to_string_pretty(&payload)?);
Ok(())
}
说明:可按需扩展为定时采集 + HTTP 上报,或对接Prometheus Pushgateway。
四、服务化与运维实践
// Cargo.toml
[dependencies]
libsystemd = "0.7"
// 代码片段
use libsystemd::daemon::{booted, notify};
if !booted() { panic!("Not running under systemd"); }
notify(true, &[libsystemd::daemon::NotifyState::Ready]).expect("notify failed");
五、落地路线图