34 个版本

0.11.1 2021 年 3 月 15 日
0.11.0-beta.102020 年 10 月 20 日
0.11.0-beta.92020 年 7 月 29 日
0.11.0-beta.32020 年 3 月 16 日
0.5.10 2018 年 3 月 30 日

#1297 in 开发工具

MIT/Apache

140KB
2.5K SLoC

tsunami

Crates.io Documentation Build Status

tsunami 提供在云实例上运行一次性作业的接口。

想象一下,你需要在 AWS 上运行一个涉及四种不同类型机器的实验。或者 Azure 上。每个都需要以特定的方式设置。也许一个是服务器,两个是负载生成客户端,另一个是某种监控器。你希望使用自定义 AMI 在不同地区启动它们,然后在它们全部启动和运行后运行一些基准测试。

这个工具包使这一切变得非常简单。

你说明你想要的机器,库会处理其余部分。它使用云服务的 API 以适当的方式启动机器,并在设置可用时提供 [ssh 连接]。当所有机器都可用时,你可以一步连接到它们所有,然后运行你的分布式作业。当你完成时,tsunami 会为你拆除一切。而且我提到它甚至支持 AWS spot 实例,所以它甚至能帮你省钱吗?

这个魔法是如何工作的?看看这个例子

use azure::Region as AzureRegion;
use rusoto_core::{credential::DefaultCredentialsProvider, Region as AWSRegion};
use tsunami::Tsunami;
use tsunami::providers::{aws, azure};
#[tokio::main]
async fn main() -> Result<(), color_eyre::Report> {
    // Initialize AWS
    let mut aws = aws::Launcher::default();
    // Create an AWS machine descriptor and add it to the AWS Tsunami
    aws.spawn(
        vec![(
            String::from("aws_vm"),
            aws::Setup::default()
                .region_with_ubuntu_ami(AWSRegion::UsWest1) // default is UsEast1
                .await
                .unwrap()
                .setup(|vm| {
                    // default is a no-op
                    Box::pin(async move {
                        vm.ssh.command("sudo")
                            .arg("apt")
                            .arg("update")
                            .status()
                            .await?;
                        vm.ssh.command("bash")
                            .arg("-c")
                            .arg("\"curl https://sh.rustup.rs -sSf | sh -- -y\"")
                            .status()
                            .await?;
                        Ok(())
                    })
                }),
        )],
        None,
    )
    .await?;

    // Initialize Azure
    let mut azure = azure::Launcher::default();
    // Create an Azure machine descriptor and add it to the Azure Tsunami
    azure
        .spawn(
            vec![(
                String::from("azure_vm"),
                azure::Setup::default()
                    .region(AzureRegion::FranceCentral) // default is EastUs
                    .setup(|vm| {
                        // default is a no-op
                        Box::pin(async move {
                            vm.ssh.command("sudo")
                                .arg("apt")
                                .arg("update")
                                .status()
                                .await?;
                            vm.ssh.command("bash")
                                .arg("-c")
                                .arg("\"curl https://sh.rustup.rs -sSf | sh -- -y\"")
                                .status()
                                .await?;
                            Ok(())
                        })
                    }),
            )],
            None,
        )
        .await?;

    // SSH to the VMs and run commands on it
    let aws_vms = aws.connect_all().await?;
    let azure_vms = azure.connect_all().await?;

    let vms = aws_vms.into_iter().chain(azure_vms.into_iter());

    // do amazing things with the VMs!
    // you have access to things like ip addresses for each host too.

    // call terminate_all() to terminate the instances.
    aws.terminate_all().await?;
    azure.terminate_all().await?;
    Ok(())
}

实时编码

这个工具包的早期版本是作为针对已熟悉 Rust 且想看到更大、更复杂的构建的用户的实时编码流系列的一部分编写的。您可以在 YouTube 上找到过去会议的录音 在这里

许可证

根据以下任一许可证授权:

您自行选择。

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义的,您提交的任何旨在包含在作品中的贡献,将根据上述许可双授权,而无需任何附加条款或条件。

依赖关系

~9-29MB
~402K SLoC