#自动化 #部署 #SSH #DevOps #基础设施

roguewave

一种命令式远程服务器自动化工具

1个不稳定版本

0.1.0 2024年8月22日

#1103网络编程

MIT/Apache

47KB
886

roguewave

roguewave是一种命令式远程服务器自动化工具。它允许您创建部署脚本并自动化重复的管理任务。

与许多现有工具相比,roguewave并非基于声明性描述和配置文件。它是一个以代码为先的工具,您可以使用Rust代码描述您实施的任何流程。这为您提供了清晰的流程控制,显式的上下文传递,简单的代码去重以及使用现代高级语言带来的许多其他好处。这也使得部署和服务器配置对开发人员更加友好。

roguewave没有提供很多内置功能。现有的内置功能更像是一个起点或您可以实现的功能的示例,并且它们对远程系统的一些假设并非普遍适用(例如,root访问权限,sudoapt的可用性)。然而,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