Warning
Jackadi is currently in an alpha. You're welcome to try it out and give feedback.
Jackadi is a developer-first distributed task execution platform designed for developers with a plugin system. Jackadi is client/server based.
The main motivation is to create a framework where developers write tasks as pure code without abstractions or hidden behaviors. Task writing is meant to be natural and direct.
Key principles:
- Pure Go Approach: Tasks are written as Go code with no hidden behaviors - what you write is what you get.
- No Runtime Dependencies: Tasks have no runtime dependencies on other tasks; all dependencies are resolved at compile-time.
- No Abstractions: Task writing is natural for Go developers with minimal framework-specific knowledge needed.
- Flexible Use Cases: From simple package installation to complex workflows like server management and upgrades.
| Feature | Description |
|---|---|
| Distributed Task Execution | Execute tasks across multiple nodes from a central manager. |
| Plugin System | Extend functionality through custom Go plugins. |
| Advanced Targeting | Target nodes via list, glob, regex, advanced query. |
| Specs Collection | Gather and store system information from nodes. |
| Security | mTLS, node acceptance workflow, protection against rogue nodes. |
| Developer-Friendly | Tasks/specs are Go function registered with a simple SDK. |
| Web API | Integrate Jackadi with your infrastructure stack. |
Full documentation can be found here.
In a nutshell:
- Nodes are connected to a manager via persistent bidirectional gRPC.
- Simple plugin system:
- All tasks and specs collectors are pure Go functions.
- The plugin system is based on hashicorp/go-plugin.
- The SDK is simple and easy to use.
- Tasks results are stored in a local BadgerDB.
# Start the manager
manager --mtls=false
# Start an node
node --id="node1" --mtls=false
# Accept the node connection (if not using auto-accept)
jack nodes list
jack nodes accept node1
# The node should be now in "accepted" list
jack nodes list
# Check nodes health
jack nodes health
# Run a task
jack run node1 cmd.run "echo hello"package main
import "github.com/kpetremann/jackadi/sdk"
func Hello(name string) (string, error) {
return fmt.Sprintf("Hello %s!", name), nil
}
func main() {
tour := sdk.New("tour")
tour.MustRegisterTask("hello", Hello).WithDescription("Greetings.")
sdk.MustServe(tour)
}CGO_ENABLED=0 go build -o tour .Copy the file in the manager /opt/jackadi/plugins directory.
Then configure /etc/jackadi/plugins.yaml file:
"*":
- tourjack run node1 plugins.syncjack run node1 tour.hello