1个不稳定版本
新 0.1.0 | 2024年8月22日 |
---|
#1103 在 网络编程
47KB
886 行
roguewave
roguewave
是一种命令式远程服务器自动化工具。它允许您创建部署脚本并自动化重复的管理任务。
与许多现有工具相比,roguewave
并非基于声明性描述和配置文件。它是一个以代码为先的工具,您可以使用Rust代码描述您实施的任何流程。这为您提供了清晰的流程控制,显式的上下文传递,简单的代码去重以及使用现代高级语言带来的许多其他好处。这也使得部署和服务器配置对开发人员更加友好。
roguewave
没有提供很多内置功能。现有的内置功能更像是一个起点或您可以实现的功能的示例,并且它们对远程系统的一些假设并非普遍适用(例如,root访问权限,sudo
和apt
的可用性)。然而,roguewave
本身可以用于提供SSH和SFTP访问权限的任何远程系统。
用户应鼓励创建和重用适合他们目的的实用函数,而不是完全依赖内置功能。这些实用函数可以与他人共享作为Rust crates,或建议合并到roguewave
中。
入门
首先,确保您可以通过SSH无密码连接到您的服务器。通常,您可以通过设置密钥对身份验证并将您的密钥添加到ssh-agent来实现这一点。接下来,您可以创建一个类似于以下内容的roguewave
会话
use roguewave::Session;
use std::env;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
if env::var("RUST_LOG").is_err() {
env::set_var("RUST_LOG", "info");
}
env_logger::init(); // initialize logger
let mut session = Session::connect("username@hostname").await?;
//...
Ok(())
}
Session
句柄提供了对内置辅助函数的访问
session.apt().install(&["nginx"]).await?;
session.create_user("alice").await?;
session.fs().write("/home/username/.bashrc", "export PAGER=less\n").await?;
您还可以运行任意命令
session.command(["systemctl", "restart", "nginx"]).run().await?;
let uname = session.command(["uname", "-a"]).run().await?.stdout;
扩展roguewave
编写自定义辅助函数的最简单方法是创建一个函数
use roguewave::Session;
async fn setup_user(session: &mut Session, name: &str) -> anyhow::Result<()> {
session.create_user(name).await?;
let home_dir = session.home_dir(Some(name)).await?;
session.upload(["important_file.txt"], &home_dir, Some(name)).await?;
Ok(())
}
您可以通过创建扩展特质来创建更友好的接口
use roguewave::Session;
#[async_trait::async_trait]
pub trait SetupUser {
async fn setup_user(&mut self, name: &str) -> anyhow::Result<()>;
}
#[async_trait::async_trait]
impl SetupUser for Session {
async fn setup_user(&mut self, name: &str) -> anyhow::Result<()> {
todo!()
}
}
或者,您还可以创建一个结构体,该结构体提供对多个辅助函数的访问
use roguewave::Session;
pub struct Cron<'a>(&'a mut Session);
pub trait GetCron {
fn cron(&mut self) -> Cron;
}
impl GetCron for Session {
fn cron(&mut self) -> Cron {
Cron(self)
}
}
impl Cron<'_> {
async fn add_task(&mut self, name: &str) -> anyhow::Result<()> {
todo!()
}
async fn remove_task(&mut self, name: &str) -> anyhow::Result<()> {
todo!()
}
}
许可协议
根据您的选择,本软件受以下任一许可证的许可:Apache许可证第2.0版或MIT许可证。除非您明确表示,否则您有意提交的任何贡献,根据Apache-2.0许可证的定义,均应按上述方式双许可,不附加任何额外条款或条件。
依赖项
约9-20MB
约302K SLoC