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 |
|
#2472 在 命令行工具
每月 31 次下载
61KB
1K SLoC
tricorder
以简洁的方式自动化。
简介
Ansible 是一个优秀的自动化工具。但它与许多此类工具一样,存在同样的问题:一大堆自定义 YAML DSL。
YAML 用于提供自动化工作流的声明性语法。这对于简单的用例来说很好,但自动化很快就会变得相当复杂。
但是一旦这些工具开始实现
- 控制流结构(条件、循环)
- 变量分配
- 模块
- 包管理
- ...
您的 YAML 文件就变成了一个具有糟糕开发者体验的编程语言。
tricorder 旨在解决这个问题。它提供了一个工具来在多个远程设备上执行任务。然后您可以使用常见的 UNIX 工具,如 bash
、jq
、curl
等,将这些任务组合在一起。
用法
与 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