7 个版本 (破坏性更新)

0.10.0 2023年5月1日
0.9.0 2022年4月4日
0.8.0 2022年3月31日
0.7.0 2022年3月29日
0.3.0 2022年3月27日

#2472命令行工具

每月 31 次下载

MIT 许可证

61KB
1K SLoC

tricorder

以简洁的方式自动化。

Crates.io Crates.io Crates.io docs.rs website

简介

Ansible 是一个优秀的自动化工具。但它与许多此类工具一样,存在同样的问题:一大堆自定义 YAML DSL。

YAML 用于提供自动化工作流的声明性语法。这对于简单的用例来说很好,但自动化很快就会变得相当复杂。

但是一旦这些工具开始实现

  • 控制流结构(条件、循环)
  • 变量分配
  • 模块
  • 包管理
  • ...

您的 YAML 文件就变成了一个具有糟糕开发者体验的编程语言。

tricorder 旨在解决这个问题。它提供了一个工具来在多个远程设备上执行任务。然后您可以使用常见的 UNIX 工具,如 bashjqcurl 等,将这些任务组合在一起。

用法

Ansible 一样,tricorder 使用一个清单文件,列出要连接的主机

[[hosts]]

id = "backend"
tags = ["server", "backend", "myapp"]
address = "10.0.1.10:22"
user = "admin"

[[hosts]]

id = "frontend"
tags = ["server", "frontend", "myapp"]
address = "10.0.1.20:22"
user = "admin"

注意:清单是一个 TOML 文件或生成 JSON 输出的可执行文件。这样,您可以通过查询远程服务或数据库来创建动态清单。

然后,运行以下命令之一

$ tricorder -i /path/to/inventory do -- echo "run on all hosts"
$ tricorder -i /path/to/inventory -H backend do -- echo "run on specific host"
$ tricorder -i /path/to/inventory -t "server & myapp" do -- echo "run on all hosts matching tags"

或并发运行而不是顺序运行

$ tricorder -i /path/to/inventory do -p -- echo "run on all hosts"
$ tricorder -i /path/to/inventory -H backend do -p -- echo "run on specific host"
$ tricorder -i /path/to/inventory -t "server & myapp" do -p -- echo "run on all hosts matching tags"

注意:身份验证仅通过 ssh-agent 完成。

每个日志消息都写入 stderr,每个主机的命令结果作为 JSON 文档写入 stdout

[
  {
    "host": "backend",
    "success": false,
    "error": "..."
  },
  {
    "host": "frontend",
    "success": true,
    "info": {
      "exit_code": 0,
      "stdout": "...",
      "stderr": "...",
    }
  }
]

这样,您可以使用 jq 将此工具与脚本组合在一起以提取相关信息。

使用 Rust API 的用法

tricorder 还可以作为 Rust 包直接包含在您的软件中

use tricorder::prelude::*;
use tricorder::tasks::exec;
use serde_json::json;

let inventory = Inventory::new()
  .add_host(
    Host::new(Host::id("localhost").unwrap(), "localhost:22".to_string())
      .set_user("root".to_string())
      .add_tag(Host::tag("local").unwrap())
      .set_var("msg".to_string(), json!("hello"))
      .to_owned()
  )
  .to_owned();

let task = exec::Task::new("echo \"{host.id} says {host.vars.msg}\"".to_string());

// Run the task sequentially:
let result = inventory.hosts.run_task_seq(&task).unwrap();
// Run the task concurrently:
let result = inventory.hosts.run_task_parallel(&task).unwrap();

println!("{}", result);

文档

有关更多信息,请参阅 文档

路线图

查看 问题跟踪器

许可证

本软件根据以下条款发布:MIT 许可协议

依赖项

约14MB
约229K SLoC