Crates.io | tricorder |
lib.rs | tricorder |
version | 0.10.0 |
source | src |
created_at | 2022-03-27 23:36:32.651881 |
updated_at | 2023-05-01 21:53:21.624611 |
description | Automation, the KISS way, no YAML involved. |
homepage | https://linkdd.github.io/tricorder/ |
repository | https://github.com/linkdd/tricorder |
max_upload_size | |
id | 557486 |
size | 90,271 |
Automation the KISS way.
Ansible is a great tool for automation. But it suffers from the same problem of many such tools: a big pile of custom YAML DSL.
YAML is used to provide a declarative syntax of your automated workflow. This is nice for simple use cases, but automation can become rather complex very quickly.
But once those tools start implementing:
Your YAML files become a programming language with terrible developer experience.
tricorder aims to fix this. It gives you a single tool to perform tasks on
multiple remotes. You then use your common UNIX tools like bash
, jq
, curl
,
etc... to compose those tasks together.
Just like Ansible, tricorder uses an inventory file, listing the hosts to connect to:
[[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"
NB: The inventory is either a TOML file or an executable producing a JSON output. This way you can create dynamic inventories by querying a remote service or database.
Then, run one of the following commands:
$ 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"
Or to run concurrently instead of sequencially:
$ 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"
NB: Authentication is done via
ssh-agent
only.
Every logging messages is written on stderr
, the command result for each host
is written as a JSON document on stdout
:
[
{
"host": "backend",
"success": false,
"error": "..."
},
{
"host": "frontend",
"success": true,
"info": {
"exit_code": 0,
"stdout": "...",
"stderr": "...",
}
}
]
This way, you can compose this tool with jq
to extract the relevant informations
in your scripts.
tricorder is also available as a Rust crate to include it directly in your software:
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);
For more informations, consult the documentation.
Checkout the Bug Tracker.
This software is released under the terms of the MIT License.