Jackadi is a developer-first distributed task execution platform designed for developers with a plugin system architecture consisting of a manager and agents.
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 agents from a central manager. |
Plugin System | Extend functionality through custom Go plugins. |
Advanced Targeting | Target agents via list, glob, regex, advanced query. |
Specs Collection | Gather and store system information from agents. |
Security | mTLS, agent acceptance workflow, protection against rogue agents. |
Developer-Friendly | Tasks/specs are Go function registered with a simple SDK. |
SONiC ready | Developed with SONiC network devices in mind. |
Full documentation can be found here.
In a nutshell:
- Agents 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 agent
agent --id="agent1" --mtls=false
# Accept the agent connection (if not using auto-accept)
jack agents list
jack agents accept agent1
# The agent should be now in "accepted" list
jack agents list
# Check agents health
jack agents health
# Run a task
jack run agent1 cmd:run "echo hello"
package main
import "github.com/jackadi-io/jackadi/sdk"
func Hello(name string) (string, error) {
return fmt.Sprintf("Hello %s!", name), nil
}
func main() {
tour := sdk.NewCollection("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.
jack run agent1 plugins:sync