用 Rust 落地 Linux 自动化运维的实战路线
一 适用场景与优势
二 环境准备与工具链自动化
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --default-toolchain stable -ysource "$HOME/.cargo/env"rustup toolchain install 1.70.0、rustup default 1.70.0、rustup component add clippy rustfmtrustup target add x86_64-unknown-linux-muslcargo build --release --target x86_64-unknown-linux-musl三 核心能力选型与最小示例
ssh2(同步)、tokio(异步运行时)、并发任务编排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(())
}
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(())
}
hyper = { version = "1", features = ["full"] }use hyper::{Body, Request, Response, Server};
use hyper::service::{make_service_fn, service_fn};
async fn handle(_req: Request<Body>) -> Result<Response<Body>, 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 service_manager::*;
use std::ffi::OsString;
use std::path::PathBuf;
fn main() -> anyhow::Result<()> {
let label: ServiceLabel = "my-rust-app.service".parse()?;
let manager = <dyn ServiceManager>::native()?;
manager.install(ServiceInstallCtx {
label: label.clone(),
program: PathBuf::from("/opt/app/your_app"),
args: vec![OsString::from("--config"), OsString::from("/etc/app.yaml")],
})?;
manager.start(ServiceStartCtx { label })?;
Ok(())
}
四 部署与运行
cargo build --release(或 musl 静态构建:cargo build --release --target x86_64-unknown-linux-musl)scp target/release/your_app user@host:/opt/app/your_appchmod +x /opt/app/your_app[Unit]
Description=Your Rust App
After=network.target
[Service]
User=app
ExecStart=/opt/app/your_app
Restart=always
Environment=ENV=prod
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload、sudo systemctl enable --now your_app、sudo journalctl -u your_app -fnohup /opt/app/your_app &五 安全与最佳实践
cargo update,关注 RustSec 公告,及时修复依赖漏洞。